如何对 Ubuntu 18.04 内核模块进行签名

如何对 Ubuntu 18.04 内核模块进行签名

我是 Ubuntu 新手。我正在尝试安装 Genymotion,以便可以访问 Android 模拟器。要使用 Genymotion,我必须安装 VirtualBox。我已经安装了 VirtualBox,但似乎需要签署内核模块……我真的不知道该怎么做。这是我运行后收到的错误消息/sbin/vboxconfig

vboxdrv.sh: Stopping VirtualBox services.
vboxdrv.sh: Starting VirtualBox services.
vboxdrv.sh: Building VirtualBox kernel modules.
vboxdrv.sh: failed: modprobe vboxdrv failed. Please use 'dmesg' to find out why.

There were problems setting up VirtualBox.  To re-start the set-up process, run
  /sbin/vboxconfig
as root.  If your system is using EFI Secure Boot you may need to sign the
kernel modules (vboxdrv, vboxnetflt, vboxnetadp, vboxpci) before you can load
them. Please see your Linux system's documentation for more information.

我尝试过在谷歌上搜索这个问题,但似乎找不到一个清晰简洁的答案和连续的步骤。再说一次,我对 Linux 还很陌生,所以欢迎任何帮助。提前感谢所有回复的人。

答案1

为了使 VirtualBox 正常工作而不简单地禁用 UEFI 安全启动,您需要执行以下操作:

  1. 创建个人公钥/私钥 RSA 密钥对来签署内核模块。按照以下链接中的建议,我选择将密钥/密钥对存储在 /root/module-signing/ 目录中。
    sudo -i
    mkdir /root/module-signing
    cd /root/module-signing
    openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=YOUR_NAME/"
    chmod 600 MOK.priv 
  1. 使用 mokutil(一种导入或删除机器所有者密钥 (MOK) 的工具)导入公钥,然后在机器重新启动时注册它。此步骤中的密码是临时使用的密码,您只需记住几分钟即可。
    mokutil --import /root/module-signing/MOK.der
    input password:
    input password again:
  1. 重新启动机器。引导加载程序启动后,您应该会看到一个屏幕,要求您按下按钮进入 MOK 管理器 EFI 实用程序。请注意,任何外部键盘在此步骤中都不起作用。在第一个菜单中选择注册 MOK,然后继续,然后选择是以注册密钥,并重新输入在步骤 2 中设置的密码。然后选择确定以继续系统启动。

  2. 未来的内核更新将需要对更新后的内核再次进行签名,因此将签名命令放入脚本中是有意义的,该脚本可以在以后根据需要运行。下面给出了一个示例脚本 /root/module-signing/sign-vbox-modules。

#!/bin/bash

for modfile in $(dirname $(modinfo -n vboxdrv))/*.ko; do
  echo "Signing $modfile"
  /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 \
                                /root/module-signing/MOK.priv \
                                /root/module-signing/MOK.der "$modfile"
done
  1. 添加执行权限,并从 /root/module-signing/ 目录以 root 身份运行上述脚本。
    sudo -i
    cd /root/module-signing
    chmod 700 /root/module-signing/sign-vbox-modules
    ./sign-vbox-modules
  1. 加载 vboxdrv 模块并启动 VirtualBox。
    modprobe vboxdrv 

大部分信息来自以下链接,您可以参考以获取更多信息https://stegard.net/2016/10/virtualbox-secure-boot-ubuntu-fail/

答案2

我知道这个问题已经很老了,但是因为没有公认的答案,而且这些答案都没有为我解决问题,所以我今天写下了我如何解决这个问题:

运行此命令时,出现以下错误:

$ sudo modprobe vboxdrv
modprobe: ERROR: could not insert 'vboxdrv': Required key not available

问题在于模块未签名,因此未随内核加载。如果您的计算机已激活 SecureBoot 模式,就会发生这种情况,这在现代设备中非常常见。

这就是为什么我在虚拟机中打开任何机器时都会出现此错误

内核驱动程序未安装(rc=-1908)

按照以下步骤对驱动程序进行签名,并将其作为内核模块加载到 Ubuntu 系统和 Debian 9 上:

  1. 安装mkutil包以便能够进行签名。

    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get install mokutil
    
  2. 生成签名文件:

    openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=VirtualBox/"
    
  3. 然后将其添加到内核:

    sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxdrv)
    
  4. 将其注册为安全启动。

    重要的!这将要求您输入密码,输入您想要的密码,您只需在下次重启时使用一次该密码。

    sudo mokutil --import MOK.der
    
  5. 最后,重启电脑。会出现一个蓝屏,上面写着“键盘等待,按下中断启动的键”。

    在此处输入图片描述

当您处于蓝屏状态时,选择

注册 MOK -> 继续 -> 系统会要求您输入密码

您之前已经输入过的内容,您将输入它,然后会被告知操作已成功完成。

现在你的操作系统将启动,你可以毫无问题地使用 VirtualBox :)

希望这对某人有帮助。

答案3

我在 Ubuntu 20.04 上遇到了同样的问题,但不明白为什么。我尝试了上述所有选项,但它们对我来说都不太管用。对软件包进行签名似乎有点复杂且不必要,所以我不太确定我是否做对了,但我最终设法弄清楚了并解决了这个问题。

我意识到这个问题只在执行 kernel/dist 升级后才会发生。如果你手动编译系统上的任何程序,然后升级内核或操作系统,那么你就会遇到同样的问题。

解决方案是安装virtualbox-dkms软件包。如果你查看 Synaptic 软件包管理器上的安装包,你会发现很多。(我有virtualbox-6.1

如果您不确定,只需运行以下命令:

sudo apt install --reinstall virtualbox-dkms

如果不是 DKMS,它会首先要求卸载当前版本,并要求输入-y确认。(注意:这不会删除您的虚拟机)

答案4

我遇到了这个问题。禁用安全启动: https://wiki.ubuntu.com/UEFI/SecureBoot/DKMS

相关内容