"Impossibile creare vmnet" per il kernel 3.19


9

Perché questa risposta è solo per il kernel 3.13, quindi mi piacerebbe condividere una soluzione per il problema Failed to build vmnetper il kernel 3.19 e le versioni precedenti. Quindi questo non è il mio vero problema ed è destinato solo ad aiutare i futuri lettori.

Domanda

Quando voglio eseguire VMware Workstation o VMware Player per la prima volta, deve distribuire alcuni pacchetti a livello di kernel, ma non riesce con questa linea di errore.

Impossibile creare vmnet. Impossibile eseguire il comando build.

Cosa devo fare per risolvere questo problema?


Si noti che questo non sembra più essere il caso. A partire da una nuova installazione oggi, su un sistema Linux, non sono stato in grado di replicare questo problema di compilazione.
Thomas Ward

Risposte:


8

Soluzione

  1. Cambia directory nella directory sorgente del modulo vmware. [1]

    cd /usr/lib/vmware/modules/source
    
  2. Decomprimere i moduli vmnet. [1]

    sudo tar -xvf vmnet.tar
    
  3. Apri vmnet-only/driver.ccon il tuo editor di testo preferito.

    sudo gedit vmnet-only/driver.c
    
  4. Intorno alla linea 267, modificare quanto segue [2]

    if (filp && filp->f_op && filp->f_op->ioctl == VNetFileOpIoctl) {
        ret = VNetFileOpIoctl(filp->f_dentry->d_inode, filp, iocmd, ioarg);
    }
    return ret;        
    

    per

    #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. Intorno alla linea 1194, modifica quanto segue [2]

    if (filp && filp->f_dentry) {
        inode = filp->f_dentry->d_inode;
    }
    err = VNetFileOpIoctl(inode, filp, iocmd, ioarg);
    return err;
    

    per

    #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. Salvare questo file e quindi aprire il file vmnet-only/userif.c

    sudo gedit vmnet-only/userif.c
    
  7. Intorno alla linea 526, modifica quanto segue [2]

    return skb_copy_datagram_iovec(skb, 0, &iov, len);
    

    per

    #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. Salvare questo file e quindi ripetere il tar dei moduli. [1]

    sudo tar -uvf vmnet.tar vmnet-only
    
  9. Elimina la directory di lavoro precedente. [1]

    sudo rm -r vmnet-only
    
  10. Esegui nuovamente la GUI (Workstation o Player) e lascia che compili i moduli.

Riferimenti

[1]: Una risposta dal non dormiente .
[2]: Un write-up da Robert Gadsdon.


2
Grazie per un post ben scritto. Questo ha risolto il problema per me.
ChosSimbaOne

4

Grazie budiap per aver pubblicato la patch per Workstation 10! Mi ci è voluto un po 'di tempo per capire che è necessario utilizzare quel codice per applicare quel codice a un file patch. Ecco il post che ho scritto sui forum delle workstation VMware.

VA BENE! Capito. Workstation 10 su Ubuntu15.04 o qualunque altro buntu. Ho provato questo su Xubuntu 15.04 Kernel 3.19.0-18-generico

Creato nuovo pastie (10215458) per patch per Workstation 10.

Dopo una nuova installazione di Workstation 10.06 In particolare -> VMware-Workstation-Full-10.0.6-2700073.x86_64.bundle

Deve essere root, ma sostanzialmente puoi copiare / incollare.

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

Non riesco a credere di essere il primo a votare questo! Questa è un'ottima risposta. (Spero non ti dispiaccia la mia modifica suggerita.)
Mark E. Haase,

1
Ho appena provato questo con Kernel 4.2 con Ubuntu 15.10 e non ha funzionato. Non sono riuscito a trovare alcuna patch per far funzionare WS10 il 15.10 e ho dovuto tornare a 14 LTS che utilizzavano il kernel 3.19.
Timothy C. Quinn,

Come per @JavaScriptDude. Come patchare per il kernel 4.4?
Ligemer,

@Ligemer - Ho rinunciato a provare a far funzionare le versioni precedenti della workstation vmware su Linux e sono passato alla virtual box e la decisione mi è servita bene. Per Linux e vmware penso che l'unica soluzione pratica sia quella di acquistare una licenza per l'ultima versione di Workstation - oppure basta usare il lettore vmware gratuito e trovare un meccanismo di istantanea esterno come ZFS o BTRFS.
Timothy C. Quinn,

Grazie @JavaScriptDude - d'accordo. Ho finito per andare anche nella scatola virtuale. Sono un campeggiatore felice :-) Spero che i commenti possano aiutare altri utenti Linux. Buona codifica.
Ligemer,

2

se si esegue vmware workstation 10, applicare questa patch per farlo funzionare sul kernel 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
 }

1
Ciao budiap Qualche possibilità di una guida per idioti su come applicare questa patch? Grazie.
Simmo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.