„Nie udało się zbudować vmnet” dla jądra 3.19

9

Ponieważ ta odpowiedź dotyczy tylko jądra 3.13, dlatego chciałbym podzielić się rozwiązaniem problemu Failed to build vmnetdotyczącego jądra 3.19 i wcześniejszych wersji. Dlatego nie jest to mój rzeczywisty problem i ma on jedynie pomóc przyszłym czytelnikom.

Pytanie

Kiedy chcę uruchomić VMware Workstation lub VMware Player po raz pierwszy, musi on wdrożyć niektóre pakiety na poziomie jądra, ale ten błąd kończy się niepowodzeniem.

Nie udało się zbudować vmnet. Nie można wykonać polecenia kompilacji.

Co powinienem zrobić, aby rozwiązać ten problem?

frogatto
źródło
Zauważ, że już tak nie jest. W dniu dzisiejszej świeżej instalacji w systemie Linux nie byłem w stanie replikować tego problemu z kompilacją.
Thomas Ward

Odpowiedzi:

8

Rozwiązanie

  1. Zmień katalog na katalog źródłowy modułu vmware. [1]

    cd /usr/lib/vmware/modules/source
    
  2. Rozpakuj moduły vmnet. [1]

    sudo tar -xvf vmnet.tar
    
  3. Otwórz vmnet-only/driver.cw swoim ulubionym edytorze tekstu.

    sudo gedit vmnet-only/driver.c
    
  4. Wokół linii 267 zmień następujące [2]

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

    do

    #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. Wokół linii 1194 zmień następujące [2]

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

    do

    #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. Zapisz ten plik, a następnie otwórz plik vmnet-only/userif.c

    sudo gedit vmnet-only/userif.c
    
  7. Wokół linii 526 zmień następujące [2]

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

    do

    #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. Zapisz ten plik, a następnie ponownie zładuj moduły. [1]

    sudo tar -uvf vmnet.tar vmnet-only
    
  9. Usuń poprzedni katalog roboczy. [1]

    sudo rm -r vmnet-only
    
  10. Uruchom ponownie GUI (Workstation lub Player) i pozwól mu zbudować moduły.

Bibliografia

[1]: Odpowiedź od nieśpiącego .
[2]: A write-up z Robertem Gadsdon.

frogatto
źródło
2
Dziękuję za dobrze napisany post. To rozwiązało problem dla mnie.
ChosSimbaOne
4

Dzięki budiap za opublikowanie łatki na stację roboczą 10! Dopiero po chwili zrozumiałem, że musisz użyć tego kodu, aby zastosować go do pliku poprawki. Oto post, który napisałem na forach stacji roboczych vmware.

W PORZĄDKU! Mam to. Stacja robocza 10 na Ubuntu15.04 lub cokolwiek-buntu. Testowałem to na jądrze Xubuntu 15.04 3.19.0-18-generic

Utworzono nową pastie (10215458) dla poprawki dla stacji roboczej 10.

Po świeżej instalacji Workstation 10.06 W szczególności -> VMware-Workstation-Full-10.0.6-2700073.x86_64.bundle

Musi być rootem, ale możesz w zasadzie skopiować / wkleić.

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
źródło
Nie mogę uwierzyć, że jestem pierwszą osobą, która głosuje za tym! To świetna, świetna odpowiedź. (Mam nadzieję, że nie masz nic przeciwko mojej sugerowanej edycji.)
Mark E. Haase
1
Właśnie próbowałem tego z Kernel 4.2 z Ubuntu 15.10 i to nie działało. Nie mogłem znaleźć żadnej łatki, aby WS10 działał na 15.10 i musiałem cofnąć się do 14 LTS, które używały jądra 3.19.
Timothy C. Quinn
Taki sam jak @JavaScriptDude. Jak załatać jądro 4.4?
Ligemer,
@Ligemer - zrezygnowałem z próby uzyskania starszych wersji stacji roboczej vmware do pracy w systemie Linux i przełączyłem się na wirtualną skrzynkę, a decyzja dobrze mi pomogła. W przypadku systemu Linux i vmware myślę, że jedynym praktycznym rozwiązaniem jest zakup licencji na najnowszą wersję stacji roboczej - lub - po prostu skorzystaj z darmowego odtwarzacza vmware i wymyśl zewnętrzny mechanizm migawkowy, taki jak ZFS lub BTRFS.
Timothy C. Quinn
Dzięki @JavaScriptDude - uzgodniono. Skończyło się również na wirtualnym pudełku. Jestem szczęśliwym obozowiczem :-) Mam nadzieję, że komentarze mogą pomóc innym użytkownikom Linuksa. Szczęśliwego kodowania.
Ligemer,
2

jeśli używasz stacji roboczej vmware 10, zastosuj tę łatkę, aby działała na jądrze 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
źródło
1
Cześć Budiap. Czy jest jakaś szansa na idiotycznego przewodnika na temat tego, jak zastosować tę łatkę? Dzięki.
Simmo