Fedora42など、Kernelが新しいLinuxではVMware Workstationのカーネルモジュールがコンパイルできず使えません。古いカーネルを使えばコンパイルできるのですが、新しいカーネルでも使いたいので調べました。
Fedora42からはカーネルモジュールへのサインも必須になっています。(無効にもできますが、サインするのは簡単)
そのままコンパイルできるソースは無かった
無かったので最も簡単にコンパイルできるように出来そうなソースコード
https://github.com/64kramsystem/vmware-host-modules-fork
にパッチを作ってコンパイルできるようにしました。
https://github.com/64kramsystem/vmware-host-modules-fork/pull/1
プルリクエストにモジュールにサインする方法を書いているのでその通りにすればOKです。
サインするスクリプト
以下がサインする為に作ったスクリプトです。スクリプトにしたのは、後から見ても何をしなければならないのか、他の人が見ても解るようにするためです。
#!/usr/bin/env bash ## Prerequisite ## Create Mok key for secure boot ## -nodes is removed, since mokutil requires passphrase more than 1 char. Passphrase is asked by this command #cd /usr/lib/vmware/modules/source #openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -days 36500 -subj "/CN=VMware/" ## Create password less key for convenience #openssl rsa -in MOK.priv -passin pass:passphrase -out MOK.priv.unencrypted ## Import Mok key for secure boot. You'll be asked by UEFI secure boot to import this key or you have to import this key via UEFI menu. ## You only have to import key once, but new kernel modules must be signed always. Otherwise, kernel refuses to load module. #mokutil --import MOK.der ## Newly compiled modules must be signed /usr/src/kernels/$(uname -r)/scripts/sign-file sha256 ./MOK.priv.unencrypted ./MOK.der $(modinfo -n vmmon) /usr/src/kernels/$(uname -r)/scripts/sign-file sha256 ./MOK.priv.unencrypted ./MOK.der $(modinfo -n vmnet)
スクリプトに書いてあるコメント通りです。
cd /usr/lib/vmware/modules/source
openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -days 36500 -subj "/CN=VMware/"
パスフレーズがあると起動に困るので無しの鍵を作ります。
openssl rsa -in MOK.priv -passin pass:passphrase -out MOK.priv.unencrypted
として鍵を生成し、UEFIに鍵を登録します。
mokutil --import MOK.der
鍵を安全な場所に置いた方が良い場合は安全な場所に移します。
サインするのはスクリプトに書いてある様に
/usr/src/kernels/$(uname -r)/scripts/sign-file sha256 ./MOK.priv.unencrypted ./MOK.der $(modinfo -n vmmon)
/usr/src/kernels/$(uname -r)/scripts/sign-file sha256 ./MOK.priv.unencrypted ./MOK.der $(modinfo -n vmnet)
とします。
サインするだけだと面倒なのでビルドもするスクリプト
Kenerlが新しくなるとモジュールにサインする前にビルドが必要なので、ビルドしてサインするスクリプトがこちらです。
vmware-modconfig --console --install-all
とvmware-modconfigを使ってビルドしているのでsystemctl restart vmwareが動作します。当然ですがビルドしたてのモジュールはサインされていないのでvmwareサービス起動エラーは無視してください。
#!/usr/bin/env bash
## Prerequisite
## Create Mok key for secure boot
## -nodes is removed, since mokutil requires passphrase more than 1 char. Passphrase is asked by this command
#cd /usr/lib/vmware/modules/source
#openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -days 36500 -subj "/CN=VMware/"
## Create password less key for convenience
#openssl rsa -in MOK.priv -passin pass:passphrase -out MOK.priv.unencrypted
## Import Mok key for secure boot. You'll be asked by UEFI secure boot to import this key or you have to import this key via UEFI menu.
## You only have to import key once, but new kernel modules must be signed always. Otherwise, kernel refuses to load module.
#mokutil --import MOK.der
echo "Building modules. Ignore systemd error."
vmware-modconfig --console --install-all
echo "Unsigned module cannot be loaded. Ignore systemd error."
echo "####################################################"
echo "Sign VMware modules."
## Newly compiled modules must be signed
/usr/src/kernels/$(uname -r)/scripts/sign-file sha256 ./MOK.priv.unencrypted ./MOK.der $(modinfo -n vmmon)
/usr/src/kernels/$(uname -r)/scripts/sign-file sha256 ./MOK.priv.unencrypted ./MOK.der $(modinfo -n vmnet)
echo "####################################################"
echo "Start vmware service."
systemctl start vmware
if [[ $? -ne 0 ]]; then
echo "Failed to start vmware service."
else
echo "VMware service started."
fi
既知の問題
ブリッジネットワークだとヌルポインターデリファレンスが発生して使えません。NATネットワークは問題なく使えています。
ヌルポインターデリファレンスはソースを少し追えば原因が判って直せるかも知れませんが、そこまで労力がないです。