仮想マシン
 Computer >> コンピューター >  >> ソフトウェア >> 仮想マシン

VirtualBox Guest Additions のコンパイルエラーを解決する方法 - 壊れたシンボリックリンクの修正

まず最初にお断りしておきたいのは、この記事のタイトルがやや大げさに聞こえるかもしれないという点です。そこで、期待値を明確にするために話を絞り込みましょう。前提となる状況は、以前からVirtualBoxを使用しており、Linux仮想マシンにGuest Additionsがインストールされていた、というものです。ところがある日を境に、何らかの理由でゲストOS上のVirtualBoxサービスが動作しなくなります。モジュールを再インストールしようとしても、奇妙なエラーが発生し、カーネル設定の不備や、ソース・ヘッダーファイルの欠落などが原因であるかのように表示されます。しかし、実際にはどれも当てはまりません。

正しいカーネルソースとヘッダーは確かにインストールされているのに、なぜかVirtualBoxがそれらを認識できず、その結果、メインカーネルモジュールのコンパイルに失敗し、仮想マシンの動作全体にも悪影響が及んでいます。さらに厄介なことに、この問題はほぼランダムに発生し、カーネル更新の後に顕在化することが多いのです。こうした背景を踏まえて、シンプルかつ効果的なテクニックでこの問題を解決していきましょう。

発生している問題

CentOSの仮想マシンを例に説明します。必要なビルドツールはすべて揃っており、以前Nvidiaドライバーをセットアップした際にも同じ手順を何度も実行しています。基本的な流れはここでも同様です。他のディストリビューションをお使いの場合でも、コンパイルに必要なツールやソフトウェアを導入する手順はほぼ共通しているため、一度慣れてしまえば難しいことはありません。

しかし、Guest Additionsのモジュールをビルドする(<mount>/VBoxLinuxAdditions.run を実行する)と、コマンドが失敗します:

Building the VirtualBox Guest Additions kernel modules
The headers for the current running kernel were not found. If
the following module compilation fails then this could be the
reason. The missing package can be probably installed with
yum install kernel-devel-...

Building the main Guest Additions module [FAILED]
(Look at /var/log/vboxadd-install.log to find out what went wrong)

そこで、指示に従って不足していると思われるパッケージをインストールしようとしても:

Package kernel-devel-... already installed and latest version
Nothing to do

と表示され、行き詰まってしまいます。

解決策

ここで頼りになるのがログです。トラブルシューティングの基本であり、Linuxの問題解決スキルを磨く絶好の練習にもなります。ログファイル(/var/log/vboxadd-install.log)を開き、内容を確認しましょう。ポイントは、最後のエラーから順に遡って読み、何が起きたのかを突き止めることです。注目すべきエラーの一つは次のとおりです:

Error: unable to find the sources of your current Linux kernel.
Specify KERN_DIR=<directory> and run Make again. Stop.

興味深いことに、VirtualBoxは本当にカーネルソースを見つけられていないようです。そこで、KERN_DIRを明示的に指定してコマンドを再実行し、問題が解決するか確認してみましょう。

export KERN_DIR=/usr/src/kernels/`uname -r`

しかしそれでも解決しません。別のエラーを探す必要があります。ここで思い出したいのは、インストールスクリプトが当初「sources(ソース)」ではなく「headers(ヘッダー)」について警告していたという点です。つまり、問題の本当の原因はおそらく別の場所にあるということです。ログをもう一度精査すると、次のような行が見つかります(カーネルバージョンの具体的な数値は環境によって異なるため無視してください):

grep: /lib/modules/3.10.0-123.20.1.el7.x86_64/build/include/
linux/version.h: No such file or directory

yumコマンドの結果からヘッダーが正しく配置されていることは分かっているので、これはほとんどバグのように思えます。しかし、実行中のカーネルに対応する /lib/modules ディレクトリへ手動で移動(cd)してみると、真相が判明します。なんと、壊れたシンボリックリンクが存在していたのです。

build リンクが相対パスを指していることが根本原因です。相対パスのリンクは決して好ましい構成ではなく、そのためVirtualBoxは期待されるヘッダーファイルを見つけられなくなっています。この問題は、リンクを絶対パスで張り直すことで完全に回避できます。

cd /lib/modules/`uname -r`/
ln -sf /usr/src/kernels/3.10.63-11.el7.x86_64 build

これでシンボリックリンクが修正されました。続けてGuest Additionsのインストーラーを再実行すれば、今度は問題なくコンパイルが完了し、仮想マシンも正常に動作するようになります。

まとめ

チュートリアルは以上です。この種の問題は、似たようなエラーメッセージを引き起こす要因が非常に多いため、原因特定までに人を疲れさせてしまうことがあります。しかし、落ち着いて考えれば、ビルド環境自体の問題(ツールやパッケージの欠落)は除外できます。以前は正常に動作していたという事実を思い出せば、VirtualBoxとカーネルの非互換性の線も消え、別の場所に原因があると推測できるのです。

今回のケースでは、不正なシンボリックリンクこそがすべての問題の発生源でした。なぜリンクが壊れたのか、何が変更を加えたのかは定かではありませんが、パッケージの更新やシステム側の何らかの挙動が影響した可能性があります。重要なのは、仕組み(ワークフロー)を理解し、ログをもとに原因を遡って追跡し、確実に修正できることです。この記事が、同じ症状でお困りの方の助けになれば幸いです。

  1. DDraw.dllエラーの原因と修正方法を徹底解説

    DirectX DDraw.dllは、DirectXプログラムにリンクされるダイナミックリンクライブラリ(DLL)ファイルの一つで、マルチメディアアプリケーションが2Dグラフィックスを描画する際に必要となる重要なファイルです。しかし、DirectXを利用する多くのユーザーの間では、「DDraw.dll」に言及したエラーが発生することがあります。これは、ファイル自体が何らかの問題――破損または欠損――に遭遇していることが原因と考えられます。こうしたトラブルは、パソコン側のさまざまな要因によって引き起こされる可能性があります。 DDraw.dllエラーの主な原因 PC上のddraw.dllファ

  2. VirtualBoxでディスクをクローンする方法【VBoxManage活用チュートリアル】

    仮想化を業務でも趣味でも利用している方なら、VirtualBoxという強力かつ多用途な無料ソリューションを目にしたことがあるかもしれません。VirtualBoxは、デスクトップユーザーに対して、あらゆる形でOSを展開できる大きな柔軟性を提供してくれます。さらに、単なる趣味として仮想化を楽しんでいるだけでなく、仮想化を通じて新しいOSを学ぼうとする熱心なソフトウェア愛好家の方であれば、次のような場面に必ず直面することでしょう。それは「大量の仮想マシンを展開する必要がある」というシナリオです。一台ずつインストール作業を行う時間的な余裕はないはずです。実際、大規模に環境を展開する際に手動で一つずつマ