VMware製品のカーネルモジュールがLinux 2.6.25に対してビルドできない件とその対処
カーネルのバージョン2.6.25が出ているが、VMware製品のカーネルモジュールがビルドエラーになる。
any-any-updateについて
LinuxホストのVMware製品を使用するにはカーネルモジュールをビルドして使用することになるが、Linuxカーネルは常に変化し続けているため、カーネルのバージョンが上がったときにモジュールのビルドが通らなくなることがある。VMware製品の場合、vmware-any-any-updateという非公式パッチが存在し、問題が修正されることがある。
2008/4/23の時点では、バージョン116が最新。
groups.google.com/group/vmkernelnewbies/files (リンク切れ)
この他のパッチにより問題が解決することもあるが、これが有名。*1
(2008/5/12)バージョン117が出ているが、vmnetのみエラーが残っている。何故かファイルが2つある(?)が、後にアップロードされた「483.8 KB 5月7日」のほうを使用した。
項目 | 値 |
---|---|
ファイルサイズ | 495,418バイト |
MD5 | 1a23cd8819368c679db895e9a662ffae |
SHA-1 | ba0efdb1f1d3d8242717505245924ed76c953864 |
(2008/5/23)vmware-any-any-update117a.tgzというファイルがあるが、これを使用しても、そのままではvmnetでビルドエラーが出てしまい、追加パッチなしではビルドが通らなかった。
(2008/6/21)vmware-any-any-update117b.tgzというファイルがアップロードされていて、これを使用することで、エラーは全て回避されるように見える。
注意するのは、(手違いなのかは分からないが)このファイルが無圧縮tarファイルであるところ。下は作業例。
$ file vmware-any-any-update117b.tgz vmware-any-any-update117b.tgz: POSIX tar archive (GNU) $ tar xf vmware-any-any-update117b.tgz $ cd vmware-any-any-update117/vmware-any-any-update115/ $ sudo ./runme.pl
以下、動作確認向けな作業例(通常は上のようにrunme.plを使用するのが好ましい)。
$ tar xf vmware-any-any-update117b.tgz $ for f in vmware-any-any-update117/vmware-any-any-update115/*.tar; do tar xf ${f}; done $ for m in vmblock vmmon vmnet; do make -C ${m}-only; done $ [[ -d /lib/modules/$(uname -r)/misc ]] || sudo mkdir /lib/modules/$(uname -r)/misc $ sudo cp vm*-only/*.ko /lib/modules/$(uname -r)/misc/ $ sudo depmod -ae
(2008/6/24)作業例を修正
項目 | 値 |
---|---|
ファイルサイズ | 2,488,320バイト |
MD5 | 44a31089646b843813ad42aef43514be |
SHA-1 | 67c2bed42edb6c61c5c1782bbd0e833f46b8f376 |
Linux 2.6.25でのエラー
vmware-any-any-update 116の中に含まれるモジュールのソースを使用しても、下のようなエラーが出て、ビルドに失敗する。vmblock
Using 2.6.x kernel build system. make -C /lib/modules/2.6.25-gentoo-r1/build/include/.. SUBDIRS=$PWD SRCROOT=$PWD/. modules make[1]: Entering directory `/usr/src/linux-2.6.25-gentoo-r1' CC [M] /tmp/work/vmblock-only/linux/block.o CC [M] /tmp/work/vmblock-only/linux/control.o CC [M] /tmp/work/vmblock-only/linux/dbllnklst.o CC [M] /tmp/work/vmblock-only/linux/dentry.o /tmp/work/vmblock-only/linux/dentry.c: In function 'DentryOpRevalidate': /tmp/work/vmblock-only/linux/dentry.c:115: error: 'struct nameidata' has no member named 'dentry' /tmp/work/vmblock-only/linux/dentry.c:115: error: 'struct nameidata' has no member named 'dentry' /tmp/work/vmblock-only/linux/dentry.c:116: error: implicit declaration of function 'path_release' make[2]: *** [/tmp/work/vmblock-only/linux/dentry.o] Error 1 make[1]: *** [_module_/tmp/work/vmblock-only] Error 2 make[1]: Leaving directory `/usr/src/linux-2.6.25-gentoo-r1' make: *** [vmblock.ko] Error 2
(2008/6/4)VMware Player 2.0.4 build-93057に付属しているカーネルモジュールでは、下の2つはエラーが出ないが、ここのエラーだけは残っている(修正が必要)。
vmmon
Using 2.6.x kernel build system. make -C /lib/modules/2.6.25-gentoo-r1/build/include/.. SUBDIRS=$PWD SRCROOT=$PWD/. modules make[1]: Entering directory `/usr/src/linux-2.6.25-gentoo-r1' CC [M] /tmp/work/vmmon-only/linux/driver.o CC [M] /tmp/work/vmmon-only/linux/driverLog.o CC [M] /tmp/work/vmmon-only/linux/hostif.o /tmp/work/vmmon-only/linux/hostif.c: In function 'HostIF_BrokenCPUHelper': /tmp/work/vmmon-only/linux/hostif.c:3042: warning: passing argument 1 of 'HostIFBrokenCPUHelper' discards qualifiers from pointer target type CC [M] /tmp/work/vmmon-only/common/comport.o CC [M] /tmp/work/vmmon-only/common/cpuid.o CC [M] /tmp/work/vmmon-only/common/hash.o CC [M] /tmp/work/vmmon-only/common/memtrack.o CC [M] /tmp/work/vmmon-only/common/phystrack.o CC [M] /tmp/work/vmmon-only/common/task.o cc1plus: warning: command line option "-Werror-implicit-function-declaration" is valid for C/ObjC but not for C++ cc1plus: warning: command line option "-Wdeclaration-after-statement" is valid for C/ObjC but not for C++ cc1plus: warning: command line option "-Wno-pointer-sign" is valid for C/ObjC but not for C++ cc1plus: warning: command line option "-Wstrict-prototypes" is valid for Ada/C/ObjC but not for C++ In file included from /tmp/work/vmmon-only/common/hostKernel.h:56, from /tmp/work/vmmon-only/common/task.c:30: include/asm/page.h: In function 'pte_t native_make_pte(pteval_t)': include/asm/page.h:128: error: expected primary-expression before ')' token include/asm/page.h:128: error: expected ';' before '{' token include/asm/page.h:128: error: expected primary-expression before '.' token include/asm/page.h:128: error: expected `;' before '}' token make[2]: *** [/tmp/work/vmmon-only/common/task.o] Error 1 make[1]: *** [_module_/tmp/work/vmmon-only] Error 2 make[1]: Leaving directory `/usr/src/linux-2.6.25-gentoo-r1' make: *** [vmmon.ko] Error 2
vmnet
Using 2.6.x kernel build system. make -C /lib/modules/2.6.25-gentoo-r1/build/include/.. SUBDIRS=$PWD SRCROOT=$PWD/. modules make[1]: Entering directory `/usr/src/linux-2.6.25-gentoo-r1' CC [M] /tmp/work/vmnet-only/driver.o CC [M] /tmp/work/vmnet-only/hub.o CC [M] /tmp/work/vmnet-only/userif.o CC [M] /tmp/work/vmnet-only/netif.o CC [M] /tmp/work/vmnet-only/bridge.o /tmp/work/vmnet-only/bridge.c: In function 'VNetBridgeUp': /tmp/work/vmnet-only/bridge.c:949: error: implicit declaration of function 'sock_valbool_flag' make[2]: *** [/tmp/work/vmnet-only/bridge.o] Error 1 make[1]: *** [_module_/tmp/work/vmnet-only] Error 2 make[1]: Leaving directory `/usr/src/linux-2.6.25-gentoo-r1' make: *** [vmnet.ko] Error 2
パッチ
vmmonとvmnetはforums.gentoo.org/viewtopic-p-5066120.html#5066120
にパッチがあり、動作は良好。
コピペの際には、パッチの最後の行の後ろにスペースが入らないようにする。
vmblockは
xiaowoo.jp/cs/cgi/diary/080307
のものが使えた。
vmware-any-any-update 116のモジュールのソースに対してパッチ当てをすることで、全てビルドは通り、動作も良好に見える。
以下は適用例。
vmblock
$ tar xf [vmware-any-any-update116の場所]/vmblock.tar $ cd vmblock-only/ $ patch -p1 < [vmblock-2.6.25-rc3.patchの場所] patching file linux/dentry.c patching file linux/filesystem.c patching file linux/super.c
適用は問題なし。
vmmon
$ tar xf [vmware-any-any-update116の場所]/vmmon.tar $ cd vmmon-only/ $ patch -N -p1 < [030_all_fix-linux-headers.patchの場所] patching file include/vcpuset.h Reversed (or previously applied) patch detected! Skipping patch. 1 out of 1 hunk ignored -- saving rejects to file include/vcpuset.h.rej patching file common/task.c
パッチ作成者が比較したバージョンが古かったのか、適用済み部分が検出された。これを無視するために-Nオプションを付けた実行例を載せた。
vmnet
$ tar xf [vmware-any-any-update116の場所]/vmnet.tar $ cd vmnet-only/ $ patch -p1 < [021_all_wireless_fix.patchの場所] patching file bridge.c Hunk #2 succeeded at 855 (offset 91 lines). patching file filter.c patching file vmnetInt.h Hunk #1 succeeded at 78 with fuzz 2.
「Hunk #[数字] succeeded」は適用行がずれているが修正に成功したもの。
使用したバージョン:
- Linux 2.6.25(gentoo-sources 2.6.25-r1)
- VMware Player 2.0.3.80004
- vmware-any-any-update 116
- GCC 4.2.3
*1:しかし、今回は対処済みのものが出ていないため、そのままではダメだった