Fedora 20(Kernel 3.14.x用)のパッチ済みVmware Workstation 9モジュール

7月 4, 2014 Computer, Linux
(Last Updated On: 2018年8月4日)

モジュールにパッチを当てていたことを忘れてVmware Workstation 9をバージョンアップしてしまいました。当然ですがモジュールがビルドできないので使えない状態になってしまいました。現在、利用しているVmware Workstation 9用のパッチは検索しても簡単には見つからないようなので、手元に残っていたモジュールソースのアーカイブを利用して使えるようにしました。

かなり無責任なエントリですが、Linux 3.14カーネルとVmware Workstationを利用されている方なら参考にはなると思います。また忘れそうなので自分用のメモです。

Vmware Workstation 9のモジュールソースコードがFedora 20のカーネル(現在利用しているカーネルは3.14.8-200。3.14なら古いバージョンでも利用可能なはずです)に対応していないからです。以下のモジュールソースコードは確か9.0.2用に作ったtarアーカイブだったと思います。

モジュールソースコード : vmware9-fedora20-modules

使い方は以下の通りです。

[root@dev tmp]# unzip vmware9-fedora20-modules.zip
Archive:  vmware9-fedora20-modules.zip
   creating: vmware9-fedora20-modules/
  inflating: vmware9-fedora20-modules/vmblock.tar  
  inflating: vmware9-fedora20-modules/vmci.tar  
  inflating: vmware9-fedora20-modules/vmmon.tar  
  inflating: vmware9-fedora20-modules/vmnet.tar  
  inflating: vmware9-fedora20-modules/vsock.tar  


# バックアップが必要なら、コピーの前に保存してください
[root@dev tmp]# cp -f vmware9-fedora20-modules/vmnet.tar /usr/lib/vmware/modules/source/
[root@dev tmp]# vmware-modconfig --console --install-all
(省略)
  LD [M]  /tmp/modconfig-7ElOlC/vmnet-only/vmnet.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /tmp/modconfig-7ElOlC/vmnet-only/vmnet.mod.o
  LD [M]  /tmp/modconfig-7ElOlC/vmnet-only/vmnet.ko
make[1]: ディレクトリ `/usr/src/kernels/3.14.8-200.fc20.x86_64' から出ます
/bin/make -C $PWD SRCROOT=$PWD/. \
  MODULEBUILDDIR= postbuild
make[1]: ディレクトリ `/tmp/modconfig-7ElOlC/vmnet-only' に入ります
make[1]: `postbuild' は更新済みです
make[1]: ディレクトリ `/tmp/modconfig-7ElOlC/vmnet-only' から出ます
cp -f vmnet.ko ./../vmnet.o
make: ディレクトリ `/tmp/modconfig-7ElOlC/vmnet-only' から出ます
Starting vmware (via systemctl):                           [  OK  ]
[root@dev tmp]#

最後にsystemctlがvmwareサービスの起動が成功すれば完了です。普通にVmware Workstation 9が利用できるはずです。

ビルドできない場合、

ln -s /usr/src/kernels/$(uname -r)/include/generated/uapi/linux/version.h /usr/src/kernels/$(uname -r)/include/linux/version.h

が必要かも知れません。

ビルドパッチ以外の差分もあるかも知れません。気になる方はオリジナルのソースとの差分で確認してください。ファイルサイズで確認したところ、vmnet.tarだけ異るようです。利用は自己責任でお願いします。

パッチの内容は恐らく以下の内容です。恐らく、という理由は古いFedora用のパッチも保存していたので、別のパッチも手元に残っていたからです。ざっとネットを眺めた感じではVmware Workstation 10でも3.14カーネルだと同じパッチが必要なようです。

--- vmnet-only/filter.c 2013-10-18 15:11:55.000000000 -0400
+++ vmnet-only/filter.c 2013-12-21 20:15:15.000000000 -0500
@@ -27,6 +27,7 @@
 #include "compat_module.h"
 #include <linux/mutex.h>
 #include <linux/netdevice.h>
+#include <linux/version.h>
 #if COMPAT_LINUX_VERSION_CHECK_LT(3, 2, 0)
 #   include <linux/module.h>
 #else
@@ -203,7 +204,11 @@
 #endif

 static unsigned int
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0)
 VNetFilterHookFn(unsigned int hooknum,                 // IN:
+#else
+VNetFilterHookFn(const struct nf_hook_ops *ops,        // IN:
+#endif
 #ifdef VMW_NFHOOK_USES_SKB
                  struct sk_buff *skb,                  // IN:
 #else
@@ -252,7 +257,12 @@

    /* When the host transmits, hooknum is VMW_NF_INET_POST_ROUTING. */
    /* When the host receives, hooknum is VMW_NF_INET_LOCAL_IN. */
-   transmit = (hooknum == VMW_NF_INET_POST_ROUTING);
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0)
+    transmit = (hooknum == VMW_NF_INET_POST_ROUTING);
+#else
+    transmit = (ops->hooknum == VMW_NF_INET_POST_ROUTING);
+#endif

    packetHeader = compat_skb_network_header(skb);
    ip = (struct iphdr*)packetHeader;

 

追記:

少なくとも私の環境では Fedora20 + Kernel 3.15.x は安定していないようです。VMwareが使えないのではなく、ホストのカーネル(VMではなくホストのカーネル)がクラッシュします。このため、しばらくは3.14を使うつもりです。

投稿者: yohgaki