当前位置: 首页>>技术教程>>正文


如何签名内核模块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还是很陌生,所以欢迎任何帮助。在此先感谢所有答复者。

最佳办法

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

  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”,然后继续,然后选择“是”以注册密钥,并选择re-enter在步骤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/以获得更多信息。

次佳办法

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

第三种办法

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

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

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

问题在于该模块未签名,因此未加载内核。如果您的计算机启用了SecureBoot模式(在现代设备中很常见),则会发生这种情况。

这就是为什么我会在打开虚拟盒子中的任何计算机时收到此错误的原因

Kernel driver not installed (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. 最后,重新启动计算机。键盘等待时,将出现一个蓝屏,按要求您中断启动的键。

在蓝屏内部时,选择

Enroll MOK -> Continue -> and it will ask you for the password

您先前输入的内容将被输入,并且将通知您该操作已成功完成。

现在您的操作系统将启动,并且您现在可以使用VirtualBox了,没有问题:)

希望这对某人有帮助。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/9337.html,未经允许,请勿转载。