31 August 2023

Ubuntu LinuxでVMWare Workstation Playerのhost module(vmmon, vmnet)のインストールに失敗するのを修正

しばらく前より、Ubuntuの定例アップデートでカーネルがアップデートされたとき、VMWareのカーネルモジュールvmmonとvmnetが新Linuxカーネルに追従アップデートされず、VMWareが起動できなくなる不具合が続いている

  • vmmon.koとvmnet.koのコンパイルに失敗するのを修正
  • vmware-authdlauncherサービスが起動しない

この2つの不具合を解消する方法を、一旦ここでまとめてメモしておく

vmmon.koとvmnet.koのコンパイルに失敗するのを修正

コンパイルのログファイルには、次のようなメッセージが見られる。#includeが失敗しているので、このあたりに問題があると思われるのだが...

カーネルモジュールのコンパイルログの抜粋例 /tmp/vmware-vm/vmware-4724.log
〜 略 〜

2023-08-31T07:16:42.231Z In(05) host-4724 /tmp/modconfig-xb1RZf/vmmon-only/./include/vm_basic_defs.h:54:12: fatal error: stddef.h: そのようなファイルやディレクトリはありません
2023-08-31T07:16:42.231Z In(05) host-4724    54 | #  include <stddef.h>
2023-08-31T07:16:42.231Z In(05) host-4724       |            ^~~~~~~~~~
2023-08-31T07:16:42.231Z In(05) host-4724 compilation terminated.

〜 略 〜

2023-08-31T07:16:42.231Z In(05) host-4724 /tmp/modconfig-xb1RZf/vmmon-only/./include/vm_assert.h:43:10: fatal error: stdarg.h: そのようなファイルやディレクトリはありません
2023-08-31T07:16:42.231Z In(05) host-4724    43 | #include <stdarg.h>
2023-08-31T07:16:42.231Z In(05) host-4724       |          ^~~~~~~~~~
2023-08-31T07:16:42.231Z In(05) host-4724 compilation terminated.

〜 略 〜

2023-08-31T07:16:42.231Z In(05) host-4724 make: *** [Makefile:117: vmmon.ko] エラー 2

〜 略 〜

2023-08-31T07:16:42.231Z In(05) host-4724 make: *** [Makefile:117: vmnet.ko] エラー 2
2023-08-31T07:16:42.231Z In(05) host-4724 Unable to install all modules.  See log for details.

エラーログを読んでみると、stddef.hとstdarg.hが存在しないのが原因のようにも見える。これらはC言語のデフォルトで使われるものだが、ちゃんとincludeパスに含まれているか念のため確認する

$ gcc -x c++ -v -E /dev/null
Using built-in specs.
COLLECT_GCC=gcc
OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
〜 略 〜
#include <...> search starts here:
 /usr/include/c++/11
 /usr/include/x86_64-linux-gnu/c++/11
 /usr/include/c++/11/backward
 /usr/lib/gcc/x86_64-linux-gnu/11/include
 /usr/local/include
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
〜 略 〜

$ find /usr/ -name 'stddef.h' -print
/usr/include/linux/stddef.h
/usr/src/linux-hwe-6.2-headers-6.2.0-26/include/uapi/linux/stddef.h
/usr/src/linux-hwe-6.2-headers-6.2.0-26/include/linux/stddef.h
/usr/src/linux-hwe-6.2-headers-6.2.0-31/include/uapi/linux/stddef.h
/usr/src/linux-hwe-6.2-headers-6.2.0-31/include/linux/stddef.h
/usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h

$ find /usr/ -name 'stdarg.h' -print
/usr/include/c++/11/tr1/stdarg.h
/usr/src/linux-hwe-6.2-headers-6.2.0-26/include/linux/stdarg.h
/usr/src/linux-hwe-6.2-headers-6.2.0-31/include/linux/stdarg.h
/usr/lib/gcc/x86_64-linux-gnu/11/include/stdarg.h

黄色で着色した部分で分かるよう、確かに2つのインクルードファイルは検索パス上にある

解決方法

解決方法はVMWareのサポート掲示板に掲載されいてる

Compiling vmmon module fails on linux kernel 5.16.0-arch1-1 (VMware Technology Network )

mkubecek / vmware-host-modules (GitHub)

This repository tracks patches needed to build VMware (Player and Workstation) host modules against recent kernels. As it focuses on recent kernels (older ones do not need patching), only vmmon and vmnet modules are currently handled as the rest has been upstreamed for some time.
https://github.com/mkubecek/vmware-host-modules

Compiling vmmon module fails on linux kernel 5.16.0-arch1-1」に書かれている方法の通り、GitHubで公開されているvmmon.koとvmnet.koの修正ソースコードをダウンロード、コンパイルしてインストールを行う

適当なワークディレクトリで端末を開き

$ git clone https://github.com/mkubecek/vmware-host-modules.git

$ cd vmware-host-modules/

$ git checkout workstation-16.2.5

$ make VM_UNAME=$(uname -r)

$ make install 

なお、赤で着色した部分のブランチ名はユーザそれぞれのインストールしたVMWareバージョンに合わせて変更すること

(私の場合は、Player 16.2.5をインストールしているが、このGitHubのブランチはworkstation-16.2.5のものを用いている。特に問題なく使えている)

どのバージョンがインストールされているかわからない場合は、端末で次のようにすればよい

$ sudo vmware-installer -l
Product Name         Product Version     
==================== ====================
vmware-player        16.2.5.20904516     

コンパイルされたモジュールファイルが、所定の場所にコピーされたか確認する

