UEFI環境下安裝VirtualBox
造冰箱的大熊貓@cnblogs 2018/12/19
1、問題
在一臺新計算機上安裝VirtualBox(VirtualBox 5.13.8+Ubuntu 16.04),啟動虛擬機器時出現“Kernel driver not installed (rc=-1908)”錯誤。按照錯誤提示執行“sudo modprobe vboxdrv”無法解決問題。降級安裝老版本的VirtualBox問題依舊。最後發現這個問題是與計算機使用UEFI導致的。
2、問題產生的原因
首先說明一下虛擬機器安裝環境:
- 主機:使用UEFI
- 作業系統:Ubuntu 16.04
- VirtualBox:v5.1.38_Ubuntu r122592
- uname -a:4.15.0-42-generic
UEFI[1]定義了計算機韌體與作業系統之間的介面,是傳統BIOS的替代者。UEFI的功能之一是提供所謂的“Secure Boot”功能。該功能只允許通過數字簽名認證的作業系統或驅動被載入。VirtualBox所需的模組“vboxdrv”沒有進行數字簽名,導致該模組未能被載入,進而導致VirtualBox執行失敗。
3、解決方法一
在計算機韌體配置中關閉“Secure Boot”功能,VirtualBox就可以正常執行。但是,一旦重新啟動“Secure Boot”,問題又會出現。
4、解決方法二
為xboxdvr建立數字簽名,並將數字簽名新增到UEFI中。具體操作步驟如下:
1)建立數字簽名
在命令列中執行以下命令
openssl req -new -x509 -newkey rsa:2048 -keyout FILENAME.priv -outform DER -out FILENAME.der -nodes -days 36500 -subj "/CN=KEYNAME/"
執行這個命令,會在當前路徑下建立一對數字簽名檔案FILENAME.priv和FILENAME.der。你可以將FILENAME和KEYNAME設定為任何你喜歡的名字。
2)檢查vboxdrv的位置
在命令列中執行以下命令
modinfo vboxdrv
返回如下執行結果(顯示內容可能會因為作業系統和硬體的不同而略有不同)
filename: /lib/modules/4.15.0-42-generic/updates/dkms/vboxdrv.ko version: 5.1.38_Ubuntu r122592 (0x002a0000) license: GPL description: Oracle VM VirtualBox Support Driver author: Oracle Corporation srcversion: 6598048D64CD6300853C314 depends: retpoline: Y name: vboxdrv vermagic: 4.15.0-42-generic SMP mod_unload parm: force_async_tsc:force the asynchronous TSC mode (int)
3)對vboxdrv進行數字簽名
在命令列中執行一下命令
sudo /usr/src/linux-headers-4.15.0-42-generic/scripts/sign-file sha256 ./FILENAME.priv ./FILENAME.der /lib/modules/4.15.0-42-generic/updates/dkms/vboxdrv.ko
這裡,
- linux-headers-4.15.0-42-generic:應當與“uname -a”命令返回的結果相匹配。
- ./FILENAME.priv”、./FILENAME.der:應當與步驟1)中生產的數字簽名檔案的路徑相匹配。這上述例子中,我們假設一對數字簽名檔案處於命令行當前路徑下。
- /lib/modules/4.15.0-42-generic/updates/dkms/vboxdrv.ko:應當與步驟2)返回的“filename”保持一致。
4)將公鑰新增至MOK
在命令列中執行以下命令,將vboxdrv的公鑰新增到UEFI的MOK(Module Owned Keys)。
sudo mokutil --import FILENAME.der
5)登記公鑰
重啟計算機,UEFI會檢測到MOK中新添加了公鑰,並提示使用者是否登記新的公鑰。使用者根據螢幕提示執行即可(選擇“Enroll key from disk”)。
完成上述步驟後,VirtualBox中的虛擬機器就可以正常運行了。