web-dev-qa-db-fra.com

"Impossible de construire vmnet" pour le noyau 3.19

Parce que cette réponse ne concerne que le noyau 3.13, j'aimerais donc partager une solution au problème Failed to build vmnet pour le noyau 3.19 et les versions antérieures. Ainsi, ce n'est pas mon problème actuel et n'est destiné qu'à aider les futurs lecteurs.

Question

Lorsque je veux exécuter VMware Workstation ou VMware Player pour la première fois, il doit déployer certains packages au niveau du noyau, mais il échoue avec cette ligne d'erreur.

Impossible de créer vmnet. Impossible d'exécuter la commande de construction.

Que dois-je faire pour résoudre ce problème?

9
Hi I'm Frogatto

Solution

  1. Changez le répertoire dans le répertoire source du module vmware. [1]

    cd /usr/lib/vmware/modules/source
    
  2. Décompressez les modules vmnet. [1]

    Sudo tar -xvf vmnet.tar
    
  3. Ouvrez vmnet-only/driver.c avec votre éditeur de texte préféré.

    Sudo gedit vmnet-only/driver.c
    
  4. Autour de la ligne 267, modifiez le [2] suivant

    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
    
  5. Autour de la ligne 1194, modifiez le [2] suivant

    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
    
  6. Enregistrez ce fichier puis ouvrez le fichier vmnet-only/userif.c

    Sudo gedit vmnet-only/userif.c
    
  7. Autour de la ligne 526, modifiez le [2] suivant

    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
    
  8. Enregistrez ce fichier puis ré-tarez les modules. [1]

    Sudo tar -uvf vmnet.tar vmnet-only
    
  9. Supprimer le répertoire de travail précédent. [1]

    Sudo rm -r vmnet-only
    
  10. Exécutez à nouveau l'interface graphique (poste de travail ou lecteur) et laissez-la construire les modules.

Références

[1]: Un réponse à partir de nonsleepr .
[2]: A rédaction de Robert Gadsdon.

8
Hi I'm Frogatto

Merci budiap pour la publication du correctif pour Workstation 10! Il m'a juste fallu un certain temps pour comprendre que vous deviez utiliser ce code pour appliquer ce code à un fichier de correctif. Voici le message que j'ai publié sur les forums vmware workstation.

D'ACCORD! J? ai compris. Workstation 10 sur Ubuntu15.04, ou que ce soit buntu. J'ai testé cela sur le noyau Xubuntu 15.04 3.19.0-18-generic

Création du nouveau pastie (10215458) pour le correctif pour Workstation 10.

Après une nouvelle installation de Workstation 10.06, spécifiquement -> VMware-Workstation-Full-10.0.6-2700073.x86_64.bundle

Doit être root, mais vous pouvez fondamentalement copier/coller.

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
4
Lon Kaut

si vous exécutez vmware workstation 10, appliquez ce correctif pour le faire fonctionner sur le noyau 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
 }
2
budiap