virtualbox pci-passthrough カーネルモジュールの構築中にエラーが発生しました。何が間違っていますか?

virtualbox pci-passthrough カーネルモジュールの構築中にエラーが発生しました。何が間違っていますか?

pci-passthrough拡張機能を使用して自分のコンピュータでvirtualboxを操作しようとしています。仮想マシンを実行しようとすると、次のエラーメッセージが表示されます。

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です。
  • 私が知っている限り、カーネルヘッダがインストールされているということは、パスが存在し、.h/lib/modules/4.10.0-38-generic/build/include/linuxファイルや他のサブディレクトリでいっぱいであることを意味します。
  • Virtualboxのバージョンは5.2.20です。
  • VBoxにPCIパススルー拡張をインストールすると、インストールに成功したというメッセージが表示されます。

答え1

質問コメントを見ると、次のようになります。

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.efiMokManagerプログラムは自動的に起動する必要があり、起動時にのみ入力が他の場所ではなくユーザーから来たことを確認できるため、システム所有者のキー登録を確認するように求められます。これは、セキュアブートキーのカスタマイズがシステム所有者/管理者の明示的な制御下で行われるようにするために行われます。

オペレーティングシステムを再インストールしても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.ko4つ以上が必要ですvboxpci.ko

関連情報