Virtualbox

建構 virtualbox pci-passthrough 核心模組時出錯 - 出了什麼問題?

  • November 14, 2018

我正在嘗試使用 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.kovboxnetadp.ko和。vboxnetflt.ko``vboxpci.ko

引用自:https://unix.stackexchange.com/questions/481269