因为这个答案仅适用于内核 3.13,所以我想分享Failed to build vmnet内核 3.19 及更早版本的问题的解决方案。因此,这不是我的实际问题,只是为了帮助未来的读者。
当我第一次想运行 VMware Workstation 或 VMware Player 时,它需要在内核级别部署一些包,但它失败并出现这行错误。
无法构建 vmnet。无法执行构建命令。
我应该怎么做才能解决这个问题?
将目录更改为 vmware 模块源目录。 [1]
cd /usr/lib/vmware/modules/source
Run Code Online (Sandbox Code Playgroud)解压 vmnet 模块。 [1]
sudo tar -xvf vmnet.tar
Run Code Online (Sandbox Code Playgroud)vmnet-only/driver.c使用您最喜欢的文本编辑器打开。
sudo gedit vmnet-only/driver.c
Run Code Online (Sandbox Code Playgroud)在第 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)在第 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)保存此文件,然后打开文件 vmnet-only/userif.c
sudo gedit vmnet-only/userif.c
Run Code Online (Sandbox Code Playgroud)在第 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)保存此文件,然后重新 tar 模块。 [1]
sudo tar -uvf vmnet.tar vmnet-only
Run Code Online (Sandbox Code Playgroud)删除之前的工作目录。 [1]
sudo rm -r vmnet-only
Run Code Online (Sandbox Code Playgroud)再次运行 GUI(工作站或播放器)并让它构建模块。
[1]:来自nonsleepr的回答。:一个写了罗伯特Gadsdon。
[2]
| 归档时间: |
|
| 查看次数: |
14933 次 |
| 最近记录: |