J'utilise VMWare Player sur Ubuntu et j'exécute un nombre différent de machines virtuelles.
Cela a fonctionné jusqu’à 14h10, date à laquelle le noyau a été mis à jour, il me sera demandé de recompiler les modules, etc. mais cela ne fonctionne plus avec Ubuntu 15.04.
Le problème est qu’il échoue lors de la tentative de recompilation de la "carte réseau virtuelle". Comment puis-je résoudre ce problème?
Utilisez ces commandes (nécessite un accès 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
pour vmware-player 9, vous devez également modifier:
vmnet-only/netif.c ligne 152 à partir de:
dev = alloc_netdev(sizeof *netIf, deviceName, VNetNetIfSetup);
à
dev = alloc_netdev(sizeof *netIf, deviceName, NET_NAME_UNKNOWN, VNetNetIfSetup);
vmnet-only/filter.c ligne 207 à partir de:
VNetFilterHookFn(unsigned int hooknum, // IN:
à:
VNetFilterHookFn(const struct nf_hook_ops *ops, // IN:
vmnet-only/filter.c ligne 255 à partir de:
transmit = (hooknum == VMW_NF_INET_POST_ROUTING);
à:
transmit = (ops->hooknum == VMW_NF_INET_POST_ROUTING);
En effet, Ubuntu 15.04 utilise le noyau Linux 3.19, qui apporte des modifications à l’API de mise en réseau que le lecteur VMWare n’a pas encore prises en compte.
Remarque: la version de VMWare Player utilisée ici est la version 7.1.x.
La solution consiste à appliquer le correctif suivant au pilote 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);
}
Pour ça:
/usr/lib/vmware/modules/source/vmnet.tar
quelque part;cd vmnet-only && patch -p1 <path/to/the.patch && cd ..
);tar cf /usr/lib/vmware/modules/source/vmnet.tar vmnet-only
).Vous pouvez ensuite redémarrer le lecteur VMWare. le pilote va compiler et installer.