一、问题详情:
在Ubuntu22.04系统下用Virbox安装windows过程中使用sudo modprobe vboxdrv后出现的报错为Key was rejected by service。
问题原因:
UbuntuKernel 使用 EFI_SECURE_BOOT_SIG_ENFORCE 内核配置。如果启用了UEFI Secure Boot(UEFI安全引导),会阻止加载未签名的第三方模块。
具体的解决方法可以参考这三个帖子
升级到1604后,virtual box无法使用(已解决) - 页 2 - Ubuntu中文论坛
eclipse 编译内核模块_ubuntu编译内核模块报错:Required key not available 的解决_孤单的宇航员的博客-CSDN博客
linux内核模块签名,如何签名内核模块Ubuntu 18.04_小小支呀的博客-CSDN博客
这里我说下解决方法:
二、解决方案A(关闭Secure boot)(推荐):
1输入代码
sudo apt install mokutil
sudo mokutil --disable-validation
2按照它提示设个8位以上密码。(一次性的)
3重启电脑
4出现蓝屏, 选择第二个Change Secure Boot state,按提示输入密码。
注意:它有时会要求你输入在第二步设置的密码的某一位,比如密码是12345678,就会让你输入第三位3,然后让你输入第2位2。
5输入完密码后进入Disable Secure Boot选择界面,选择 yes,然后下个界面又回到最开始的界面,选择reboot,重新进入系统。
6结果:输入sudo modprobe vboxdrv后无错误弹出,虚拟机可以正常运行。(
7检查:由于刚刚是关闭了Secure Boot来运行,所以可以输入
sudo mokutil --sb-state
这个是可以查看secure boot 的状态显示
SecureBoot enabled
SecureBoot validation is disabled in shim
可以看到SecureBoot validation在内核签名是无效化了。但secureboot是在运行的。
三解决方式B(不关闭secure boot validdation)
想要不关secure boot就得使用生成签名的方法, 大家可以前往以下三个链接处查看(后两个是ubuntu论坛):
解决Ubuntu22.04.1上安装ch34x串口驱动报 Key was rejected by service 需要签名的问题_小言W的博客-CSDN博客
接下来是方案:
1、确定安装了mokuli 和shim-signed
sudo apt install mokutil
sudo apt install shim-signed
sudo update-secureboot-policy --new-key
2创建签名密钥
直接输下面代码。该命令会在/var/lib/shim-signed/mok/下生成证书(MOK.der)和私钥(MOK.priv)
openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=Descriptive common name/"
注意:为了获更安全,可以将-nodes去掉,然后它会要求输入密码。在继续下一步之前,输入:export KBUILD_SIGN_PIN='yourpassword'。之前没有去掉-nodes的可以把生成的
MOK.der和MOK.priv删了,重新输一遍代码。
3对模块签名
本例为vboxdrv,对其他模块可以通过修改最后边的ls $dirname(modinfo-n vboxdrv))/vbox*.ko)以获得完整功能。(针对不同问题的可以根据实际情况来试下修改最后的der $(modinfo -n vboxdrv))
sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxdrv)
4确认模块已签名
tail $(modinfo -n vboxdrv) | grep "Module signature appended"
5注册密钥
重要!它会要求你输入密码,输入的密码是只需要在下次重新启动时使用的一次性密码。
sudo mokutil --import MOK.der
6重启并按照说明注册MOK
7检查输入以下代码来确认密钥已注册
mokutil --test-key MOK.der
使用该方法的话每次内核更新都需要重新注册下密钥。