由于我在 Ubuntu 16.04 上启用了安全启动,因此我需要签署 vboxdrv。
我使用以下方法创建签名 key :
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 $(modinfo -n vboxdrv)
但是,当我打电话时:
modinfo vboxdrv
模块未确认签名:
$ modinfo vboxdrv
filename: /lib/modules/4.4.0-22-generic/updates/dkms/vboxdrv.ko
version: 5.0.18_Ubuntu (0x00240000)
license: GPL
description: Oracle VM VirtualBox Support Driver
author: Oracle Corporation
srcversion: 316C2AE8082B5DFBAABE7EA
depends:<br/>
vermagic: 4.4.0-22-generic SMP mod_unload modversions
parm: force_async_tsc:force the asynchronous TSC mode (int)
然后我运行:
sudo mokutil --import MOK.der
然后重新启动,这会提示我导入计算机所有者 key 。
但是,这会失败(参数 (2) 无效)。
我认为这是由于模块没有提前签名,因为运行 modinfo vboxdrv 应该确认该模块已签名。
最佳答案
这是由于 Lenovo 固件不支持 EFI_VARIABLE_APPEND_WRITE。一位 shim 开发人员已经重写了 MokManager.efi 以在受影响的 Lenovo 机器上工作,尽管尚不清楚需要多长时间才能将其合并并由 Ubuntu 向下游拉动。您可以在 shim 的 github 问题跟踪器 here 上关注该问题。 .
如果你等不及了(被指控有罪),你可以编译 shim 并自行测试。
如果您没有 git
、gnu-efi
、libnss3-tools
和 pesign
,您'需要先安装它们(有关设置 EFI 开发环境的更多信息可以在 here 找到,我正在使用相当新的 Ubuntu 16.04 安装,但可能我已经安装了所需的其他库/工具并忘记了关于它们——只需在编译时查找错误并根据需要安装任何缺少的软件包):
sudo apt-get install git gnu-efi libnss3-tools pesign
接下来,使用补丁克隆 git 存储库的分支:
cd /src
git clone -b fix-lenovo-write https://github.com/lcp/shim.git
cd shim
接下来您需要修改 Makefile(shim 开发人员不使用 Ubuntu)
gedit Makefile
进行以下更改(归功于此post):
-OBJCOPY_GTE224 = $(shell expr `$(OBJCOPY) --version |grep ^"GNU objcopy" | sed 's/^.version //g' | cut -f1-2 -d.` \>= 2.24)
+#OBJCOPY_GTE224 = $(shell expr `$(OBJCOPY) --version |grep ^"GNU objcopy" | sed 's/^.version //g' | cut -f1-2 -d.` \>= 2.24)
+OBJCOPY_GTE224 = 1
-LIB_PATH = /usr/lib64
+LIB_PATH = /usr/lib
-EFI_PATH := /usr/lib64/gnuefi
+EFI_PATH := /usr/lib
接下来您需要注释掉 shim.c 中未使用的变量:
gedit shim.c
在第 1118 行进行以下更改:
@@ -1118,7 +1118,7 @@ static EFI_STATUS handle_image (void *data, unsigned int datasize,
EFI_STATUS efi_status;
char *buffer;
int i;
- unsigned int size;
+ //unsigned int size;
EFI_IMAGE_SECTION_HEADER *Section;
char *base, *end;
PE_COFF_LOADER_IMAGE_CONTEXT context;
编译垫片:
make
暂时关闭安全启动:
sudo mokutil --disable-validation
设置密码,重新启动,然后按照说明禁用安全启动(密码很棘手,它要求您输入密码中的某些字符而不是整个内容)。
备份 MokManager.efi 并仔细检查它是否已备份:
sudo mv /boot/efi/EFI/ubuntu/MokManager.efi /boot/efi/EFI/ubuntu/MokManager.efi.bak
sudo ls /boot/efi/EFI/ubuntu/
将 MokManager 的修补版本移至 EFI 分区。
sudo mv ./MokManager.efi.signed /boot/efi/EFI/ubuntu/MokManager.efi
注册您的 key (根据您的 key 所在位置及其名称进行必要的修改):
sudo mokutil --import MOK.der
设置密码,重新启动并按照说明注册 MOK。现在应该可以在联想机器上成功了。
恢复到 MokManager 的原始版本并启用安全启动:
sudo mv /boot/efi/EFI/ubuntu/MokManager.efi ./MokManager.efi.signed
sudo mv /boot/efi/EFI/ubuntu/MokManager.efi.bak /boot/efi/EFI/ubuntu/MokManager.efi
sudo mokutil --enable-validation
设置密码,重新启动,按照说明操作。
签署您的模块,使用 modprobe 加载它们并享受!
注意:希望这将很快在大多数发行版的存储库中得到正式修补。对于那些非常不耐烦的人来说,这个答案是一个选择,他们愿意从源代码构建补丁并对其进行测试。它可以在我的机器(Lenovo P50)上运行,但这并不意味着它适用于所有人。如果您不习惯从源代码构建 efi 应用程序,只需等待修补版本发布到存储库(届时我将更新此答案)。
关于linux - 无法签署模块 (vboxdrv),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37616898/