通过 dmesg 看到内核信息如下:
kernel: /dev/vmnet: open called by PID 6510 (vmware-vmx)
kernel: RTNL: assertion failed at net/core/dev.c (2595)
kernel:
kernel: Call Trace:
kernel: __dev_set_promiscuity+61/188 __dev_set_promiscuity+0x3d/0xbc
kernel: dev_set_promiscuity+21/45 dev_set_promiscuity+0x15/0x2d
kernel: _end+139070215/2131048980 :vmnet:VNetBridgeStartPromisc+0x21/0x3e
kernel: _end+139063873/2131048980 :vmnet:VNetHubPortsChanged+0xa5/0xbc
kernel: _end+139059259/2131048980 :vmnet:VNetConnect+0xa6/0xac
kernel: _end+139061995/2131048980 :vmnet:VNetFileOpOpen+0xc9/0x166
kernel: chrdev_open+351/406 chrdev_open+0x15f/0x196
kernel: open_namei+670/1527 open_namei+0x29e/0x5f7
kernel: chrdev_open+0/406 chrdev_open+0x0/0x196
kernel: __dentry_open+217/426 __dentry_open+0xd9/0x1aa
kernel: do_filp_open+42/56 do_filp_open+0x2a/0x38
kernel: do_unlinkat+239/331 do_unlinkat+0xef/0x14b
kernel: get_unused_fd_flags+114/287 get_unused_fd_flags+0x72/0x11f
kernel: do_sys_open+70/202 do_sys_open+0x46/0xca
kernel: sysenter_do_call+27/103 sysenter_do_call+0x1b/0x67
解决办法:
1. 进入/usr/lib/vmware/modules/source目录,解压 vmnet.tar, 生成vmnet-only目录
# cd /usr/lib/vmware/modules/source
# tar xf vmnet.tar
2. 修改 vmnet-only/bridge.c
找到包含 dev_set_promiscuity 关键字的行(共有3行)
在其前面加入一行 rtnl_lock();
在其后面加入一行 rtnl_unlock();
修改完后像下面这样:
rtnl_lock();
dev_set_promiscuity(dev, -1);
rtnl_unlock();
如果手动修改比较麻烦,可以用下面的sed命令来完成
# sed -i '/dev_set_promiscuity/i rtnl_lock();' bridge.c
# sed -i '/dev_set_promiscuity/a rtnl_unlock();' bridge.c
3. 重新打包 vmnet.tar
# tar cf vmnet.tar vmnet-only
4. 重新配置vmware
# vmware-config.pl
5. 重启系统即可。

