此问题仅发生在启用了安全启动的 UEFI 系统上。
当我尝试安装 DKMS 模块(如 VirtualBox、Nvidia 或 Broadcom 驱动程序)时,它们无法安装,而且Required key not available
当我尝试安装modprobe
它们时会出错。
VirtualBox 抱怨vboxdrv
未加载。
Broadcomwl
驱动程序显示lspci -k
为内核模块但未被使用。sudo modprobe wl
抛出Required key not available
。
当我从 git 源安装一些内核模块时也可能会发生这个问题。
内核更新后可能会出现此问题,例如禁用无线适配器、重启后黑屏等。
我该如何修复它?
答案1
自 Ubuntu 内核 4.4.0-20 起,EFI_SECURE_BOOT_SIG_ENFORCE
内核配置已启用。如果启用了 UEFI 安全启动,这将阻止加载未签名的第三方模块。
解决此问题的最简单方法是禁用安全启动在 UEFI(BIOS)设置中。
在大多数情况下,您可以使用 grub 菜单进入 UEFI 设置。按下ESC启动按钮,进入 grub 菜单并选择系统设置。安全启动选项应位于 UEFI 的“安全”或“启动”部分。
您可以直接进入 UEFI,但这取决于您的硬件。请阅读您的计算机手册以了解如何进入。它可能是Del,或F2在启动时,或其他。
另一种方法是使用 禁用安全启动mokutil
。
从 Ubuntu 内核版本 4.4.0-21.37 开始,可以通过运行以下命令来修复此问题
sudo apt install mokutil
sudo mokutil --disable-validation
需要创建一个密码。密码长度至少为 8 个字符。重启后,UEFI 会询问您是否要更改安全设置。选择“是”。
然后会要求您输入之前创建的密码。有些 UEFI 固件不要求输入完整密码,而是要求输入密码中的一些字符,如 1st、3rd 等。要小心。有些人不明白这一点。我第一次尝试也没有成功 ;-)
更新:现在,此内核配置已在所有受支持的 Ubuntu 内核中启用。Ubuntu 16.04、15.10 和 14.04 受到影响。
答案2
作为建议由用户 @zwets 复制(经过编辑)一个答案这里:
从内核版本 4.4.0-20 开始,未签名启用安全启动后,内核模块将不允许运行。如果你想保留安全启动和也运行这些模块,那么下一步就是符号那些模块。
那我们就尝试一下吧。
创建签名密钥
openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=Descriptive name/"
签署模块
sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der /path/to/module
注 1:单个驱动程序/模块可以有多个文件需要签名,因此/path/to/module
可能需要替换为$(modinfo -n <modulename>)
,例如$(modinfo -n vboxdrv)
笔记2:如果没有可用,则sudo kmodsign sha512 ./MOK.priv ./MOK.der /path/to/module
是一种替代方案。sign-file
将密钥注册到安全启动
sudo mokutil --import MOK.der
提供密码以供重启后使用
Reboot
并按照说明注册 MOK(机器所有者密钥)。以下是样本附有图片。系统将再次重新启动。
如果密钥已正确注册,它将显示在 下sudo mokutil --list-enrolled
。
请让我知道您的模块是否可以在 Ubuntu 16.04(我相信在内核 4.4.0-21)上以这种方式运行。
资源:详细网站Fedora 文章和Ubuntu 实现模块签名。 (他们一直在努力) ;-)
额外资源:我创建了一个 bash 脚本,供自己每次virtualbox-dkms
升级时使用,从而覆盖已签名的模块。查看我的vboxsign
最初在 GitHub 上。
对于有(额外)安全意识的人的补充说明:;-)
由于您创建的私钥(MOK.priv
在此示例中)可由任何有权访问它的人使用,因此最好保持其安全。您可以将其chmod
加密(gpg
)或存储在其他更安全的地方。或者,在此评论中指出,删除步骤1中的选项。-nodes
这将使用密码加密密钥。
答案3
您可以按照以下步骤在 BIOS 中禁用安全启动 (UEFI):
重新启动计算机并进入 BIOS 菜单(我的情况是按 F2)
搜索安全启动并更改为传统
在华硕主板中:
- 进入高级模式 (F7)
- 进入“启动”部分下的安全启动选项
- 将“Windows UEFI 模式”更改为“其他操作系统”
- 保存并重新启动以应用设置(F10)
答案4
如果你像我一样因为 Ubuntu 上的 VMWare Workstation 而来到这里,那么:
无法打开 dev vmmon:没有此文件或目录。请确保内核模块“vmmon”
我找到了解决办法来自 Edson Junior。当我试图逃跑时当我试图逃跑mokutil --import MOK.der
时官方 VMWare 说明我收到一条错误消息:
所需密钥不可用
Edson 的代码为我修复了两个错误:
# I noticed when I did this and when he did it two of the builds failed
$ sudo vmware-modconfig --console --install-all
$ openssl req -new -x509 -newkey rsa:2048 -keyout VMWARE15.priv -outform DER -out VMWARE15.der -nodes -days 36500 -subj "/CN=VMWARE/"
$ sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./VMWARE15.priv ./VMWARE15.der $(modinfo -n vmmon)
$ sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./VMWARE15.priv ./VMWARE15.der $(modinfo -n vmnet)
$ tail $(modinfo -n vmmon) | grep "Module signature appended"
$ sudo mokutil --import VMWARE15.der
now reboot
$ reboot
他还引用了 YouTube 视频这里