升级 Linux 内核导致 VMware 无法使用(vmnet 模块无法编译)解决方案

最近将 Ubuntu 升级到 14.04 后,出现了 VMware 无法启动的情况。具体表现为:每次启动 VMware Workstation 时都会弹出一个 VMware Kernel Module Updater 对话框,要求根据当前内核版本重新编译一些内核模块,但是其中的网络模块 vmnet 总是编译失败。

查找相关资料后发现,原因在于升级到 Ubuntu 14.04 之后,当前 Linux 内核版本变为 3.13。这个内核版本修改了一些底层函数,而 VMware 的相关源码包还没有及时更新对应代码。由于这是内核接口变化导致的问题,所以同样的问题也大量出现在 Fedora 等系统上。

因此,类似问题也可能继续存在于 3.14、3.15 等后续内核版本中。解决方法是修改 vmnet 模块源码包中的两处代码,然后重新打包并编译内核模块。

操作步骤

1. 获取 root 权限并进入源码目录

su
cd /usr/lib/vmware/modules/source

也可以使用 sudo -i 获取 root shell,再进入同一目录。

2. 解压 vmnet 源码包

解压后会得到 vmnet-only 文件夹:

tar -xf vmnet.tar

3. 备份原来的源码包

mv vmnet.tar vmnet.tar.bak

4. 修改源文件 filter.c

编辑文件:

vim vmnet-only/filter.c

找到原来的函数参数,大约在第 206 行:

VNetFilterHookFn(const unsigned int hooknum // IN:

修改为:

VNetFilterHookFn(const struct nf_hook_ops *ops, // IN:

然后找到大约第 255 行的代码:

transmit = (hooknum == VMW_NF_INET_POST_ROUTING);

修改为:

transmit = (ops->hooknum == VMW_NF_INET_POST_ROUTING);

如果行号不完全一致,可以直接在 filter.c 中搜索 VNetFilterHookFnVMW_NF_INET_POST_ROUTING。不同 VMware 或内核版本中的源码位置可能会略有差异,应以实际文件内容为准。

5. 重新打包并清理临时目录

tar -uf vmnet.tar vmnet-only
rm -rf vmnet-only

6. 重新编译 VMware 内核模块

可以直接点击 VMware Workstation 图标,让它自动检测并编译模块;也可以使用命令手动执行:

vmware-modconfig --console --install-all

如果仍然失败,建议先确认当前内核头文件和编译工具是否安装完整。例如在 Ubuntu 上可以检查:

uname -r
dpkg -l | grep "linux-headers-$(uname -r)"

必要时安装对应内核头文件和基础编译工具:

sudo apt-get install build-essential linux-headers-$(uname -r)

参考

感谢 Bearox 和 Garrett Skjelstad。

  • <http://blog.csdn.net/bearox/article/details/21294609>
  • <http://ping8888.com/2013/12/13/vmware-modules-kernel-3-13/>

原载于 <http://blog.csdn.net/yanxiangtianji>。

转载请注明出处。

Leave a Reply