Поскольку этот ответ только для ядра 3.13, таким образом, я хотел бы совместно использовать решение для проблемы Failed to build vmnet
для ядра 3.19 и более ранние версии. Таким образом это не моя фактическая проблема и только предназначается для помощи будущим читателям.
Когда я хочу выполнить VMware Workstation или VMware Player впервые, он должен развернуть некоторые пакеты на уровне ядра, но он перестал работать с этой строкой ошибки.
Не удалось создать vmnet. Не удалось выполнить команду сборки.
Что я должен сделать для разрешения этой проблемы?
Каталог изменения в исходный каталог модуля VMware. [1]
cd /usr/lib/vmware/modules/source
Untar vmnet модули. [1]
sudo tar -xvf vmnet.tar
Открытый vmnet-only/driver.c
с Вашим любимым текстовым редактором.
sudo gedit vmnet-only/driver.c
Вокруг строки 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
Вокруг строки 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
Сохраните этот файл и затем откройте файл vmnet-only/userif.c
sudo gedit vmnet-only/userif.c
Вокруг строки 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
Сохраните этот файл и затем повторно смолите модули. [1]
sudo tar -uvf vmnet.tar vmnet-only
Удалите предыдущий рабочий каталог. [1]
sudo rm -r vmnet-only
Выполните GUI (Рабочая станция или Плеер) снова и позвольте ему для создания модулей.
если Вы выполняете рабочую станцию 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
}
Благодарен за то, что budiap отправляет патч для Рабочей станции 10! Это просто взяло меня некоторое время, чтобы выяснить, что необходимо использовать тот код для применения того кода к файлу исправления. Вот сообщение, которое я сделал к форумам рабочей станции VMware.
ХОРОШО!Я понял. Рабочая станция 10 на Ubuntu15.04, или безотносительно-buntu. Я протестировал это на ядре Xubuntu 15.04, 3.19.0-18-универсальном
Созданный новый pastie (10215458) для патча для Рабочей станции 10.
После новой установки Рабочей станции 10.06 Конкретно-> VMware-Workstation-Full-10.0.6-2700073.x86_64.bundle
Должен быть корнем, но Вы можете в основном скопировать/вставить.
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