在安全启动 (UEFI) 中使用 VirtualBox

在安全启动 (UEFI) 中使用 VirtualBox

当我尝试使用 virtualbox(通过包管理器安装)打开虚拟机时出现以下错误:

VirtualBox Linux 内核驱动程序 (vboxdrv) 未加载,或者 /dev/vboxdrv 存在权限问题。请安装 virtualbox-dkms 包并通过执行加载内核模块

‘modprobe vboxdrv’

以 root 身份运行。如果您的发行版中提供 DKMS 包,则应首先安​​装它。此包会跟踪 Linux 内核更改,并在必要时重新编译 vboxdrv 内核模块。

现在当我尝试运行sudo modprobe vboxdrv它时出现错误

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

我还注意到在 virtualbox-dkms 安装结束时它显示:

DKMS: install completed.
Setting up virtualbox (5.0.40-dfsg-0ubuntu1.16.04.2) ...
vboxweb.service is a disabled or a static unit, not starting it.
Job for virtualbox.service failed because the control process exited with error code. See "systemctl status virtualbox.service" and "journalctl -xe" for details.
invoke-rc.d: initscript virtualbox, action "restart" failed.

检查状态显示

● virtualbox.service - LSB: VirtualBox Linux kernel module
   Loaded: loaded (/etc/init.d/virtualbox; bad; vendor preset: enabled)
   Active: failed (Result: exit-code) since di 2018-03-20 14:05:46 CET; 6min ago
     Docs: man:systemd-sysv-generator(8)

mrt 20 14:05:45 paul-GP60-2QF systemd[1]: Starting LSB: VirtualBox Linux kernel module...
mrt 20 14:05:46 paul-GP60-2QF virtualbox[15359]:  * Loading VirtualBox kernel modules...
mrt 20 14:05:46 paul-GP60-2QF virtualbox[15359]:  * modprobe vboxdrv failed. Please use 'dmesg' to find out why
mrt 20 14:05:46 paul-GP60-2QF virtualbox[15359]:    ...fail!
mrt 20 14:05:46 paul-GP60-2QF systemd[1]: virtualbox.service: Control process exited, code=exited status=1
mrt 20 14:05:46 paul-GP60-2QF systemd[1]: Failed to start LSB: VirtualBox Linux kernel module.
mrt 20 14:05:46 paul-GP60-2QF systemd[1]: virtualbox.service: Unit entered failed state.
mrt 20 14:05:46 paul-GP60-2QF systemd[1]: virtualbox.service: Failed with result 'exit-code'.

现在安装过程中出现了一个小的“异常”。 - 安装过程要求我禁用安全启动。 - 我不希望这样,我希望继续使用安全启动(因为它现在适用于 ubuntu 和 windows - 甚至 windows 上的 virtualbox)。

这是否意味着我无法拥有安全启动和虚拟盒?考虑到虚拟盒在操作系统内运行,并且 ubuntu 本身可以正常启动,这似乎很愚蠢。

答案1

在安全启动 (UEFI) 中使用 VirtualBox

在安全启动环境中使用自编译的内核模块是可能的。所有模块都必须经过签名,并且密钥必须在安全启动 BIOS(或启动加载程序)中注册

创建签名证书和密钥

创建用于签署内核模块(所需包)的证书和私钥sudo apt-get install openssl

## Create a signing key and certificate##
## Signing certificate and keys
sign_key=signing_key.priv
sign_crt=signing_key.x509

## Subject for certificate
sign_sub=""
sign_sub+="/O=Your Name"
sign_sub+="/CN=Module Signing Key"
sign_sub+="/[email protected]"
sign_sub+="/"

## Create certificate and keys
if [[ ! -f "$sign_key" ]] && [[ ! -f "$sign_crt" ]]; then
    openssl req -new -x509 -newkey rsa:2048 -keyout "$sign_key" \
        -outform DER -out "$sign_crt" -nodes -days 365 -subj "$sign_sub"
fi
## Print certificate
openssl x509 -in "$sign_crt" -inform DER -noout -text

构建Linux内核签名工具

Linux 内核头文件里面/usr/src/是内核模块(所需软件包)的签名工具sudo apt-get install build-essential libssl-dev

## Build signing tool
gcc "/usr/src/linux-headers-$(uname -r)/scripts/sign-file.c" -L \
   /usr/include/openssl/ -lcrypto -lssl -o sign-file

签名 VirtualBox 模块

使用签名工具,所有 VirtualBox 模块都需要进行签名。

## Sign virtualbox modules
vbox_mod=()
vbox_mod+=(vboxdrv)
vbox_mod+=(vboxnetadp)
vbox_mod+=(vboxnetflt)
vbox_mod+=(vboxpci)

for module in "${vbox_mod[@]}"; do
    echo "Signing module $module"
    sudo sign-file sha256 "$sign_key" "$sign_crt" \
        "$(modinfo -n "$module")"
done

添加证书以安全启动

最后,需要将证书添加到安全启动 BIOS(需要包sudo apt-get install mokutil

## Add key to UEFI keyring
sudo mokutil --import "$sign_crt"

建议创建一个脚本来执行此操作,因为每次更新内核时,模块都需要重新签名。证书和密钥可以重复使用,因此 UEFI 密钥环不必一直更新。

相关内容