Install VMware Player 6.0.3 in CentOS 7

Recently found an old machine in a dusty corner, an Antholon64 2600+, slow but support hyper VT, perfect for running a virtual machine.

It appears good that AMD support high desity DDR2 so can buy some cheap memory in ebay, $40 for 8GB, only half price of normal memory.

Installed the newest CentOS 7, too new to find packages in repo. finally managed to get most of them done.

Downloaded VMware-Player-6.0.3-1895310.x86_64.bundle from vmware official site.

Install fine. First running failed. Check the log file in /tmp/vmware-root/vmware-modconfig-16392.log:

2014-07-25T21:29:05.141+10:00| vthread-3| I120: using /usr/bin/gcc for preprocess check
2014-07-25T21:29:05.153+10:00| vthread-3| I120: Preprocessed UTS_RELEASE, got value "3.10.0-123.el7.x86_64".
2014-07-25T21:29:05.153+10:00| vthread-3| I120: The header path "/lib/modules/3.10.0-123.el7.x86_64/build/include" for the kernel "3.10.0-123.el7.x86_64" is valid.  Whoohoo!
2014-07-25T21:29:05.181+10:00| vthread-3| I120: The GCC version matches the kernel GCC minor version like a glove.
2014-07-25T21:29:05.181+10:00| vthread-3| I120: Validating path "/lib/modules/3.10.0-123.el7.x86_64/build/include" for kernel release "3.10.0-123.el7.x86_64".
2014-07-25T21:29:05.181+10:00| vthread-3| I120: Failed to find /lib/modules/3.10.0-123.el7.x86_64/build/include/linux/version.h
2014-07-25T21:29:05.181+10:00| vthread-3| I120: /lib/modules/3.10.0-123.el7.x86_64/build/include/linux/version.h not found, looking for generated/uapi/linux/version.h instead.
2014-07-25T21:29:05.181+10:00| vthread-3| I120: using /usr/bin/gcc for preprocess check
2014-07-25T21:29:05.197+10:00| vthread-3| I120: Preprocessed UTS_RELEASE, got value "3.10.0-123.el7.x86_64".
2014-07-25T21:29:05.197+10:00| vthread-3| I120: The header path "/lib/modules/3.10.0-123.el7.x86_64/build/include" for the kernel "3.10.0-123.el7.x86_64" is valid.  Whoohoo!
2014-07-25T21:29:05.197+10:00| vthread-3| I120: Using temp dir "/tmp".
2014-07-25T21:29:05.199+10:00| vthread-3| I120: Obtaining info using the running kernel.
2014-07-25T21:29:05.199+10:00| vthread-3| I120: Setting header path for 3.10.0-123.el7.x86_64 to "/lib/modules/3.10.0-123.el7.x86_64/build/include".
2014-07-25T21:29:05.199+10:00| vthread-3| I120: Validating path "/lib/modules/3.10.0-123.el7.x86_64/build/include" for kernel release "3.10.0-123.el7.x86_64".
2014-07-25T21:29:05.199+10:00| vthread-3| I120: Failed to find /lib/modules/3.10.0-123.el7.x86_64/build/include/linux/version.h
2014-07-25T21:29:05.199+10:00| vthread-3| I120: /lib/modules/3.10.0-123.el7.x86_64/build/include/linux/version.h not found, looking for generated/uapi/linux/version.h instead.
2014-07-25T21:29:05.199+10:00| vthread-3| I120: using /usr/bin/gcc for preprocess check
2014-07-25T21:29:05.211+10:00| vthread-3| I120: Preprocessed UTS_RELEASE, got value "3.10.0-123.el7.x86_64".
2014-07-25T21:29:05.211+10:00| vthread-3| I120: The header path "/lib/modules/3.10.0-123.el7.x86_64/build/include" for the kernel "3.10.0-123.el7.x86_64" is valid.  Whoohoo!
2014-07-25T21:29:05.435+10:00| vthread-3| I120: Invoking modinfo on "vmnet".
2014-07-25T21:29:05.440+10:00| vthread-3| I120: "/sbin/modinfo" exited with status 256.
2014-07-25T21:29:05.615+10:00| vthread-3| I120: Setting destination path for vmnet to "/lib/modules/3.10.0-123.el7.x86_64/misc/vmnet.ko".
2014-07-25T21:29:05.615+10:00| vthread-3| I120: Extracting the vmnet source from "/usr/lib/vmware/modules/source/vmnet.tar".
2014-07-25T21:29:05.681+10:00| vthread-3| I120: Successfully extracted the vmnet source.
2014-07-25T21:29:05.682+10:00| vthread-3| I120: Building module with command "/usr/bin/make -j2 -C /tmp/modconfig-j0FvbF/vmnet-only auto-build HEADER_DIR=/lib/modules/3.10.0-123.el7.x86_64/build/include CC=/usr/bin/gcc IS_GCC_3=no"
2014-07-25T21:29:12.543+10:00| vthread-3| W110: Failed to build vmnet.  Failed to execute the build command.

