VirtualBoxカーネルドライバーがインストールされていません(rc=-1908)エラーを解決する方法
セキュアブートのようなセキュリティ機能が存在するのは当然のことですが、サードパーティ製のカーネルモジュールを使うと、時に深刻な問題を引き起こすことがあります。VirtualBoxのvboxdrvがその例です。セキュアブートが署名されていない、あるいは互換性のないカーネル拡張の読み込みをブロックすると、VirtualBoxはVMを正常に起動できなくなります。これはMacや一部のLinuxディストリビューションでよく見られる問題で、特にOSの大規模なアップデート後やカスタムカーネルをいじっている場合に顕著です。対処方法を知っていれば、時間とストレスを大幅に節約できます。
macOSとLinuxでこのエラーを修正する方法
macOSでカーネルモジュールを許可する
新しいmacOS(例えば10.13以降)を搭載したMacでVirtualBoxを実行している場合は、プロンプトが表示されるか、拡張機能を手動で許可する必要があるでしょう。Linuxには独自の癖がありますが、macOSのセキュリティ設定は比較的簡単に変更できます。これは、macOSが署名されていないモジュールや新しいモジュールの読み込みをブロックし、VMカーネルドライバのエラーを引き起こすのを防ぐのに役立ちます。
- システム環境設定を開き、セキュリティとプライバシーに移動します。
- [全般]タブで、ブロックされたソフトウェアに関するメッセージが表示された場合は、その横にある[許可]をクリックします。
VirtualBoxカーネルサービスを再起動する
場合によっては、VirtualBoxの起動スクリプトを再起動することで、署名済みのカーネル拡張機能を正しく取得できることがあります。ターミナルを開いて以下を実行してください。
sudo /Library/Application\ Support/VirtualBox/LaunchDaemons/VirtualBoxStartup.sh restart
このコマンドは、VirtualBoxのカーネル拡張機能の読み込みプロセスを停止してから再開します。私のMacでは、この方法とセキュリティプロンプトを組み合わせることで、再起動後にVirtualBoxがドライバーを正常に認識することを確認しました。
vboxdrvカーネル拡張機能を登録する
もう1つの方法は、VirtualBoxドライバを手動で登録することです。
sudo kmutil load -p '/Library/Application Support/VirtualBox/VBoxDrv.kext'
これにより、OSは拡張機能を強制的にロードします。いわば「OSに注意を向けさせる」動作です。これを実行した後、再起動してVirtualBoxでVMを実行できるかどうかを確認してください。SIP(システム整合性保護)機能により、システムがデフォルトでドライバをロードしない場合があります。
Oracleの開発者IDを承認する
上記の方法を試しても問題が解決しない場合は、macOSが開発者を信頼していないためにドライバをブロックしている可能性があります。Oracleの開発者IDをシステムのセキュリティ評価リストに手動で追加する必要があります。これは、macOSに「はい、この開発者を信頼します」と伝えるようなものです。
ターミナルを開いて次のコマンドを実行します:
spctl kext-consent add VB5E2TV963
これにより、Oracleが信頼済みリストに追加されます。念のため、SIPが変更をブロックしている可能性もあるため、リカバリモードからこの手順を再度実行することをお勧めします。
- Mac を再起動し、Command + Rを押してリカバリモードに入ります。
- ユーティリティ>ターミナルを開きます。
- 同じコマンドを入力します。
- 通常どおり再起動し、VirtualBox が問題なくドライバーをロードできるかどうかを確認します。
spctl kext-consent add VB5E2TV963
VirtualBox拡張パックをインストールする
それでもドライバーが読み込まれない場合は、最新のVirtualBox Extension Packをインストールすると改善する可能性があります。特に一部の機能には追加のカーネルモジュールが必要なためです。VirtualBoxのダウンロードページからダウンロードしてください。VirtualBoxをインストールしたら、 VirtualBoxの「ツール」>「拡張機能」に移動し、拡張機能パックをインストールしてください。OSがカーネルモジュールを受け入れるために必要な署名済みドライバーが含まれている場合もあります。
カーネル拡張キャッシュをクリアする
macOSはカーネル拡張機能をキャッシュするため、時々スタックすることがあります。ターミナルで実行してください。
sudo kextcache --clear-staging
これによりキャッシュがクリアされます。再起動して、状況が改善するかどうかを確認してください。改善しない場合は、再起動後にコマンドを再度お試しください。
別のVirtualBoxバージョンを試す
新しいバージョンでは、現在のOSの設定やセキュリティ設定との互換性が損なわれる場合があります。VirtualBoxを完全にアンインストールしてください。
- 通常のアンインストール スクリプト
/Library/Application Support/VirtualBox/Uninstall.toolまたは同様のスクリプトを実行します。 - 再起動後、サイトから古いバージョンまたは最新バージョンをダウンロードしてください。場合によっては、別のリリースの方がシステムと相性が良いこともあります。
SIPのカーネル拡張フラグを修正
SIPのような怪しいツールは、フラグが正しく設定されていないと特定のドライバの読み込みをブロックすることがあります。リカバリモード(起動中にCommand + R)で起動し、ターミナルで以下を実行してください。
chflags restricted /Volumes/Macintosh\ HD/private/var/db/KernelExtensionManagement
実際のディスク名が異なる場合は、実際のディスク名に置き換えてくださいMacintosh\ HD。VirtualBoxを再起動し、再インストールしてテストしてください。
最後の手段としてセキュアブートを無効にする
どうしてもという場合は、セキュアブートをオフにするという選択肢もありますが、システムのセキュリティが弱まることに注意してください。手順は以下のとおりです。
- リカバリモード(Command + R)で再起動し、「ユーティリティ」 > 「スタートアップ セキュリティ ユーティリティ」に進みます。
- セキュア ブートを[セキュリティなし]に設定します。
- 再起動すると、署名されていない、または信頼されていないカーネル拡張機能が正常に読み込まれるようになります。
この変更後、必要に応じてセキュア ブートを手動で再度オンにする必要がありますが、デバッグの場合は簡単に修正できます。
Linuxでこのエラーを修正する方法
Linuxは、カーネルモジュールがバージョン、ヘッダー、署名プロセスに大きく依存するため、扱いが難しい場合があります。VirtualBoxでvboxdrvが読み込まれないというエラーが表示される場合、考えられる原因は以下のとおりです。
まず再起動
Linuxカーネルのアップデートでは、vboxdrvモジュールが正常に動作するようになるまで、再起動が必要になることがよくあります。これは簡単な手順ですが、カーネルのアップデートがすぐに反映されるとは限らないため、再起動だけで済む場合もあります。
カーネルとヘッダーの一致
カーネルをアップデートしたばかりの場合、vboxdrvモジュールに互換性がない可能性があります。この問題を解決するには、現在のカーネルと同じカーネルヘッダーを再インストールしてください。Debian/Ubuntuの場合:
sudo apt purge virtualbox dkms linux-headers-$(uname -r) sudo apt install linux-headers-$(uname -r) sudo apt install virtualbox
他のディストリビューションの場合は、や などaptのパッケージマネージャーに切り替えてください。その後、カーネルモジュールを再適用してください。dnfyum
sudo /etc/init.d/vboxdrv setup
または、DKMS を備えたシステムの場合:
sudo dkms autoinstall
古いカーネルへのロールバック
現在のカーネルがサポートされていない、または動作しない場合は、動作確認済みのバージョンに戻すことを検討してください。ディストリビューションのメインラインアーカイブから古いカーネルをダウンロードしてインストールし、そのカーネルで再起動してください。正しいバージョンであれば、エラーは消える傾向があります。
GCCバージョンの調整
モジュールが特定のコンパイラバージョンでビルドされている場合があります。GCCのバージョンが異なる場合、問題が発生する可能性があります。修正するには、以下の手順を実行してください。
- VirtualBox を消去します:
sudo apt purge virtualbox - GCC 8 (またはターゲットバージョン) をインストールします。
sudo apt install gcc-8 g++-8 - デフォルトとして設定します:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 800 --slave /usr/bin/g++ g++ /usr/bin/g++-8
その後、VirtualBox を再インストールすると、モジュールが正常にロードされる可能性が高くなります。
セキュアブートのモジュールに署名する
セキュアブートを使用していて署名エラーが発生する場合は、カーネルモジュールに自分で署名する必要があるかもしれません。GitHubのスクリプト署名ツールなどのツールは、このプロセスに役立ちます。しかし、正直なところ、テストではセキュアブートをオフにする方が速い場合が多いです。
セキュアブートを無効にする(Linuxの場合)
最後の手段として、システムのファームウェア設定(通常は起動時のブートメニューから)にアクセスし、「セキュアブート」を探してオフにしてください。これによりセキュリティは低下しますが、VMが動作するかどうかは左右される可能性があります。
このチュートリアルが、誰かが頭をぶつけずに済むようになれば幸いです。セキュアブートは当然ながら追加の手順となるため、必要以上に複雑化してしまうからです。
まとめ
- macOSのセキュリティとプライバシー設定でカーネル拡張機能を許可する
- VirtualBoxカーネルモジュールを手動でリセットまたは登録する
- システムポリシーにOracleの開発者IDを追加する
- VirtualBox拡張パックをインストールまたは更新する
- カーネル拡張キャッシュをクリアする
- 異なるバージョンのVirtualBoxを再インストールする
- 他の方法がすべて失敗した場合はセキュアブートを無効にする
- Linuxでは、カーネルヘッダーを一致させるか、カーネルのロールバックを検討するか、GCCのバージョンを変更する
- セキュアブートを無効にするのが最も簡単な回避策であることが多い。必要に応じて後で再度有効にすることを忘れないでください。
まとめ
正直言って、セキュアブートと仮想マシンドライバーの扱いは少々面倒ですが、肝心なのはシステムにソフトウェアを信頼させることです。モジュールを許可したり、セキュアブートを一時的に無効にしたりといったコツをつかめば、作業はスムーズに進むでしょう。ただし、設定はそれぞれ微妙に異なるため、多少の試行錯誤が必要になる場合があることを覚えておいてください。これで誰かの作業時間を少しでも短縮できれば幸いです。