試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

VMware Player 2.0.5 Build 109488のカーネルモジュールがLinux 2.6.27に対してビルドできない件とその対処

  1. VMware Server 2とVMware Player 2.5 Build 118166では問題なし
  2. VMware Player 2.0.5 Build 109488ではエラーが出る
  3. パッチ
  4. vmblockについて

VMware Server 2とVMware Player 2.5 Build 118166では問題なし

2008年9月に出たVMware Serverのバージョン2系では、Liunx 2.6.27でのビルドの問題はない。
(2008/11/3)更に、VMware Playerのバージョン2.5(Build 118166)でも問題がなくなっている。2008/11/3現在
www.vmware.com/jp/download/player/
のページには書かれていないが
www.vmware.com/download/player/
にはバージョン2.5について書かれている。

VMware Player 2.0.5 Build 109488ではエラーが出る

2008年10月9月*1の時点では、最新のVMware Player(2.0.5 Build 109488)を使用した場合でもビルドエラーが出る。

Using 2.6.x kernel build system.
make -C /usr/src/linux M=$PWD SRCROOT=$PWD/. modules
make[1]: Entering directory `/usr/src/linux-2.6.27-gentoo'
make[1]: warning: jobserver unavailable: using -j1.  Add `+' to parent make rule
. 
  CC [M]  /var/tmp/portage/app-emulation/vmware-modules-1.0.0.22/work/vmmon-only
/linux/driver.o
In file included from /var/tmp/portage/app-emulation/vmware-modules-1.0.0.22/wor
k/vmmon-only/./include/x86.h:24,
                 from /var/tmp/portage/app-emulation/vmware-modules-1.0.0.22/wor
k/vmmon-only/linux/driver.h:15,
                 from /var/tmp/portage/app-emulation/vmware-modules-1.0.0.22/work/vmmon-only/linux/driver.c:84:
/var/tmp/portage/app-emulation/vmware-modules-1.0.0.22/work/vmmon-only/./include/x86paging.h:61:1: warning: "PTE_PFN_MASK" redefined
In file included from include/asm/pda.h:8,
                 from include/asm/current.h:19,
                 from include/asm/processor.h:15,
                 from include/linux/prefetch.h:14,
                 from include/linux/list.h:6,
                 from include/linux/module.h:9,
                 from /var/tmp/portage/app-emulation/vmware-modules-1.0.0.22/work/vmmon-only/linux/driver.c:12:
include/asm/page.h:22:1: warning: this is the location of the previous definition 
In file included from /var/tmp/portage/app-emulation/vmware-modules-1.0.0.22/work/vmmon-only/linux/vmhost.h:13,
                 from /var/tmp/portage/app-emulation/vmware-modules-1.0.0.22/work/vmmon-only/linux/driver.c:115:
/var/tmp/portage/app-emulation/vmware-modules-1.0.0.22/work/vmmon-only/./include/compat_semaphore.h:5:27: error: asm/semaphore.h: No such file or directory
make[3]: *** [/var/tmp/portage/app-emulation/vmware-modules-1.0.0.22/work/vmmon-only/linux/driver.o] Error 1
make[2]: *** [_module_/var/tmp/portage/app-emulation/vmware-modules-1.0.0.22/work/vmmon-only] Error 2
make[1]: *** [sub-make] Error 2
make[1]: Leaving directory `/usr/src/linux-2.6.27-gentoo'
make: *** [vmmon.ko] Error 2

any-any-updateを探してもパッチはなかった。

パッチ

大変ありがたいことに
bugs.gentoo.org/show_bug.cgi?id=242098
パッチ(1.0.0.22-kernel-2.6.27.patch)があり、これをVMware Playerのバージョン2.0.5 Build 109488に含まれるモジュールのソースへ適用することで上記ビルドエラーは解消された。*2ebuildへの修正もアップロードされている。
Gentoo以外では、lib/modules/source以下にある、各モジュール(vmmonとvmnet)のtarファイルを展開してパッチを当て、再びtarファイルにまとめて元のファイルと置き換えることで適用することになりそう。

vmblockについて

上記パッチだけではvmblockが動かない。

 * Loading vmblock for drag and drop support ...
/etc/init.d/vmware: line 63: 32446 強制終了            mount -t vmblock none /proc/fs/vmblock/mountPoint
 * Failed to mount the vmblock filesystem                                 [ ok ]

手動でマウント操作をしてもダメ。

$ sudo mount -t vmblock none /proc/fs/vmblock/mountPoint
強制終了

原因は

  CC [M]  /var/tmp/portage/app-emulation/vmware-modules-1.0.0.22/work/vmblock-only/linux/filesystem.o
/var/tmp/portage/app-emulation/vmware-modules-1.0.0.22/work/vmblock-only/linux/filesystem.c: In function 'VMBlockInitFileSystem':
/var/tmp/portage/app-emulation/vmware-modules-1.0.0.22/work/vmblock-only/linux/filesystem.c:121: warning: passing argument 5 of 'kmem_cache_create' from incompatible pointer type

この部分と思われ(2.6.26ではこのファイルに対して警告は出ていない)、ソースの該当部分をダメ元で見たのだが、似たようなエラーから
http://web.archive.org/web/20091025124753/http://www.nabble.com/2.6.27-rc3:-squashfs-error-td19063795.html
などを参考にしつつ、下のような修正をしたところ、この警告はなくなって動作もするようになった。
[任意]ファイル名: vmblock-kernel-2.6.27.patch

(this patch is public domain)
diff -ur vmblock-only.orig/include/compat_slab.h vmblock-only/include/compat_slab.h
--- vmblock-only.orig/include/compat_slab.h
+++ vmblock-only/include/compat_slab.h
@@ -42,11 +42,17 @@
  */
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 23) && !defined(VMW_KMEMCR_CTOR_HAS_3_ARGS)
 #  define VMW_KMEMCR_CTOR_HAS_3_ARGS
+#elif LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 27) && !defined(VMW_KMEMCR_CTOR_HAS_2_ARGS)
+#  define VMW_KMEMCR_CTOR_HAS_2_ARGS
 #endif
 #ifdef VMW_KMEMCR_CTOR_HAS_3_ARGS
 typedef void compat_kmem_cache_ctor(void *, compat_kmem_cache *, unsigned long);
 #else
+#  ifdef VMW_KMEMCR_CTOR_HAS_2_ARGS
 typedef void compat_kmem_cache_ctor(compat_kmem_cache *, void *);
+#  else
+typedef void compat_kmem_cache_ctor(void *);
+#  endif
 #endif
 
 #endif /* __COMPAT_SLAB_H__ */
diff -ur vmblock-only.orig/linux/filesystem.c vmblock-only/linux/filesystem.c
--- vmblock-only.orig/linux/filesystem.c
+++ vmblock-only/linux/filesystem.c
@@ -403,9 +403,14 @@
                compat_kmem_cache *cache, // IN: cache slab is from
                unsigned long flags)      // IN: flags associated with allocation
 #else
+#  ifdef VMW_KMEMCR_CTOR_HAS_2_ARGS
 static void
 InodeCacheCtor(compat_kmem_cache *cache, // IN: cache slab is from
                void *slabElem)           // IN: allocated slab item to initialize
+#  else
+static void
+InodeCacheCtor(void *slabElem)           // IN: allocated slab item to initialize
+#  endif
 #endif
 {
 #ifdef VMW_EMBED_INODE

(2008/11/6)条件分岐の書き方が不正だったのを修正

使用したバージョン:

*1:9/23付けでバージョン2.5は出ていた

*2:ビルド時にvmmonで結構警告は出ているようなので、気にはなるが...