At first I was attracted by the missing linux/version.h, so found it's not a big deal. then move to /usr/lib/vmware/modules/source/vmnet.tar

root:/usr/lib/vmware/modules/source# ls
vmblock.tar  vmci.tar  vmmon.tar  vmnet.tar  vsock.tar
root:/usr/lib/vmware/modules/source# tar xf vmnet.tar
root:/usr/lib/vmware/modules/source# ls
vmblock.tar  vmci.tar  vmmon.tar  vmnet-only  vmnet.tar  vsock.tar
root:/usr/lib/vmware/modules/source# mv vmnet.tar vmnet.tar.buggy
root:/usr/lib/vmware/modules/source# cd vmnet-only
root:/usr/lib/vmware/modules/source/vmnet-only# ls
bridge.c            driver.c         monitorAction_exported.h  smac_compat.c          vm_basic_defs.h      vnetEvent.h
community_source.h  driver-config.h  netdev_has_dev_net.c      smac_compat.h          vm_basic_types.h     vnetFilter.h
compat_autoconf.h   filter.c         netdev_has_net.c          smac.h                 vm_device_version.h  vnetFilterInt.h
compat_module.h     geninclude.c     net.h                     userif.c               vmnetInt.h           vnet.h
compat_netdevice.h  hub.c            netif.c                   vm_assert.h            vm_oui.h             vnetInt.h
compat_skbuff.h     includeCheck.h   nfhook_uses_skb.c         vm_atomic.h            vmware_pack_begin.h  vnetKernel.h
compat_sock.h       Makefile         procfs.c                  vm_basic_asm.h         vmware_pack_end.h    vnetUserListener.c
compat_version.h    Makefile.kernel  skblin.c                  vm_basic_asm_x86_64.h  vmware_pack_init.h   x86cpuid.h
COPYING             Makefile.normal  smac.c                    vm_basic_asm_x86.h     vnetEvent.c

not bad, there's source codes. try to compile it

root:/usr/lib/vmware/modules/source/vmnet-only# make
Using 2.6.x kernel build system.
make -C /lib/modules/3.10.0-123.el7.x86_64/build/include/.. SUBDIRS=$PWD SRCROOT=$PWD/. \
  MODULEBUILDDIR= modules
make[1]: Entering directory `/usr/src/kernels/3.10.0-123.el7.x86_64'
  CC [M]  /usr/lib/vmware/modules/source/vmnet-only/driver.o
  CC [M]  /usr/lib/vmware/modules/source/vmnet-only/hub.o
  CC [M]  /usr/lib/vmware/modules/source/vmnet-only/userif.o
  CC [M]  /usr/lib/vmware/modules/source/vmnet-only/netif.o
  CC [M]  /usr/lib/vmware/modules/source/vmnet-only/bridge.o
  CC [M]  /usr/lib/vmware/modules/source/vmnet-only/filter.o
/usr/lib/vmware/modules/source/vmnet-only/filter.c:209:1: error: conflicting types for ‘VNetFilterHookFn’
 VNetFilterHookFn(unsigned int hooknum,                 // IN:
 ^
/usr/lib/vmware/modules/source/vmnet-only/filter.c:64:18: note: previous declaration of ‘VNetFilterHookFn’ was here
 static nf_hookfn VNetFilterHookFn;
                  ^
/usr/lib/vmware/modules/source/vmnet-only/filter.c:64:18: warning: ‘VNetFilterHookFn’ used but never defined [enabled by default]
/usr/lib/vmware/modules/source/vmnet-only/filter.c:209:1: warning: ‘VNetFilterHookFn’ defined but not used [-Wunused-function]
 VNetFilterHookFn(unsigned int hooknum,                 // IN:
 ^
make[2]: *** [/usr/lib/vmware/modules/source/vmnet-only/filter.o] Error 1
make[1]: *** [_module_/usr/lib/vmware/modules/source/vmnet-only] Error 2
make[1]: Leaving directory `/usr/src/kernels/3.10.0-123.el7.x86_64'
make: *** [vmnet.ko] Error 2
root:/usr/lib/vmware/modules/source/vmnet-only#

