vsock.o コンパイル (VMWare)
概要
Fedora Core4上にVMware Workstation 6.5をインストールした時の対応作業メモ。
- Host OS: Fedora Core4
- インストールバージョン: VMware Workstation 6.5 For Linux Build. 118166
現象
VMware Workstation 6.5をインストール後、vmwareを起動すると初回はカーネルモジュールをコンパイルしようとするが、VMCI Sockets(vsock.o)のコンパイルに失敗する。(コンパイルに失敗していてもVMWare自体は動作する模様)
エラーメッセージ
Using 2.6.x kernel build system. make: Entering directory `/tmp/vmware-root/modules/vsock-only' make -C /lib/modules/2.6.11-1.1369_FC4smp/build/include/.. SUBDIRS=$PWD SRCROOT=$PWD/. modules make[1]: Entering directory `/usr/src/kernels/2.6.11-1.1369_FC4-smp-i686' CC [M] /tmp/vmware-root/modules/vsock-only/linux/af_vsock.o /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:331: error: unknown field ‘slab_obj_size’ specified in initializer /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:331: 警告: 初期化子のまわりのブレースを欠いています /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:331: 警告: (near initialization for ‘vsockVmciProto.name’) /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:331: 警告: 暗黙の定数変換でオーバーフローしました /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c: In function ‘__VSockVmciCreate’: /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:2414: error: ‘struct proto’ has no member named ‘slab_obj_size’ /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:2414: 警告: passing argument 4 of ‘sk_alloc’ makes integer from pointer without a cast /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c: In function ‘VSockVmciRegisterProto’: /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:2704: 警告: implicit declaration of function ‘sk_alloc_slab’ /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:2706: 警告: implicit declaration of function ‘sk_alloc_slab_error’ /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c: In function ‘VSockVmciUnregisterProto’: /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:2741: 警告: implicit declaration of function ‘sk_free_slab’ make[2]: *** [/tmp/vmware-root/modules/vsock-only/linux/af_vsock.o] エラー 1 make[1]: *** [_module_/tmp/vmware-root/modules/vsock-only] エラー 2 make[1]: Leaving directory `/usr/src/kernels/2.6.11-1.1369_FC4-smp-i686' make: *** [vsock.ko] エラー 2 make: Leaving directory `/tmp/vmware-root/modules/vsock-only'
エラーの原因
VMCI Socketsのソースコードは/usr/lib/vmware/modules/source/vsock.tarにインストールされており、エラーが発生しているファイルはtarファイル内のaf_vsock.cファイル。この中で以下のようにカーネルのバージョン毎に処理を分けている処理がいくつか存在する(下記)。
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 9) #elif LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 12) .slab_obj_size = sizeof (VSockVmciSock), #else .obj_size = sizeof (VSockVmciSock), #endif
Fedora Core4(2.6.11-1.1369_FC4smp)はKernel 2.6.11がベースなのだが、今回の関連部分は独自に修正されており、Kernel2.6.12以降の処理でコンパイルしてやる必要があった。
対策方針
af_vsock.c内のKernel 2.6.12以降か否かで処理を分けているところを2.6.11以降か否かでチェックするようにして、とりあえず強制的に2.6.12以降の処理でコンパイルされるようにする。修正前: #elif LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 12) 修正後: #elif LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 11)
対策
(1) ソースの展開# cp /usr/lib/vmware/modules/source/vsock.tar . # tar xvf vsock.tar(2) vsock-only/linux/af_vsock.cの編集
330c330 < #elif LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 12) --- > #elif LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 11) 2412c2412 < #elif LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 12) --- > #elif LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 11) 2703c2703 < #elif LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 12) --- > #elif LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 11) 2740c2740 < #elif LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 12) --- > #elif LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 11)(3) コンパイルのテスト
vsock-onlyディレクトリ配下で。 # make Using 2.6.x kernel build system. make -C /lib/modules/2.6.11-1.1369_FC4smp/build/include/.. SUBDIRS=$PWD SRCROOT=$PWD/. modules make[1]: Entering directory `/usr/src/kernels/2.6.11-1.1369_FC4-smp-i686' CC [M] /home/tomita/vsock-only/linux/af_vsock.o CC [M] /home/tomita/vsock-only/linux/driverLog.o CC [M] /home/tomita/vsock-only/linux/util.o CC [M] /home/tomita/vsock-only/linux/vsockAddr.o LD [M] /home/tomita/vsock-only/vsock.o Building modules, stage 2. MODPOST *** Warning: "VMCIDatagram_CreateHnd" [/home/tomita/vsock-only/vsock.ko] undefined! *** Warning: "VMCIDatagram_DestroyHnd" [/home/tomita/vsock-only/vsock.ko] undefined! *** Warning: "VMCI_GetContextID" [/home/tomita/vsock-only/vsock.ko] undefined! *** Warning: "VMCIDatagram_Send" [/home/tomita/vsock-only/vsock.ko] undefined! CC /home/tomita/vsock-only/vsock.mod.o LD [M] /home/tomita/vsock-only/vsock.ko make[1]: Leaving directory `/usr/src/kernels/2.6.11-1.1369_FC4-smp-i686' cp -f vsock.ko ./../vsock.o(4) ごみの削除
# make clean(5) アーカイブしてオリジナルのファイルと差し替え
# tar cvf vsock.tar vsock-only
以下rootで。
# cd /usr/lib/vmware/modules/source/
# mv vsock.tar vsock.tar.org <-- オリジナルのファイルは残しておきましょう
# mv ~tomita/vsock.tar .
(6) vmware起動# vmware &
これで、vsock.oが正常にコンパイルされてvmwareが起動する。
その他
ライセンスを購入しようとしたら、いつのまにか6.5がリリースされていた。6.0の時と異なり上記のようなインストール時のトラブルはあったが、一度入れてしまえば後は快適。vmware-config.plも無くなっており、設定はvmware起動後に行えるなど使い勝手も向上しているみたい。