しばらく前より、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