$ ll /lib/modules/$(uname -r)/misc
合計 384
drwxr-xr-x 2 root root   4096 2023-09-01 19:36:30 ./
drwxr-xr-x 6 root root   4096 2023-09-01 19:29:30 ../
-rw-r--r-- 1 root root 244724 2023-09-01 19:36:24 vmmon.ko
-rw-r--r-- 1 root root 136036 2023-09-01 19:36:30 vmnet.ko

$(uname -r) ではなく、Linuxバージョンを直接指定してもよいかもしれないし、あるいは次のようなコマンドでも確認できるかもしれない

$ modinfo -n vmmon && modinfo -n vmnet
/lib/modules/6.2.0-31-generic/misc/vmmon.ko
/lib/modules/6.2.0-31-generic/misc/vmnet.ko

重要:UEFIセキュアブートの場合

カーネルモジュールのインストール後、UEFIセキュアブートの場合は『Secure BootのUbuntu 18.04にVMWare Playerをインストールする(自己証明した鍵をUEFI BIOSのMokListに登録する)』の方法により、カーネルモジュールに署名する必要がある

vmware.serviceの再起動

$ systemctl restart vmware
$ systemctl status vmware

ちゃんと起動したか、確認する

$ systemctl status vmware.service
 vmware.service - LSB: This service starts and stops VMware services
     Loaded: loaded (/etc/init.d/vmware; generated)
     Active: active (running) since Sat 2023-09-02 13:49:54 JST; 22min ago
       Docs: man:systemd-sysv-generator(8)
    Process: 1450 ExecStart=/etc/init.d/vmware start (code=exited, status=0/SUC>
      Tasks: 7 (limit: 18787)
     Memory: 11.8M
        CPU: 475ms
     CGroup: /system.slice/vmware.service
             ├─1509 /usr/bin/vmnet-bridge -s 6 -d /var/run/vmnet-bridge-0.pid ->
             ├─1517 /usr/bin/vmnet-netifup -s 6 -d /var/run/vmnet-netifup-vmnet>
             ├─1523 /usr/bin/vmnet-dhcpd -s 6 -cf /etc/vmware/vmnet1/dhcpd/dhcp>
             ├─1526 /usr/bin/vmnet-natd -s 6 -m /etc/vmware/vmnet8/nat.mac -c />
             ├─1528 /usr/bin/vmnet-netifup -s 6 -d /var/run/vmnet-netifup-vmnet>
             ├─1533 /usr/bin/vmnet-dhcpd -s 6 -cf /etc/vmware/vmnet8/dhcpd/dhcp>
             └─1555 /usr/sbin/vmware-authdlauncher

vmware-authdlauncherサービスが起動しない問題を修正

syslogに次のようなメッセージを出力している場合は、vmware-authdlauncherのライブラリ検索パスを強制指定すると起動する場合がある

/var/log/syslog の抜粋
Aug 30 08:36:08 Ubuntu2204M720q VMware-init: /usr/sbin/vmware-authdlauncher: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
Aug 30 08:36:08 Ubuntu2204M720q vmware[1435]:    VMware Authentication Daemon#033[71G done
Aug 30 08:36:08 Ubuntu2204M720q systemd[1]: vmware.service: Control process exited, code=exited, status=1/FAILURE
Aug 30 08:36:08 Ubuntu2204M720q systemd[1]: vmware.service: Failed with result 'exit-code'.

黄色着色部のように、libssl.so.1.1が見つからないというメッセージ

実際に、vmware-authdlauncherが参照している全てのライブラリのうち、いくつが見つからないのか確認してみる

$ ldd /usr/sbin/vmware-authdlauncher
	linux-vdso.so.1 (0x00007ffd8cbe7000)
	librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f7016499000)
	libssl.so.1.1 => not found
	libcrypto.so.1.1 => not found
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7016494000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f7016474000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f701646d000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7015c00000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f70164b9000)

見つからないと指摘されているライブラリ ファイルの存在場所を検索する

$ find /usr/lib -name 'libssl.so*' -print
/usr/lib/i386-linux-gnu/libssl.so.3
/usr/lib/vmware/lib/libssl.so.1.1
/usr/lib/vmware/lib/libssl.so.1.1/libssl.so.1.1
/usr/lib/vmware-ovftool/libssl.so.1.0.2
/usr/lib/x86_64-linux-gnu/libssl.so.3
/usr/lib/x86_64-linux-gnu/android/libssl.so.0

$ find /usr/lib -name 'libcrypto.so*' -print
/usr/lib/i386-linux-gnu/libcrypto.so.3
/usr/lib/vmware/lib/libcrypto.so.1.1
/usr/lib/vmware/lib/libcrypto.so.1.1/libcrypto.so.1.1
/usr/lib/vmware-ovftool/libcrypto.so.1.0.2
/usr/lib/x86_64-linux-gnu/libcrypto.so.3
/usr/lib/x86_64-linux-gnu/android/libcrypto.so.0

ライブラリの直接パスで強制読み込みさせる設定を行うため、次のファイルを作成する

なお、findコマンドで見つかったパスを、単純にコピーしただけ(内容は吟味していない)

/etc/ld.so.conf.d/vmware-authdlauncher.conf
/usr/lib/vmware/lib/libssl.so.1.1
/usr/lib/vmware/lib/libssl.so.1.1/libssl.so.1.1
/usr/lib/vmware/lib/libcrypto.so.1.1
/usr/lib/vmware/lib/libcrypto.so.1.1/libcrypto.so.1.1