内核 3.19 的“无法构建 vmnet”

fro*_*tto 9 vmware kernel

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

当我第一次想运行 VMware Workstation 或 VMware Player 时,它需要在内核级别部署一些包,但它失败并出现这行错误。

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

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

fro*_*tto 8

解决方案

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

    cd /usr/lib/vmware/modules/source
    
    Run Code Online (Sandbox Code Playgroud)
  2. 解压 vmnet 模块。 [1]

    sudo tar -xvf vmnet.tar
    
    Run Code Online (Sandbox Code Playgroud)
  3. vmnet-only/driver.c使用您最喜欢的文本编辑器打开。

    sudo gedit vmnet-only/driver.c
    
    Run Code Online (Sandbox Code Playgroud)
  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;        
    
    Run Code Online (Sandbox Code Playgroud)

    #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
    
    Run Code Online (Sandbox Code Playgroud)
  5. 在第 1194 行附近,更改以下内容 [2]

    if (filp && filp->f_dentry) {
        inode = filp->f_dentry->d_inode;
    }
    err = VNetFileOpIoctl(inode, filp, iocmd, ioarg);
    return err;
    
    Run Code Online (Sandbox Code Playgroud)

    #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
    
    Run Code Online (Sandbox Code Playgroud)
  6. 保存此文件,然后打开文件 vmnet-only/userif.c

    sudo gedit vmnet-only/userif.c
    
    Run Code Online (Sandbox Code Playgroud)
  7. 在第 526 行附近,更改以下内容 [2]

    return skb_copy_datagram_iovec(skb, 0, &iov, len);
    
    Run Code Online (Sandbox Code Playgroud)

    #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
    
    Run Code Online (Sandbox Code Playgroud)
  8. 保存此文件,然后重新 tar 模块。 [1]

    sudo tar -uvf vmnet.tar vmnet-only
    
    Run Code Online (Sandbox Code Playgroud)
  9. 删除之前的工作目录。 [1]

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

参考

[1]:来自nonsleepr回答。:一个写了罗伯特Gadsdon。
[2]

  • 谢谢你写得很好的帖子。这为我解决了这个问题。 (2认同)