Linux カーネルのアップグレードで VMware が使えなくなる問題(vmnet モジュールをコンパイルできない)の解決方法

最近 Ubuntu を 14.04 にアップグレードしたところ、VMware が起動できなくなりました。具体的には、VMware Workstation を起動するたびに VMware Kernel Module Updater ダイアログが表示され、現在のカーネルバージョンに合わせていくつかのカーネルモジュールを再コンパイルするよう求められますが、そのうちネットワークモジュール vmnet のコンパイルが必ず失敗します。

関連情報を調べたところ、原因は Ubuntu 14.04 へのアップグレード後、現在の Linux カーネルバージョンが 3.13 になったことにありました。このカーネルバージョンでは一部の低レベル関数が変更されていますが、VMware 側の関連ソースパッケージがまだ対応するコード更新を行っていません。これはカーネルインターフェースの変更によって起きる問題なので、同じ問題は Fedora などのシステムでも多く発生しています。

そのため、同様の問題は 3.14、3.15 など後続のカーネルバージョンでも引き続き発生する可能性があります。解決方法は、vmnet モジュールのソースパッケージ内にある 2 箇所のコードを修正し、その後再パッケージ化してカーネルモジュールをコンパイルし直すことです。

手順

1. root 権限を取得し、ソースディレクトリへ移動する

su
cd /usr/lib/vmware/modules/source

sudo -i で root shell を取得してから、同じディレクトリへ移動してもかまいません。

2. vmnet ソースパッケージを展開する

展開すると vmnet-only フォルダが作成されます。

tar -xf vmnet.tar

3. 元のソースパッケージをバックアップする

mv vmnet.tar vmnet.tar.bak

4. ソースファイル filter.c を修正する

ファイルを編集します。

vim vmnet-only/filter.c

元の関数引数を探します。おおよそ 206 行目付近です。

VNetFilterHookFn(const unsigned int hooknum // IN:

次のように修正します。

VNetFilterHookFn(const struct nf_hook_ops *ops, // IN:

続いて、おおよそ 255 行目付近にある次のコードを探します。

transmit = (hooknum == VMW_NF_INET_POST_ROUTING);

次のように修正します。

transmit = (ops->hooknum == VMW_NF_INET_POST_ROUTING);

行番号が完全に一致しない場合は、filter.c 内で VNetFilterHookFnVMW_NF_INET_POST_ROUTING を直接検索してください。VMware やカーネルのバージョンによってソース内の位置が多少異なることがあるため、実際のファイル内容に合わせて作業してください。

5. 再パッケージ化し、一時ディレクトリを削除する

tar -uf vmnet.tar vmnet-only
rm -rf vmnet-only

6. VMware カーネルモジュールを再コンパイルする

VMware Workstation のアイコンを直接クリックし、自動検出とモジュールのコンパイルを実行させてもかまいません。コマンドで手動実行することもできます。

vmware-modconfig --console --install-all

それでも失敗する場合は、現在のカーネルヘッダとコンパイルツールが正しくインストールされているかを先に確認することをおすすめします。たとえば Ubuntu では次のように確認できます。

uname -r
dpkg -l | grep "linux-headers-$(uname -r)"

必要に応じて、対応するカーネルヘッダと基本的なビルドツールをインストールします。

sudo apt-get install build-essential linux-headers-$(uname -r)

参考

Bearox と Garrett Skjelstad に感謝します。

  • <http://blog.csdn.net/bearox/article/details/21294609>
  • <http://ping8888.com/2013/12/13/vmware-modules-kernel-3-13/>

初出: <http://blog.csdn.net/yanxiangtianji>。

転載時は出典を明記してください。

Leave a Reply