Ubuntu 16.04内核4.4.0-21无法加载nvidia/vboxdrv模块(所需密钥不可用)。

最新的Ubuntu 16.04内核(4.4.0-21)不再加载nvidia(和vboxdrv)模块。
$ sudo modprobe -v nvidia
insmod /lib/modules/4.4.0-21-generic/updates/dkms/nvidia_361.ko 
modprobe: ERROR: could not insert 'nvidia_361': Required key not available

使用4.4.0-18版本仍然可以正常工作。发生了什么变化?我该如何解决这个问题?

34.4.0-21 已启用 CONFIG_EFI_SECURE_BOOT_SIG_ENFORCE。我猜那就是问题所在。 - user534566
4真是令人惊讶,这在LTS版本的中途被更改了。如果您的驱动程序在常规更新期间停止工作,那么运行“稳定”发行版的意义何在! - Aleksandr Dubinsky
2个回答

有一种方法可以保持安全启动并使用像NVidia或VirtualBox这样的专有内核模块。首先下载xca应用程序:
sudo apt install xca

然后创建新数据库并生成新密钥。接下来使用该私钥生成CA证书。将私钥导出为PEM格式,将CA公共证书导出为DER格式。将CA证书导入MOK数据库。
sudo mokutil --import CAcert.cer

程序会要求您输入MOK数据库的密码。在重新启动之前,将执行MOKManager以及GRUB之前。选择“注册密钥”,选择之前添加的证书,并输入确认密码。之后,您的CA证书将被添加到MOK数据库中。重新启动。
接下来,在内核头文件脚本目录中找到sign-file程序。对于我来说,它位于:
/usr/src/linux-headers-4.4.0-22-lowlatency/scripts/sign-file

现在签署所有内核模块在/lib/modules/4.4.0-22-lowlatency/updates/dkms/。例如:
/usr/src/linux-headers-4.4.0-22-lowlatency/scripts/sign-file sha256 CA.pem CAcert.cer /lib/modules/4.4.0-22-lowlatency/updates/dkms/nvidia_361.ko

在那之后,您将能够加载模块而不会出现"Required key not available"的错误。

安装新内核或从dkms目录安装新版本模块内核后,您必须重复签名过程。

阅读以下链接以进行进一步澄清:

https://wiki.ubuntu.com/SecurityTeam/SecureBoot

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sect-signing-kernel-modules-for-secure-boot.html


内核漏洞#1571691有答案
sudo apt-get install mokutil; sudo mokutil --disable-validation

2还是不起作用 - QkiZ
@QkiZ 看一下这个链接 https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1571691/comments/5 你应该忽略Failed to request new MokSB state错误并重新启动你的机器。 - Aleksandr Dubinsky
我可以处理这个问题。请看我的答案。 - QkiZ
@QkiZ 是的,但你的回答概述了每次内核更新都必须重复的冗长而复杂的方法。这个回答是更简单的捷径。目前它还不能工作,但希望能够修复。 - Aleksandr Dubinsky
有点复杂,但它保留了安全启动(比你们的方式更安全)。可以通过脚本自动化。只有在更改内核或模块版本后才需要重复我的方式的签名部分。所以你可以选择:安全还是轻松生活。 - QkiZ