"Error al compilar vmnet" para el kernel 3.19

9

Debido a que esta respuesta es solo para el kernel 3.13, me gustaría compartir una solución para el problema Failed to build vmnetdel kernel 3.19 y versiones anteriores. Por lo tanto, este no es mi problema real y solo está destinado a ayudar a futuros lectores.

Pregunta

Cuando quiero ejecutar VMware Workstation o VMware Player por primera vez, necesita implementar algunos paquetes a nivel de kernel, pero falla con esta línea de error.

Error al compilar vmnet. Error al ejecutar el comando de compilación.

¿Qué debo hacer para resolver este problema?

frogatto
fuente
Tenga en cuenta que esto ya no parece ser el caso. A partir de una nueva instalación hoy, en un sistema Linux, no he podido replicar este problema de compilación.
Thomas Ward

Respuestas:

8

Solución

  1. Cambie el directorio al directorio de origen del módulo vmware. [1]

    cd /usr/lib/vmware/modules/source
    
  2. Descomprima los módulos vmnet. [1]

    sudo tar -xvf vmnet.tar
    
  3. Abre vmnet-only/driver.ccon tu editor de texto favorito.

    sudo gedit vmnet-only/driver.c
    
  4. Alrededor de la línea 267, cambie lo siguiente [2]

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

    a

    #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. Alrededor de la línea 1194, cambie lo siguiente [2]

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

    a

    #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. Guarde este archivo y luego abra el archivo vmnet-only/userif.c

    sudo gedit vmnet-only/userif.c
    
  7. Alrededor de la línea 526, cambie lo siguiente [2]

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

    a

    #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. Guarde este archivo y luego vuelva a tar los módulos. [1]

    sudo tar -uvf vmnet.tar vmnet-only
    
  9. Eliminar el directorio de trabajo anterior. [1]

    sudo rm -r vmnet-only
    
  10. Vuelva a ejecutar la GUI (estación de trabajo o reproductor) y deje que cree los módulos.

Referencias

[1]: Una respuesta de nonsleepr .
[2]: Un artículo de Robert Gadsdon.

frogatto
fuente
2
Gracias por una publicación bien escrita. Esto resolvió el problema para mí.
ChosSimbaOne 01 de
4

Gracias budiap por publicar parche para Workstation 10! Me tomó un tiempo darme cuenta de que necesitas usar ese código para aplicar ese código a un archivo de parche. Aquí está la publicación que hice en los foros de estaciones de trabajo vmware.

¡BUENO! Lo tengo. Estación de trabajo 10 en Ubuntu15.04, o lo que sea-buntu. Probé esto en Xubuntu 15.04 Kernel 3.19.0-18-generic

Se creó una nueva pastie (10215458) para el parche para Workstation 10.

Después de una nueva instalación de Workstation 10.06 específicamente -> VMware-Workstation-Full-10.0.6-2700073.x86_64.bundle

Debe ser root, pero básicamente puedes copiar / pegar.

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
fuente
¡No puedo creer que sea la primera persona en votar esto! Esta es una gran, gran respuesta. (Espero que no te importe mi edición sugerida.)
Mark E. Haase
1
Acabo de probar esto con Kernel 4.2 con Ubuntu 15.10 y no funcionó. No pude encontrar ningún parche para que WS10 funcionara en 15.10 y tuve que retroceder a 14 LTS que usaban Kernel 3.19.
Timothy C. Quinn
Igual que @JavaScriptDude. ¿Cómo parchar para el kernel 4.4?
Ligemer
@Ligemer: he renunciado a tratar de hacer que las versiones anteriores de la estación de trabajo vmware funcionen en Linux y cambié a la caja virtual y la decisión me ha servido bien. Para Linux y vmware, creo que la única solución práctica es comprar una licencia para la última versión de la estación de trabajo, o simplemente usar el reproductor vmware gratuito y crear un mecanismo de instantánea externo como ZFS o BTRFS.
Timothy C. Quinn
Gracias @JavaScriptDude - de acuerdo. Terminé yendo a la caja virtual también. Soy un campista feliz :-) Espero que los comentarios puedan ayudar a otros usuarios de Linux. Feliz codificación
Ligemer
2

Si está ejecutando vmware workstation 10, aplique este parche para que funcione en el 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
 }
budiap
fuente
1
Hola budiap ¿Alguna posibilidad de una guía de idiotas sobre cómo aplicar este parche? Gracias.
Simmo