最近 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 内で VNetFilterHookFn と VMW_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>。
転載時は出典を明記してください。
