VMWare player и Ubuntu 15.04: сетевой драйвер больше не компилируется, как исправить?
Я использую VMWare Player в Ubuntu и запускаю на нем разное количество виртуальных машин.
Он работал нормально до 14.10, когда ядро было обновлено, меня попросили перекомпилировать модули и т.д.; но он больше не работает с Ubuntu 15.04.
Проблема в том, что происходит сбой при попытке перекомпилировать "виртуальный сетевой адаптер". Как я могу это исправить?
2 ответа
Используйте эти команды (нужен 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);
Это связано с тем, что в Ubuntu 15.04 используется ядро Linux 3.19, которое вносит изменения в сетевой API, который проигрыватель VMWare еще не учел.
Примечание. Используемая здесь версия 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);
}
За это:
- быть корнем...
- сделать резервную копию
/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; драйвер скомпилируется и установится.