因为这个答案仅适用于内核 3.13,因此我想分享Failed to build vmnet
针对内核 3.19 及更早版本的问题的解决方案。因此这不是我实际遇到的问题,仅旨在帮助未来的读者。
问题
当我第一次运行 VMware Workstation 或 VMware Player 时,它需要在内核级别部署一些包,但却因此行错误而失败。
无法构建 vmnet。无法执行构建命令。
我应该怎么做才能解决这个问题?
答案1
解决方案
将目录更改为 vmware 模块源目录。
[1]
cd /usr/lib/vmware/modules/source
解压 vmnet 模块。
[1]
sudo tar -xvf vmnet.tar
vmnet-only/driver.c
用您最喜欢的文本编辑器打开。sudo gedit vmnet-only/driver.c
在第 267 行左右,更改以下内容
[2]
if (filp && filp->f_op && filp->f_op->ioctl == VNetFileOpIoctl) { ret = VNetFileOpIoctl(filp->f_dentry->d_inode, filp, iocmd, ioarg); } return ret;
到
#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0) if (filp && filp->f_op && filp->f_op->ioctl == VNetFileOpIoctl) { ret = VNetFileOpIoctl(filp->f_dentry->d_inode, filp, iocmd, ioarg); } return ret; #else if (filp && filp->f_op && filp->f_op->ioctl == VNetFileOpIoctl) { ret = VNetFileOpIoctl(filp->f_path.dentry->d_inode, filp, iocmd, ioarg); } return ret; #endif
在第 1194 行左右,更改以下内容
[2]
if (filp && filp->f_dentry) { inode = filp->f_dentry->d_inode; } err = VNetFileOpIoctl(inode, filp, iocmd, ioarg); return err;
到
#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0) if (filp && filp->f_dentry) { inode = filp->f_dentry->d_inode; } err = VNetFileOpIoctl(inode, filp, iocmd, ioarg); return err; #else if (filp && filp->f_path.dentry) { inode = filp->f_path.dentry->d_inode; } err = VNetFileOpIoctl(inode, filp, iocmd, ioarg); return err; #endif
保存此文件然后打开文件
vmnet-only/userif.c
sudo gedit vmnet-only/userif.c
在第 526 行左右,更改以下内容
[2]
return skb_copy_datagram_iovec(skb, 0, &iov, len);
到
#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0) return skb_copy_datagram_iovec(skb, 0, &iov, len); #else struct iov_iter to; iov_iter_init(&to, READ, &iov, 1, len); return skb_copy_datagram_iter(skb, 0, &to, len); #endif
保存此文件然后重新打包模块。
[1]
sudo tar -uvf vmnet.tar vmnet-only
删除先前的工作目录。
[1]
sudo rm -r vmnet-only
再次运行 GUI(工作站或播放器)并让其构建模块。
参考
答案2
感谢 budiap 发布 Workstation 10 补丁!我花了一段时间才弄清楚需要使用该代码将该代码应用于补丁文件。这是我在 vmware 工作站论坛上发布的帖子。
好的!我明白了。Ubuntu15.04 上的 Workstation 10,或者其他版本。我在 Xubuntu 15.04 Kernel 3.19.0-18-generic 上测试了此系统
为 Workstation 10 补丁创建了新的粘贴内容 (10215458)。
全新安装 Workstation 10.06 后具体来说 -> VMware-Workstation-Full-10.0.6-2700073.x86_64.bundle
必须是 root,但您基本上可以复制/粘贴。
curl http://pastie.org/pastes/10215458/download -o /tmp/vmnet-3.19.patch_ws10
cd /usr/lib/vmware/modules/source
tar -xf vmnet.tar
patch -p0 -i /tmp/vmnet-3.19.patch_ws10
mv vmnet.tar vmnet.tar.SAVED
tar -cf vmnet.tar vmnet-only
rm -r vmnet-only
vmware-modconfig --console --install-all
答案3
如果你正在运行 vmware Workstation 10,请应用此补丁使其在内核 3.19 上运行
diff -rupN vmnet-only/driver.c vmnet-only-modified/driver.c
--- vmnet-only/driver.c 2015-01-17 09:25:58.000000000 +0800
+++ vmnet-only-modified/driver.c 2015-05-07 14:53:18.272218785 +0800
@@ -265,10 +265,17 @@ LinuxDriver_Ioctl32_Handler(unsigned int
{
int ret = -ENOTTY;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
if (filp && filp->f_op && filp->f_op->ioctl == VNetFileOpIoctl) {
ret = VNetFileOpIoctl(filp->f_dentry->d_inode, filp, iocmd, ioarg);
}
return ret;
+#else
+ if (filp && filp->f_op && filp->f_op->ioctl == VNetFileOpIoctl) {
+ ret = VNetFileOpIoctl(filp->f_path.dentry->d_inode, filp, iocmd, ioarg);
+ }
+ return ret;
+#endif
}
@@ -1191,11 +1198,19 @@ VNetFileOpUnlockedIoctl(struct file *
struct inode *inode = NULL;
long err;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
if (filp && filp->f_dentry) {
inode = filp->f_dentry->d_inode;
}
err = VNetFileOpIoctl(inode, filp, iocmd, ioarg);
return err;
+#else
+ if (filp && filp->f_path.dentry) {
+ inode = filp->f_path.dentry->d_inode;
+ }
+ err = VNetFileOpIoctl(inode, filp, iocmd, ioarg);
+ return err;
+#endif
}
#endif
diff -rupN vmnet-only/netif.c vmnet-only-modified/netif.c
--- vmnet-only/netif.c 2015-01-17 09:25:58.000000000 +0800
+++ vmnet-only-modified/netif.c 2015-05-07 14:51:43.326885576 +0800
@@ -149,7 +149,7 @@ VNetNetIf_Create(char *devName, // IN:
memcpy(deviceName, devName, sizeof deviceName);
NULL_TERMINATE_STRING(deviceName);
- dev = alloc_netdev(sizeof *netIf, deviceName, VNetNetIfSetup);
+ dev = alloc_netdev(sizeof *netIf, deviceName, NET_NAME_UNKNOWN, VNetNetIfSetup);
if (!dev) {
retval = -ENOMEM;
goto out;
diff -rupN vmnet-only/userif.c vmnet-only-modified/userif.c
--- vmnet-only/userif.c 2015-01-17 09:25:58.000000000 +0800
+++ vmnet-only-modified/userif.c 2015-05-07 14:52:32.095595913 +0800
@@ -523,7 +523,13 @@ VNetCopyDatagram(const struct sk_buff *s
.iov_base = buf,
.iov_len = len,
};
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
return skb_copy_datagram_iovec(skb, 0, &iov, len);
+#else
+ struct iov_iter to;
+ iov_iter_init(&to, READ, &iov, 1, len);
+ return skb_copy_datagram_iter(skb, 0, &to, len);
+#endif
}