Ubuntu 18.04 安装 Intel 9560 无线网卡驱动

Posted by Xiphoray on Apr 28, 2020

之前趁学生机的优惠入了一台 ThinkPad X1 Carbon Gen7,当时就想装双系统的。但无奈机器太新,Ubuntu 系统中没有即用的驱动,网上也没找到,只好作罢。

最近学习需要只好再次尝试,发现只有 Wi-Fi 不能用,显示找不到 Wi-Fi 适配器。网上查找了一下,发现因为它用的是 Intel 9560 AC 无线网卡,是直接焊在主板上的。我装的 Ubuntu 18.04 系统没有即用的驱动,所以需要手动去编译一个驱动。

提前准备

首先确定系统安装完全。我的 Ubuntu 18.04 系统就因为驱动不完善所以没有安装完全,甚至 gcc 这类编译必需品都没有。

其次得确定能通过有线或者蓝牙连上网。ThinkPad X1 Carbon Gen7 的网线口是需要转接线的,我刚好忘记带了,于是用手机的 USB 线给电脑供网。另外使用蓝牙给电脑供网也是可以的,因为蓝牙的驱动比较单一,一般也是能装上的。不过我用蓝牙连接的时候经常断,也不知道是什么原因。当然,如果实在连不上网,只能通过别的电脑将所有安装包都下好,再放在本地离线安装了。

最后,要在 BIOS 中关闭 secure boot。

编译驱动

编译驱动需要安装最基本的编译工具链:

sudo apt-get install build-essential git

然后进行编译并安装:

sudo apt update
sudo apt install git build-essential
git clone https://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/backport-iwlwifi.git
cd backport-iwlwifi/
make defconfig-iwlwifi-public
sed -i 's/CPTCFG_IWLMVM_VENDOR_CMDS=y/# CPTCFG_IWLMVM_VENDOR_CMDS is not set/' .config
make -j$(nproc)
sudo make install
sudo modprobe iwlwifi

此时如果没有开启 secure boot,则无线网卡已经可以正常工作。

驱动签名

因为没有安全需求,我并没有试过这部分。

如果需要开启 secure boot,那么如果此时执行 sudo modprobe iwlwifi 则可能会无法正常执行,你将会看到如下警告:

modprobe: ERROR: could not insert 'iwlwifi': Operation not permitted

由于 secure boot 开启时系统禁止加载所有无签名的驱动,因此需要对这些驱动进行签名。

首先,生成签名用的证书:

name="Kernel Modules Signing"
out_dir='/root/module-signing'
sudo mkdir ${out_dir}
sudo openssl \
    req \
    -new \
    -x509 \
    -newkey \    
    rsa:2048 \    
    -keyout ${out_dir}/MOK.priv \    
    -outform DER \    
    -out ${out_dir}/MOK.der \    
    -days 36500 \    
    -subj "/CN=${name}/"    
sudo chmod 600 ${out_dir}/MOK*

MOK 是 Machine-Owner Key 的缩写,通过添加 MOK 可以实现与 OEM 以及系统厂商一样的对驱动签名管理的能力。我们需要通过 mokutil 工具添加新生成的密钥。此处会需要两次输入管理密码,随后会在 MOK 的管理界面用到该密码。

sudo mokutil --import /root/module-signing/MOK.der

重启后系统会进入 MOK manager EFI utility。这是用来密钥的界面。

依次选择 Enroll MOK,Continue,Yes。然后输入之前输入的管理密码。最后选择 Reboot 重启。

你可以通过如下命令确认密钥的加入:

dmesg | grep '[U]EFI.*cert'

最后一步是对驱动签名,此处有如下的模块需要签名 iwlwifi, iwlmvm, compat, cfg80211, mac80211,因此需要执行如下命令:

cd /root/module-signing/ 
sudo /usr/src/linux-headers-$(uname -r)-generic/scripts/sign-file sha512 ./MOK.priv ./MOK.der $(modinfo -n iwlwifi)
sudo /usr/src/linux-headers-$(uname -r)-generic/scripts/sign-file sha512 ./MOK.priv ./MOK.der $(modinfo -n iwlmvm)
sudo /usr/src/linux-headers-$(uname -r)-generic/scripts/sign-file sha512 ./MOK.priv ./MOK.der $(modinfo -n compat)
sudo /usr/src/linux-headers-$(uname -r)-generic/scripts/sign-file sha512 ./MOK.priv ./MOK.der $(modinfo -n cfg80211)
sudo /usr/src/linux-headers-$(uname -r)-generic/scripts/sign-file sha512 ./MOK.priv ./MOK.der $(modinfo -n mac80211)

至此,驱动签名就已经完成了,你可以在开启 secure boot 的情况下使用 wifi。

参考资料

https://amefs.net/archives/2003.html

https://wiki.gentoo.org/wiki/Signed_kernel_module_support

https://wiki.debian.org/SecureBoot

https://askubuntu.com/questions/1196706/ubuntu-18-04-fail-to-load-intel-9560-wireless-firmware

https://gist.github.com/reillysiemens/ac6bea1e6c7684d62f544bd79b2182a4




Share