0%

Failed to build vmnet. Failed to execute the build Command

Kernel 4.9+无法安装VMPlayer vmnet问题解决

今天一早升级线上服务器的open ssh,然后升级了下自己的ubuntu,采用的是apt update+upgrade命令。
之后悲剧的发现vmplayer跪了,用度娘找了下,就只有一篇有价值的文章,说在国外论坛看到的,下载了个patch文件。
后来看了看,不适用,最后用手机热点翻墙(公司2M小水管,国内打开网页速度都感人),终于在http://rglinuxtech.com/?p=1838
看到了问题所在和解决方案,在这里重复下解决方案。其他内核版本也可以参照此方法解决。

日志异常

1
2
3
4
5
I125: Setting destination path for vmnet to "/lib/modules/4.9.0-11-generic/misc/vmnet.ko".
I125: Extracting the vmnet source from "/usr/lib/vmware/modules/source/vmnet.tar".
I125: Successfully extracted the vmnet source.
I125: Building module with command "/usr/bin/make -j4 -C /tmp/modconfig-Zu8VZj/vmnet-only auto-build HEADER_DIR=/lib/modules/4.9.0-11-generic/build/include CC=/usr/bin/gcc IS_GCC_3=no"
W115: Failed to build vmnet. Failed to execute the build command.

关键点就是4.9.0-11-generic刚升级的内核,太新了,vm无法识别。

解决方法

首先从日志看到是内核版本的问题,导致了vmnet编译安装失败。接着按论坛上的解决方法来解决这个问题。

1
cd /usr/lib/vmware/modules/source
1
2
sudo tar -xf vmnet.tar
sudo tar -xf vmmon.tar
1
2
cd vmnet-only
sudo gedit userif.c

113行左右找到

1
2
3
4
5
6
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 6, 0)
retval = get_user_pages(addr, 1, 1, 0, &page, NULL);
#else
retval = get_user_pages(current, current->mm, addr,
1, 1, 0, &page, NULL);
#endif

把它替换为

1
2
3
4
5
6
7
8
9
10
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0)
retval = get_user_pages(addr, 1, 0, &page, NULL);
#else
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 6, 0)
retval = get_user_pages(addr, 1, 1, 0, &page, NULL);
#else
retval = get_user_pages(current, current->mm, addr,
1, 1, 0, &page, NULL);
#endif
#endif

接着修改另外一个文件

1
2
cd ../vmmon-only/linux
sudo gedit hostif.c

1165行左右,找到

1
2
3
4
5
6
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 6, 0)
retval = get_user_pages((unsigned long)uvAddr, numPages, 0, 0, ppages, NULL);
#else
retval = get_user_pages(current, current->mm, (unsigned long)uvAddr,
numPages, 0, 0, ppages, NULL);
#endif

把它替换为

1
2
3
4
5
6
7
8
9
10
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0)
retval = get_user_pages((unsigned long)uvAddr, numPages, 0, ppages, NULL);
#else
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 6, 0)
retval = get_user_pages((unsigned long)uvAddr, numPages, 0, 0, ppages, NULL);
#else
retval = get_user_pages(current, current->mm, (unsigned long)uvAddr,
numPages, 0, 0, ppages, NULL);
#endif
#endif

完成2个文件的修改,基本就完成了工作。接着要将修改后的文件打包。切换目录

1
cd /usr/lib/vmware/modules/source

备份原文件

1
2
sudo mv vmnet.tar vmnet.tar.back
sudo mv vmmon.tar vmmon.tar.back

将修改后的文件打包:

1
2
3
4
sudo tar -cf vmnet.tar vmnet-only
sudo tar -cf vmmon.tar vmmon-only
sudo rm -rf vmnet-only
sudo rm -rf vmmon-only

最后重新启动即可安装vmnet,injoy!