当我尝试使用 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 密钥环不必一直更新。