VMware Player をインストールして使用する場合に、 `Create a New Virtual Machine' から guest OS の iso イメージを読み込み起動しようとしたとき、 modconfig がモジュールを更新しようとするときがある。その際に vmmon のコンパイルのところで止まってしまい実行出来なかった。

止まってしまう原因はいくつかあって、まず、 vmmon, vmnet のソースコードの一部が最近のカーネルと不整合を起こしているためコンパイル時にエラーとなることと、 script の実行時にもエラーが出ること、そして、コンパイルして作成されるカーネルモジュール vmmon.ko, vmnet.ko に署名がされていないため起動に失敗することだ。

まず、カーネルコードとの不整合については、 Michal Kubeček 氏の GitHub に修正版のソース一式を挙げてくださっているので、そちらを使用させていただく。

sudo /etc/init.d/vmware stop

としてサービスを停止しておいてから、氏の GitHub の INSTALL に記述されている通り、

wget https://github.com/mkubecek/vmware-host-modules/archive/player-14.1.1.tar.gz

tar -xzf player-14.1.1.tar.gz

cd vmware-host-modules-player-14.1.1

make

make install

としてやれば vmmon.ko, vmnet.ko の修正版がインストールされる。( 14.1.1 のところは使用する VMwarePlayer のバージョンに置き換える。ただし、氏の GitHub に修正版が上がっていることが前提。)

これで vmmon, vmnet のコンパイル時のエラーは解消される。

このとき、 make したとき、

./scripts/***: *** 行: printf: 0x十六進数ダンプ:: 無効な十六進数です

といったエラーも出るが、これは LANG=C make とすることで解消できる。

この後、 make install した後そのまま、

sudo /etc/init.d/vmware start

とした場合、

Starting VMware services:

Virtual machine monitor failed

Virtual machine communication interface done

VM communication interface socket family done

Blocking file system done

Virtual ethernet failed

VMware Authentication Daemon done

のように2つのモジュールの起動に失敗するが、これは UEFI の validation 機能が有効になっている場合に更新したカーネルモジュールに署名がされていないためなので、

sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der /*/*.ko

のようにして vmmon.ko, vmnet.ko に署名してやると起動できるようになる。 MOK.priv, MOK.der は事前に作成しキーを登録しておかなければいけない。

VMware が自動的にモジュールを更新しようとしたとき、この署名の操作をしないため、 UEFI の validation が有効になっていると更新に失敗するはずだ。( VMware はなぜこの問題に対応しないのだろう? )

キーワード: VMware Player modconfig