我在带有 4.4.0-57 内核的 Ubuntu 16.04 上,我想安装一个自制模块。BIOS 是非 UEFI BIOS (Kontron 986LCD-M/mITX)。
我尝试按照此过程对模块进行签名,但步骤 3 ( sudo mokutil --import MOK.der
) 的结果是EFI variables are not supported on this system
.
我试图按照这个食谱,但我找不到公钥。
如何在非 UEFI 板上签署模块?
==================================================== ==
更新 1:似乎只有使用 UEFI Bios 运行的模块才必须使用 16.04 下的签名模块:
I use as grub option: `GRUB_CMDLINE_LINUX=" acpi_enforce_resources=lax"`.
I get the error `module verification failed: signature and/or required key missing - tainting kernel` in dmesg if I try to load a module via modprobe.
`sudo mokutil --disable-validation` returns the error `EFI variables are not supported on this system`
================ 更新1 ================================ ===================
我很抱歉,但这个说法是错误的:
您参考的过程描述了禁用安全启动验证,而不是对模块进行签名。无需在非 UEFI 系统上签署内核模块,因为安全启动是 UEFI 独有的功能。
内核应该以这种方式工作,但事实并非如此。我体验它是因为我总是收到我error module verification failed: signature and/or required key missing - tainting kernel
在 dmesg 中收到的错误消息,并且内核没有加载。
================ 更新2 ================================ =================== 如何在非 uefi 主板上安装垫片:
# aptitude search shim
p grub-splashimages - a collection of great GRUB splashimages
p grub2-splashimages - a collection of great GRUB2 splashimages
p libjs-es5-shim - ECMAScript 5 compat. shims for old JavaScript engines (library
p libjs-es6-shim - ECMAScript 6 compat. shims for legacy JavaScript engines (libr
p node-es5-shim - ECMAScript 5 compat. shims for old JavaScript engines (Node.js
p node-es6-shim - ECMAScript 6 compat. shims for legacy JavaScript engines (Node
p olpc-kbdshim - Dienst zur OLPC-XO-Tastaturunterstützung
v olpc-kbdshim-common -
v olpc-kdbshim-hal -
p ruby-launchy-shim - helper class for launching a web browser
p shimmer-themes - Gtk+ themes from Shimmer Project
p shimmer-wallpapers - Wallpapers from Shimmer Project
p systemd-shim - shim für systemd
p yoshimi - Software-Synthesizer, basiert auf ZynAddSubFX
p yoshimi-data - Voreinstellungen für Yoshimi
是否systemd-shim
正确?我相信它不会起作用,因为它是非 UEFI MB ......
这是 Ubuntu 中的一个巨大错误。
mokutil
如果您拥有支持 uefi 的 MB ,MokManager
则只能签署您自己的模块。不支持 uefi 的 Ubuntu 16.04 下的旧 MB 无法使用mokutil
和对模块进行签名MokManager
。您将始终得到类似EFI variables are not supported on this system
或类似的响应。据称,内核刚刚为 uefi MB 启用了签名。我很抱歉,但这是错误的。例如,这些内核参数也显示了这一点:
正如我所说,这是没有意义的非 uefi MB 的内核参数,尤其是
CONFIG_MODULE_SIG_UEFI=y
.您必须重新编译内核并关闭签名选项。它们可以通过 找到
grep -v ^# /boot/config-$(uname -r) | grep _SIG
。特别是应该设置CONFIG_MODULE_SIG
为. 但是,这有一个明显的缺点,因为您必须暂停内核更新,并且必须重新编译每个新内核。这令人沮丧。CONFIG_MODULE_SIG_ALL
n
您参考的过程描述了禁用安全启动验证,而不是对模块进行签名。无需在非 UEFI 系统上签署内核模块,因为安全启动是 UEFI 独有的功能。
也就是说,如果您确实想在非 UEFI 系统上签署内核模块,您应该可以这样做。(我还没有尝试过,但是 AFAIK 所有的工具都是 Linux 用户空间工具,不依赖于可用或激活的安全启动。)如果你想构建一个带有签名模块的包以安装在其他系统上,你可以这样做。请注意,您需要在目标系统上安装自己的密钥,这可能很乏味;请参阅下面的指针。要签署内核模块:
sign-file
二进制文件。此二进制文件通常不会安装在安装 Linux 二进制文件的位置;相反,它带有内核头文件。find /usr/src/ -name sign-file
如果它安装在您的系统上,该命令应该找到它。如果此命令不返回任何内容,则必须安装内核头文件包。/path/to/sign-file sha256 /key/path/your.key /key/path/your.cer /path/to/module/module.ko
此时,二进制文件
module.ko
将使用您的密钥 (your.key
和your.cer
) 进行签名。要使用,您的密钥必须在目标系统中注册,大概在 MOK 列表中。为此,您必须使用 安装它MokManager.efi
,详见我的安全启动页面。不过,我想再次强调,除了在 UEFI 模式下启动且安全启动处于活动状态的系统外,不需要对内核模块进行签名——即便如此,仅对第三方或本地编译的内核模块才需要,例如商业视频驱动程序或 VirtualBox 内核模块。随 Ubuntu 内核提供的大多数内核模块都已使用用于签署 GRUB 和主 Ubuntu 内核文件的相同规范密钥进行签名。