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

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

VMware製品のカーネルモジュールがLinux 2.6.25に対してビルドできない件とその対処

カーネルのバージョン2.6.25が出ているが、VMware製品のカーネルモジュールがビルドエラーになる。

  1. any-any-updateについて
  2. Linux 2.6.25でのエラー
    1. vmblock
    2. vmmon
    3. vmnet
  3. パッチ
    1. vmblock
    2. vmmon
    3. vmnet

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日」のほうを使用した。

ファイル情報: vmware-any-any-update117.tgz
項目
ファイルサイズ495,418バイト
MD51a23cd8819368c679db895e9a662ffae
SHA-1ba0efdb1f1d3d8242717505245924ed76c953864
また、これとは関係ないが、Gentoo Linuxebuildでは、Linux 2.6.25向けのパッチがPortageツリーに含まれていて、「vmware-modules」をインストールするだけで普通に使用できるようになっている(使用したのは1.0.0.17-r1)。
(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)作業例を修正

ファイル情報: vmware-any-any-update117b.tgz
項目
ファイルサイズ2,488,320バイト
MD544a31089646b843813ad42aef43514be
SHA-167c2bed42edb6c61c5c1782bbd0e833f46b8f376

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」は適用行がずれているが修正に成功したもの。

使用したバージョン:

*1:しかし、今回は対処済みのものが出ていないため、そのままではダメだった