内核3.19“无法构建vmnet”

因为这个答案仅适用于内核3.13,所以我想分享一个问题的解决方案, Failed to build vmnet为内核3.19和早期版本Failed to build vmnet 。 因此,这不是我的实际问题,仅用于帮助未来的读者。

当我想第一次运行VMware Workstation或VMware Player时,它需要在内核级别部署一些软件包,但是它会因为这一行错误而失败。

无法构建vmnet。 无法执行构建命令。

我该怎么做才能解决这个问题?

  1. 将目录更改为vmware模块源目录。 [1]

     cd /usr/lib/vmware/modules/source 
  2. 解开vmnet模块。 [1]

     sudo tar -xvf vmnet.tar 
  3. 使用您喜欢的文本编辑器打开vmnet-only/driver.c

     sudo gedit vmnet-only/driver.c 
  4. 在第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 
  5. 在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 
  6. 保存此文件,然后打开文件vmnet-only/userif.c

     sudo gedit vmnet-only/userif.c 
  7. 在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 
  8. 保存此文件,然后重新tar模块。 [1]

     sudo tar -uvf vmnet.tar vmnet-only 
  9. 删除以前的工作目录。 [1]

     sudo rm -r vmnet-only 
  10. 再次运行GUI(工作站或播放器)并让它来构建模块。

参考

[1] :来自非睡眠者的回答 。
[2] :Robert Gadsdon的一篇文章。

感谢budiap发布Workstation 10的补丁! 我花了一些时间才弄清楚你需要使用该代码将该代码应用于补丁文件。 这是我对vmware工作站论坛发表的post。

好的! 我知道了。 Ubuntu15.04上的Workstation 10,或者其他任何buntu。 我在Xubuntu 15.04 Kernel 3.19.0-18-generic上测试了这个

为Workstation 10的补丁创建了新的pastie(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 

如果您正在运行vmware工作站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 }