«Impossible de créer vmnet» pour le noyau 3.19

9

Parce que cette réponse ne concerne que le noyau 3.13, je voudrais donc partager une solution au problème Failed to build vmnetpour le noyau 3.19 et les versions antérieures. Ce n'est donc pas mon problème réel et est uniquement destiné à 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 génération.

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

grenouille
la source
Notez que cela ne semble plus être le cas. Depuis une nouvelle installation aujourd'hui, sur un système Linux, je n'ai pas pu répliquer ce problème de build.
Thomas Ward

Réponses:

8

Solution

  1. Modifiez 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.cavec votre éditeur de texte préféré.

    sudo gedit vmnet-only/driver.c
    
  4. Autour de la ligne 267, changez ce qui suit [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
    
  5. Autour de la ligne 1194, changez ce qui suit [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
    
  6. Enregistrez ce fichier, puis ouvrez le fichier vmnet-only/userif.c

    sudo gedit vmnet-only/userif.c
    
  7. Autour de la ligne 526, changez ce qui suit [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
    
  8. Enregistrez ce fichier, puis recalculez les modules. [1]

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

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

Références

[1]: Une réponse de nonsleepr .
[2]: Une écriture-up de Robert Gadsdon.

grenouille
la source
2
Merci pour un article bien écrit. Cela a résolu le problème pour moi.
ChosSimbaOne
4

Merci budiap d'avoir publié un correctif pour Workstation 10! Il m'a juste fallu un certain temps pour comprendre que vous devez utiliser ce code pour appliquer ce code à un fichier correctif. Voici le post que j'ai fait sur les forums des stations de travail vmware.

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

Création d'un 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 essentiellement 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
Lon Kaut
la source
Je ne peux pas croire que je suis la première personne à voter pour ça! C'est une excellente, excellente réponse. (J'espère que cela ne vous dérange pas ma modification suggérée.)
Mark E. Haase
1
Je viens d'essayer cela avec le noyau 4.2 avec Ubuntu 15.10 et cela n'a pas fonctionné. Je n'ai trouvé aucun correctif pour faire fonctionner WS10 sur 15.10 et j'ai dû reculer à 14 LTS qui utilisaient le noyau 3.19.
Timothy C. Quinn
Identique à @JavaScriptDude. Comment patcher pour le noyau 4.4?
Ligemer
@Ligemer - J'ai renoncé à essayer de faire fonctionner les anciennes versions de VMware Workstation sur Linux et je suis passé à Virtual Box et la décision m'a bien servi. Pour Linux et vmware, je pense que la seule solution pratique est d'acheter une licence pour la dernière version de Workstation - ou - d'utiliser simplement le lecteur vmware gratuit et de proposer un mécanisme d'instantané externe comme ZFS ou BTRFS.
Timothy C. Quinn,
Merci @JavaScriptDude - d'accord. J'ai aussi fini par aller à la boîte virtuelle. Je suis un campeur heureux :-) J'espère que les commentaires pourront aider d'autres utilisateurs de Linux. Codage heureux.
Ligemer
2

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
 }
budiap
la source
1
Salut Budiap. Avez-vous une chance d'avoir un guide idiot sur la façon d'appliquer ce patch? Merci.
Simmo