Googled the VNetFilterHookFn function. It was said since 3.13.5, the netfilter hook function (nf_hookfn) has been changed as the result of code refactoring. However, VNetFilterHookFn is still using the old definition of nf_hookfn. So the fix is t change the definition of VNetFilterHookFn to match the current kernel. vi-ed filter.c and 209gg, found this:


#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0)
VNetFilterHookFn(const struct nf_hook_ops *ops,        // IN:
#else
VNetFilterHookFn(unsigned int hooknum,                 // IN:
#endif

what the hell, the patch has already been there. hold on, what's CentOS 7's version?

andy:~$ uname -a
Linux localhost.localdomain 3.10.0-123.el7.x86_64 #1 SMP Mon Jun 30 12:09:22 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

So that's the reason. The kernel is lower than 3.13.0 so filter.c used the old definition. However RHEL7 must have applied some recent patches so the netfilter hook function has moved to the new one. Let's see how many KERNEL_VERSION have been watched

root:/usr/lib/vmware/modules/source/vmnet-only# grep KERNEL_VERSION *.c
bridge.c:#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22)
bridge.c:#if defined(NETIF_F_GSO) || LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 18)
driver.c:#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 4, 8)
filter.c:#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0)
filter.c:#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0)
netdev_has_dev_net.c:#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 25)
netdev_has_dev_net.c:#elif LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 26)
netdev_has_net.c:#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 23)
netdev_has_net.c:#elif LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24)
nfhook_uses_skb.c:#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 23)
nfhook_uses_skb.c:#elif LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24)
procfs.c:#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)
procfs.c:#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)
procfs.c:#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)
skblin.c:#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 17)

Only two in the filter.c required 3.13.0. Ok, changed them to

#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)

then

root:/usr/lib/vmware/modules/source/vmnet-only# make
Using 2.6.x kernel build system.
make -C /lib/modules/3.10.0-123.el7.x86_64/build/include/.. SUBDIRS=$PWD SRCROOT=$PWD/. \
  MODULEBUILDDIR= modules
make[1]: Entering directory `/usr/src/kernels/3.10.0-123.el7.x86_64'
  CC [M]  /usr/lib/vmware/modules/source/vmnet-only/filter.o
  CC [M]  /usr/lib/vmware/modules/source/vmnet-only/procfs.o
  CC [M]  /usr/lib/vmware/modules/source/vmnet-only/smac_compat.o
  CC [M]  /usr/lib/vmware/modules/source/vmnet-only/smac.o
  CC [M]  /usr/lib/vmware/modules/source/vmnet-only/vnetEvent.o
  CC [M]  /usr/lib/vmware/modules/source/vmnet-only/vnetUserListener.o
  LD [M]  /usr/lib/vmware/modules/source/vmnet-only/vmnet.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /usr/lib/vmware/modules/source/vmnet-only/vmnet.mod.o
  LD [M]  /usr/lib/vmware/modules/source/vmnet-only/vmnet.ko
make[1]: Leaving directory `/usr/src/kernels/3.10.0-123.el7.x86_64'
make -C $PWD SRCROOT=$PWD/. \
  MODULEBUILDDIR= postbuild
make[1]: Entering directory `/usr/lib/vmware/modules/source/vmnet-only'
make[1]: `postbuild' is up to date.
make[1]: Leaving directory `/usr/lib/vmware/modules/source/vmnet-only'
cp -f vmnet.ko ./../vmnet.o

:-D

Now repack the vmnet.tar. Since vmware runtime will try to make the package, there's no need to clean the objects, probably could boost the install speed

root:/usr/lib/vmware/modules/source# tar cf vmnet.tar vmnet-only
root:/usr/lib/vmware/modules/source# ls
vmblock.tar  vmci.tar  vmmon.tar  vmnet.o  vmnet-only  vmnet.tar  vmnet.tar.buggy  vsock.tar

Then run the vmware player and cross fingers ...... oh ye! succeed! Run some VMs all good.
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值