修复kernel 3.5+ 在vmware-player 5.0 升级后没法启动虚拟机的问题

Bug表现:

升级VMware player 5.0之后,发现所有虚拟机都没法启动了,系统日志里显示:

Aug 29 12:16:24 lex-work kernel: [57374.361845] CPU 4 
Aug 29 12:16:24 lex-work kernel: [57374.361846] Modules linked in: vmmon(O) vmnet(O) parport_pc vsock(O) vmci(O) tpm_bios ip6table_filter ip6_tables ebtable_nat ebtables ipt_MASQUERADE iptable_nat nf_nat nf_conntrack_ipv4 nf_defrag_ipv4 xt_state nf_conntrack ppdev parport xt_CHECKSUM iptable_mangle fuse bridge stp llc bnep bluetooth lockd sunrpc rfkill be2iscsi iscsi_boot_sysfs bnx2i cnic uio cxgb4i cxgb4 cxgb3i cxgb3 mdio libcxgbi ib_iser rdma_cm ib_addr iw_cm ib_cm ib_sa ib_mad ib_core iscsi_tcp libiscsi_tcp libiscsi scsi_transport_iscsi binfmt_misc nvidia(PO) r8169 snd_hda_codec_hdmi mii vhost_net tun macvtap macvlan snd_hda_codec_realtek coretemp i2c_i801 mei kvm_intel i2c_core snd_hda_intel snd_hda_codec snd_hwdep snd_pcm snd_page_alloc snd_timer snd soundcore lpc_ich mfd_core kvm serio_raw microcode uinput crc32c_intel ghash_clmulni_intel [last unloaded: vmmon]
Aug 29 12:16:24 lex-work kernel: [57374.361878] 
Aug 29 12:16:24 lex-work kernel: [57374.361880] Pid: 15883, comm: vmware-vmx Tainted: P      D    O 3.5.1-1.fc17.x86_64 #1 Gigabyte Technology Co., Ltd. Z68M-D2H/Z68M-D2H
Aug 29 12:16:24 lex-work kernel: [57374.361882] RIP: 0010:[]  [] HostIF_SafeRDMSR+0xf/0x30 [vmmon]
Aug 29 12:16:24 lex-work kernel: [57374.361887] RSP: 0018:ffff88018cebbb88  EFLAGS: 00010246
Aug 29 12:16:24 lex-work kernel: [57374.361888] RAX: 0000000000000000 RBX: 0000000000000001 RCX: 0000000000000491
Aug 29 12:16:24 lex-work kernel: [57374.361889] RDX: 0000000000000000 RSI: ffff88034865bf10 RDI: 0000000000000491
Aug 29 12:16:24 lex-work kernel: [57374.361889] RBP: ffff88018cebbb88 R08: ffff88041f516630 R09: ffffffffa0f7f872
Aug 29 12:16:24 lex-work kernel: [57374.361890] R10: 00000000000000c8 R11: 0000000000003246 R12: 0000000000000000
Aug 29 12:16:24 lex-work kernel: [57374.361891] R13: ffff88034865bf00 R14: ffff88034865bf00 R15: 00007fff4b195800
Aug 29 12:16:24 lex-work kernel: [57374.361892] FS:  00007f91f72c8740(0000) GS:ffff88041f500000(0000) knlGS:0000000000000000
Aug 29 12:16:24 lex-work kernel: [57374.361893] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
Aug 29 12:16:24 lex-work kernel: [57374.361894] CR2: 000000000099ca10 CR3: 00000003159f3000 CR4: 00000000000407e0
Aug 29 12:16:24 lex-work kernel: [57374.361895] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
Aug 29 12:16:24 lex-work kernel: [57374.361896] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Aug 29 12:16:24 lex-work kernel: [57374.361897] Process vmware-vmx (pid: 15883, threadinfo ffff88018ceba000, task ffff88032f6dae20)
Aug 29 12:16:24 lex-work kernel: [57374.361897] Stack:
Aug 29 12:16:24 lex-work kernel: [57374.361898]  ffff88018cebbbb8 ffffffffa0f81c23 ffffffffa0f81ba0 ffff88018cebbbe8
Aug 29 12:16:24 lex-work kernel: [57374.361900]  ffff88034865bf00 0000000000000000 ffff88018cebbbd8 ffffffffa0f80980
Aug 29 12:16:24 lex-work kernel: [57374.361902]  ffff88034865bf00 00000000fffffff4 ffff88018cebbc08 ffffffffa0f83a1c
Aug 29 12:16:24 lex-work kernel: [57374.361904] Call Trace:
Aug 29 12:16:24 lex-work kernel: [57374.361907]  [] Vmx86GetMSR+0x83/0xd0 [vmmon]
Aug 29 12:16:24 lex-work kernel: [57374.361909]  [] ? Vmx86GetUnavailPerfCtrsOnCPU+0x150/0x150 [vmmon]
Aug 29 12:16:24 lex-work kernel: [57374.361912]  [] HostIF_CallOnEachCPU+0x20/0x40 [vmmon]
Aug 29 12:16:24 lex-work kernel: [57374.361914]  [] Vmx86_GetAllMSRs+0x2c/0x50 [vmmon]
Aug 29 12:16:24 lex-work kernel: [57374.361916]  [] LinuxDriver_Ioctl+0x70f/0xd40 [vmmon]
Aug 29 12:16:24 lex-work kernel: [57374.361919]  [] ? unlock_page+0x31/0x50
Aug 29 12:16:24 lex-work kernel: [57374.361922]  [] ? __do_fault+0x3f9/0x560
Aug 29 12:16:24 lex-work kernel: [57374.361924]  [] ? handle_pte_fault+0x95/0xb10
Aug 29 12:16:24 lex-work kernel: [57374.361927]  [] ? ext4_file_write+0xbf/0x260
Aug 29 12:16:24 lex-work kernel: [57374.361929]  [] ? handle_mm_fault+0x259/0x320
Aug 29 12:16:24 lex-work kernel: [57374.361932]  [] ? do_page_fault+0x1bc/0x4b0
Aug 29 12:16:24 lex-work kernel: [57374.361934]  [] LinuxDriver_UnlockedIoctl+0x18/0x20 [vmmon]
Aug 29 12:16:24 lex-work kernel: [57374.361936]  [] do_vfs_ioctl+0x99/0x580
Aug 29 12:16:24 lex-work kernel: [57374.361938]  [] sys_ioctl+0x99/0xa0
Aug 29 12:16:24 lex-work kernel: [57374.361940]  [] system_call_fastpath+0x16/0x1b
Aug 29 12:16:24 lex-work kernel: [57374.361941] Code: 83 c4 01 e8 94 14 1b e0 44 89 e0 48 3b 43 08 72 e9 48 89 df e8 03 22 1f e0 eb 9e 90 55 48 89 e5 66 66 66 66 90 31 c0 89 c2 89 f9  32 31 ff 41 89 c0 48 c1 e2 20 89 f8 4c 09 c2 48 89 16 5d c3 
Aug 29 12:16:24 lex-work kernel: [57374.361958] RIP  [] HostIF_SafeRDMSR+0xf/0x30 [vmmon]
Aug 29 12:16:24 lex-work kernel: [57374.361960]  RSP 
Aug 29 12:16:24 lex-work kernel: [57374.361962] ---[ end trace be6123e031a11d66 ]---```

**问题原因:**

搜索得知是vmware modules驱动vmmon使用的异常表和老的kernel 兼容,但是新的kernel改了异常表结构,所以没法使用了。

**解决方案:**

在<http://pastebin.com/TTXqsjbc> 下载patch,保存后,进入 /usr/lib/vmware/modules/source 目录,执行:

```$ sudo tar xf vmmon.tar
$ cd vmmon-only/
$ sudo patch -p1 &lt; patch
$ make
$ cd ..
$ sudo tar cf vmmon.tar vmmon-only```

make生成了vmmon.ko驱动文件,后面重新打包成vmmon.tar是方便以后更新内核后vmware自动编译。  
然后使用新的驱动:

```$ sudo rmmod vmmon
$ sudo cp vmmon-only/vmmon.ko /usr/lib/modules/3.5.1-1.fc17.x86_64/misc
$ sudo modprobe vmmon

再打开VMWare Player,启动虚拟机,一切正常。


Last modified on 2012-08-29