内核3.19“无法构建vmnet”


9

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

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

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

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


请注意,情况似乎不再如此。作为今天的全新安装,在Linux系统上,我无法复制此构建问题。
托马斯·沃德

Answers:


8

  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. 保存此文件,然后重新压缩模块。 [1]

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

    sudo rm -r vmnet-only
    
  10. 再次运行GUI(Workstation或Player),并让其构建模块。

参考文献

[1]:来自非睡眠者答案。:一个写了罗伯特Gadsdon。
[2]


2
谢谢你写的好文章。这为我解决了这个问题。
ChosSimbaOne

4

感谢budiap发布了Workstation 10补丁!我花了一段时间才弄清楚,您需要使用该代码才能将该代码应用于补丁文件。这是我在vmware工作站论坛上发表的帖子。

好的!我知道了。Ubuntu15.04或其他版本上的Workstation 10。我在Xubuntu 15.04 Kernel 3.19.0-18-generic上对此进行了测试

为工作站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

不敢相信我是第一个对此表示支持的人!这是一个很好的答案。(希望您不介意我的建议编辑。)
Mark E. Haase 2015年

1
我只是在带有Ubuntu 15.10的Kernel 4.2上尝试过此方法,但是它没有用。我找不到任何补丁程序来使WS10在15.10上运行,并且不得不退回到使用内核3.19的14个LTS。
蒂莫西·奎因

与@JavaScriptDude相同。如何为4.4内核打补丁?
Ligemer

@Ligemer-我放弃了尝试使旧版vmware工作站在Linux上运行并切换到虚拟机的决定,这一决定对我很有帮助。对于Linux和vmware,我认为唯一可行的解​​决方案是购买最新版本的工作站的许可证,或者仅使用免费的vmware播放器,并提供外部快照机制(例如ZFS或BTRFS)。
蒂莫西·奎因

感谢@JavaScriptDude-同意。我最终也去了虚拟盒子。我是一个快乐的露营者:-)希望这些注释可以对其他Linux用户有所帮助。快乐的编码。
Ligemer '16

2

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

1
嗨,伙伴们。有没有机会获得有关如何应用此补丁的白痴指南?谢谢。
Simmo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.