建構 virtualbox pci-passthrough 核心模組時出錯 - 出了什麼問題?
我正在嘗試使用 pci-passthrough 擴展讓 virtualbox 在我的機器上工作。嘗試執行 VM 時,我收到以下錯誤消息:
Kernel driver not installed (rc=-1908) [message asking me to install the vboxdrv kernel driver by executing /sbin/vboxconfig as root]
所以我這樣做了,得到了這個:
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.
查看 dmesg,安裝沒有添加新條目。
查看日誌文件,它在最後一個模組失敗:
Building the main VirtualBox module. Building the net filter module. Building the net adaptor module. Building the PCI pass-through module.
這意味著這是失敗的程式碼,
/usr/lib/virtualbox/vboxdrv.sh
從以下位置呼叫/sbin/vboxconfig
:log "Building the PCI pass-through module." if ! myerr=`$BUILDINTMP \ --use-module-symvers /tmp/vboxdrv-Module.symvers \ --module-source "$MODULE_SRC/vboxpci" \ --no-print-directory install 2>&1`; then log "Error building the module:" module_build_log "$myerr" failure "Look at $LOG to find out what went wrong" fi
$BUILDINTMP
指向可執行文件的位置/usr/share/virtualbox/src/vboxhost/build_in_tmp
這就是我在故障排除方面的進展,我不知道下一步該做什麼。
一些資訊:
- IOMMU / VT-D 已啟用
- 核心版本是
4.10.0-38-generic
- 作業系統是 Linux Mint 18.3
- 據我所知,核心標頭檔已安裝,“據我所知”意味著該路徑
/lib/modules/4.10.0-38-generic/build/include/linux
存在並且充滿了 .h 文件和其他子目錄- Virtualbox 版本為 5.2.20
- 當我將 PCI 直通擴展安裝到 VBox 時,它表明安裝成功
從問題評論:
modprobe: ERROR: could not insert 'vboxdrv': Required key not available
這表明模組已經建構,但尚未簽名以滿足安全啟動要求。
最簡單的解決方法是禁用安全啟動。VirtualBox 5.2 尤其如此,因為:
- 它使用自己的模組建構系統而不是 DKMS,並且
- 據我所知,它沒有將模組簽名命令添加到其模組建構過程的設施
(我真的希望 VirtualBox 的未來版本將轉向使用 DKMS,或者至少會提供掛鉤以允許將自定義腳本綁定到 VirtualBox 模組安裝過程中。)
對此問題的“正確”解決方法是創建您自己的安全啟動密鑰,並使用它來完全控制系統韌體中的安全啟動,或者將其註冊為機器所有者密鑰(引導載入程序級別的擴展安全啟動),如果那是不可能的或太難了。
這永遠不可能完全自動化,因為這種自動化將被視為安全啟動規避設備,並將被UEFI 論壇包含在UEFI 撤銷列表中。此列表嵌入到新的 UEFI 韌體版本中。幸運的是,註冊是一次性的過程。
將密鑰註冊到安全啟動後,您可以使用該密鑰對模組進行簽名,以使它們為系統所接受。每次更新核心或 VirtualBox 時,您都必須重複模組簽名。
根據 Ubuntu 文件,您應該能夠創建一個合適的密鑰,
sudo update-secureboot-policy --new-key
然後將其註冊為機器所有者密鑰 (MOK)sudo update-secureboot-policy --enroll-key
並重新啟動。重新啟動時,shim.efi
應該自動啟動 MokManager 程序,這將要求您確認機器所有者密鑰的註冊,因為只有在啟動時它才能確認輸入來自使用者而不是其他地方。這樣做是為了確保安全啟動密鑰的任何自定義都在系統所有者/管理員的明確控制下發生。重新安裝作業系統不會從 UEFI 韌體變數中刪除 MOK,但 UEFI 韌體升級或將所有 UEFI 韌體設置重置為預設值可能會這樣做。在這種情況下,您需要重新進行註冊程序。
成功註冊 MOK 後,韌體應自動將密鑰傳遞給核心,並可用於對模組進行簽名。VirtualBox 5.2 將其模組安裝到
/lib/modules/<kernel version number>/misc/
目錄。要在其中籤署模組,您將使用kmodsign 命令。例如,要簽署vboxdrv.ko
模組:cd /lib/modules/$(uname -r)/misc kmodsign sha512 /var/lib/shim-signed/mok/MOK.priv /var/lib/shim-signed/mok/MOK.der vboxdrv.ko
對您將在此目錄中找到的每個模組重複此操作。應該至少有四個:
vboxdrv.ko
、vboxnetadp.ko
和。vboxnetflt.ko``vboxpci.ko