web-dev-qa-db-fra.com

Lecteur VMWare et Ubuntu 15.04: le pilote réseau ne compile plus, comment y remédier?

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?

4
fge

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);

15
Petro Pikh

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:

  • être root ...
  • faire une copie de sauvegarde de /usr/lib/vmware/modules/source/vmnet.tar quelque part;
  • décompressez-le dans un répertoire temporaire;
  • appliquer le patch ci-dessus (cd vmnet-only && patch -p1 <path/to/the.patch && cd ..);
  • recréez l'archive tar en écrasant l'original (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.

0
fge