VMWare 播放器和 Ubuntu 15.04:网络驱动程序不再编译,如何修复?

VMWare 播放器和 Ubuntu 15.04:网络驱动程序不再编译,如何修复?

我在 Ubuntu 上使用 VMWare Player 并在其上运行不同数量的虚拟机。

它一直运行良好直到 14.10,当内核升级时,我被要求重新编译模块等;但它不再适用于 Ubuntu 15.04。

问题是尝试重新编译“虚拟网络适配器”时失败。我该如何修复?

答案1

使用此命令(需要 root 访问权限):

$ wget http://pastie.org/pastes/9934018/download -O /tmp/vmnet-3.19.patch
$ cd /usr/lib/vmware/modules/source
$ tar -xf vmnet.tar
$ patch -p0 -i /tmp/vmnet-3.19.patch
$ tar -cf vmnet.tar vmnet-only
$ rm -r *-only
$ vmware-modconfig --console --install-all

对于 vmware-player 9,您还需要更改:

  • vmnet-only/netif.c 第 152 行来自:

    dev = alloc_netdev(sizeof *netIf, deviceName, VNetNetIfSetup);
    

    dev = alloc_netdev(sizeof *netIf, deviceName, NET_NAME_UNKNOWN, VNetNetIfSetup);
    
  • vmnet-only/filter.c 第 207 行来自:

    VNetFilterHookFn(unsigned int hooknum, // IN:

    到:

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

  • vmnet-only/filter.c 第 255 行来自:

    transmit = (hooknum == VMW_NF_INET_POST_ROUTING);

    到:

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

答案2

这是因为 Ubuntu 15.04 使用 Linux 内核 3.19,它对网络 API 带来了变化,而 VMWare Player 尚未考虑到这一点。

注意:这里使用的 VMWare Player 版本是 7.1.x。

解决方案是对 vmnet 驱动程序应用以下补丁:

diff --git a/driver.c b/driver.c
index 2e1e643..507a509 100644
--- a/driver.c
+++ b/driver.c
@@ -266,7 +266,7 @@ LinuxDriver_Ioctl32_Handler(unsigned int fd,     // IN: (unused)
    int ret = -ENOTTY;

    if (filp && filp->f_op && filp->f_op->ioctl == VNetFileOpIoctl) {
-      ret = VNetFileOpIoctl(filp->f_dentry->d_inode, filp, iocmd, ioarg);
+      ret = VNetFileOpIoctl(filp->f_path.dentry->d_inode, filp, iocmd, ioarg);
    }
    return ret;
 }
@@ -1191,8 +1191,8 @@ VNetFileOpUnlockedIoctl(struct file    *filp,  // IN:
    struct inode *inode = NULL;
    long err;

-   if (filp && filp->f_dentry) {
-      inode = filp->f_dentry->d_inode;
+   if (filp && filp->f_path.dentry) {
+      inode = filp->f_path.dentry->d_inode;
    }
    err = VNetFileOpIoctl(inode, filp, iocmd, ioarg);
    return err;
diff --git a/userif.c b/userif.c
index e68d4ce..b311f48 100644
--- a/userif.c
+++ b/userif.c
@@ -523,7 +523,9 @@ VNetCopyDatagram(const struct sk_buff *skb, // IN: skb to copy
       .iov_base = buf,
       .iov_len  = len,
    };
-   return skb_copy_datagram_iovec(skb, 0, &iov, len);
+   struct iov_iter to;
+   iov_iter_init(&to, READ, &iov, 1, len);
+   return skb_copy_datagram_iter(skb, 0, &to, len);
 }

为了这:

  • 成为 root...
  • 在某处制作备份/usr/lib/vmware/modules/source/vmnet.tar
  • 将其解压到临时目录中;
  • 应用上面的补丁(cd vmnet-only && patch -p1 <path/to/the.patch && cd ..);
  • 重新创建 tar 档案,覆盖原始档案(tar cf /usr/lib/vmware/modules/source/vmnet.tar vmnet-only)。

然后您可以重新启动 VMWare 播放器;驱动程序将编译并安装。

相关内容