"VMnet konnte nicht erstellt werden" für Kernel 3.19

9

Da diese Antwort nur für Kernel 3.13 gilt, möchte ich eine Lösung für das Problem Failed to build vmnetfür Kernel 3.19 und frühere Versionen vorstellen. Dies ist also nicht mein eigentliches Problem und soll nur zukünftigen Lesern helfen.

Frage

Wenn ich VMware Workstation oder VMware Player zum ersten Mal ausführen möchte, müssen einige Pakete auf Kernelebene bereitgestellt werden, dies schlägt jedoch mit dieser Fehlerzeile fehl.

VMnet konnte nicht erstellt werden. Fehler beim Ausführen des Build-Befehls.

Was soll ich tun, um dieses Problem zu beheben?

Frogatto
quelle
Beachten Sie, dass dies nicht mehr der Fall zu sein scheint. Bei einer Neuinstallation auf einem Linux-System konnte ich dieses Build-Problem heute nicht replizieren.
Thomas Ward

Antworten:

8

Lösung

  1. Wechseln Sie in das Quellverzeichnis des VMware-Moduls. [1]

    cd /usr/lib/vmware/modules/source
    
  2. Entpacken Sie die VMnet-Module. [1]

    sudo tar -xvf vmnet.tar
    
  3. Öffnen Sie vmnet-only/driver.cmit Ihrem bevorzugten Texteditor.

    sudo gedit vmnet-only/driver.c
    
  4. Ändern Sie in Zeile 267 Folgendes [2]

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

    zu

    #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. Ändern Sie in Zeile 1194 Folgendes [2]

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

    zu

    #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. Speichern Sie diese Datei und öffnen Sie die Datei vmnet-only/userif.c

    sudo gedit vmnet-only/userif.c
    
  7. Ändern Sie in Zeile 526 Folgendes [2]

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

    zu

    #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. Speichern Sie diese Datei und tarieren Sie die Module erneut. [1]

    sudo tar -uvf vmnet.tar vmnet-only
    
  9. Löschen Sie das vorherige Arbeitsverzeichnis. [1]

    sudo rm -r vmnet-only
    
  10. Führen Sie die GUI (Workstation oder Player) erneut aus und lassen Sie sie die Module erstellen.

Verweise

[1]: Eine Antwort von Nonsleepr .
[2]: Eine Zuschreibung auf von Robert Gadsdon.

Frogatto
quelle
2
Vielen Dank für einen gut geschriebenen Beitrag. Dies löste das Problem für mich.
ChosSimbaOne
4

Vielen Dank an budiap für den Patch für Workstation 10! Ich habe nur eine Weile gebraucht, um herauszufinden, dass Sie diesen Code verwenden müssen, um diesen Code auf eine Patch-Datei anzuwenden. Hier ist der Beitrag, den ich in VMware-Workstation-Foren verfasst habe.

IN ORDNUNG! Ich habe es verstanden. Workstation 10 unter Ubuntu15.04 oder was auch immer-buntu. Ich habe dies auf Xubuntu 15.04 Kernel 3.19.0-18-generic getestet

Neue Pastie (10215458) für Patch für Workstation 10 erstellt.

Nach der Neuinstallation von Workstation 10.06 Speziell -> VMware-Workstation-Full-10.0.6-2700073.x86_64.bundle

Muss root sein, aber Sie können grundsätzlich kopieren / einfügen.

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
quelle
Ich kann nicht glauben, dass ich die erste Person bin, die dies positiv bewertet! Dies ist eine großartige Antwort. (Ich hoffe, Sie haben nichts gegen meine vorgeschlagene Änderung.)
Mark E. Haase
1
Ich habe es gerade mit Kernel 4.2 mit Ubuntu 15.10 versucht und es hat nicht funktioniert. Ich konnte keinen Patch finden, um WS10 auf 15.10 zum Laufen zu bringen, und musste auf 14 LTS zurücksetzen, die Kernel 3.19 verwendeten.
Timothy C. Quinn
Gleich wie @JavaScriptDude. Wie Patch für 4.4 Kernel?
Ligemer
@Ligemer - Ich habe es aufgegeben, ältere Versionen der VMware-Workstation unter Linux zum Laufen zu bringen, und bin auf die virtuelle Box umgestiegen. Die Entscheidung hat mir gute Dienste geleistet. Für Linux und VMware besteht meiner Meinung nach die einzige praktische Lösung darin, eine Lizenz für die neueste Workstation-Version zu erwerben - oder einfach den kostenlosen VMware-Player zu verwenden und einen externen Snapshot-Mechanismus wie ZFS oder BTRFS zu entwickeln.
Timothy C. Quinn
Danke @JavaScriptDude - einverstanden. Am Ende ging ich auch zur virtuellen Box. Ich bin ein glücklicher Camper :-) Hoffentlich können die Kommentare anderen Linux-Benutzern helfen. Viel Spaß beim Codieren.
Ligemer
2

Wenn Sie VMware Workstation 10 ausführen, wenden Sie diesen Patch an, damit er auf Kernel 3.19 funktioniert

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
quelle
1
Hallo Budiap. Gibt es eine Chance für einen Leitfaden für Idioten, wie man diesen Patch anwendet? Vielen Dank.
Simmo