lunes, 23 de junio de 2014

Problema con VMware-Player en Kali 1.0.7

Hace dos semanas que actualicé la paquetería de Kali Linux 1.0.6 y obtuve la versión 1.0.7, sin embargo, al no haber realizado el apt-get dist-upgrade me mantenía con el mismo kernel.

Ayer por la tarde decidí hacer dist-upgrade y después de reiniciar con el nuevo kernel, cuando quise utilizar VMware-Player (para continuar con la prueba de la distro/firewall Untangle) me aparecía que no encontraba los archivos de cabeceras, así que al ejecutar el comando "uname -r" me dio la versión del nuevo kernel y en base a ese resultado busqué los header con: apt-cache search linux-headers-`uname -r` teniendo esa información, instalé el paquete que me indicó ingresando: apt-get install linux-headers-3.14-kali1-amd64

Todo parecía ir normal, el problema fue cuando lo quise ejecutar me aparecía una ventanita que indicaba que no se podía compilar el módulo de red virtual, señalando que para encontrar más información del error que visitara un ficheron del log alojado en el directorio /tmp


Problema para iniciar el Módulo del Dispositivo de Red Virtual

Al revisar dicho fichero me encontré un error particular, pensé que se trataba de la versión de GCC que trataba utilizar versus la que tenía instalada en el Sistema.

2014-06-22T21:44:26.686-06:00| modconfig| I120: Setting destination path for vmnet to "/lib/modules/3.14-kali1-amd64/misc/vmnet.ko".
2014-06-22T21:44:26.686-06:00| modconfig| I120: Extracting the vmnet source from "/usr/lib/vmware/modules/source/vmnet.tar".
2014-06-22T21:44:26.700-06:00| modconfig| I120: Successfully extracted the vmnet source.
2014-06-22T21:44:26.700-06:00| modconfig| I120: Building module with command "/usr/bin/make -j2 -C /tmp/modconfig-LY2zXV/vmnet-only auto-build HEADER_DIR=/lib/modules/3.14-kali1-amd64/build/include CC=/usr/bin/gcc IS_GCC_3=no"
2014-06-22T21:44:36.438-06:00| modconfig| W110: Failed to build vmnet.  Failed to execute the build command.

Al parecer, como que estaba comprobando si la versión de gcc era versión 3 y yo tengo en Sistema la 4.7.2

La googleada en español empezó, sin encontrar buenos resultados, cuando pasé a hacer la búsqueda en inglés hubieron resultados mejores, y que por buena fortuna, fui a parar al sitio correcto donde pude solventar el problema.

La búsqueda fue:
failed to build vmnet +kernel 3.14 CC=/usr/bin/gcc IS_GCC_3=no

Y el primer resultado fue el que me sirvió, del cual pongo el enlace a la página, así como la traducción de los pasos que fui siguiendo hasta la resolución del problema (con la poca diferencia que el problema que plantea daveti es con un kernel 3.13.x y el mío es 3.14.5):

Sitio:
http://davejingtian.org/2014/03/04/hack-make-vmware-player-6-0-1-start-on-linux-kernel-3-13-x/

Iniciamos.

Paso 0: El Error: failure to build vmnet

En este post que he citado, encuentro que el problema reside en el módulo vmnet.rar más no en la versión del compilador GCC.

2014-06-22T21:44:26.686-06:00| modconfig| I120: Extracting the vmnet source from "/usr/lib/vmware/modules/source/vmnet.tar".
2014-06-22T21:44:26.700-06:00| modconfig| I120: Successfully extracted the vmnet source.
2014-06-22T21:44:26.700-06:00| modconfig| I120: Building module with command "/usr/bin/make -j2 -C /tmp/modconfig-LY2zXV/vmnet-only auto-build HEADER_DIR=/lib/modules/3.14-kali1-amd64/build/include CC=/usr/bin/gcc IS_GCC_3=no"
2014-06-22T21:44:36.438-06:00| modconfig| W110: Failed to build vmnet.  Failed to execute the build command.

Así que la causa de la raíz para que VMware Player se iniciara, es la falla en el intento de la construcción del módulo del kernel llamado vmnet.

Afortunadamente, el dódigo fuente de vmnet está abierto y es disponible para editar. El log de arriba te ha dicho donde encontrar los archivos fuentes de vmnet.tar .

Paso 1: Verificar manualmente la construcción del módulo

Para navegar hsata el arhivo vmnet.rar vamos a:
/usr/lib/vmware/modules/source/

Por motivo de comodidad me fui de forma gráfica a extraer el contenido del ficheron vmnet.tar, una vez decompreso en una carpeta llamada "vmnet-only" ingresé a este directorio y procedí a realizar la compilación con make obteniendo este resultado:

root@kali:/usr/lib/vmware/modules/source/vmnet-only# make
Using 2.6.x kernel build system.
make -C /lib/modules/3.14-kali1-amd64/build/include/.. SUBDIRS=$PWD SRCROOT=$PWD/. \
      MODULEBUILDDIR= modules
make[1]: se ingresa al directorio `/usr/src/linux-headers-3.14-kali1-amd64'
  CC [M]  /usr/lib/vmware/modules/source/vmnet-only/driver.o
In file included from /usr/lib/vmware/modules/source/vmnet-only/monitorAction_exported.h:31:0,
                 from /usr/lib/vmware/modules/source/vmnet-only/vnet.h:29,
                 from /usr/lib/vmware/modules/source/vmnet-only/vnetInt.h:24,
                 from /usr/lib/vmware/modules/source/vmnet-only/driver.c:51:
/usr/lib/vmware/modules/source/vmnet-only/vm_assert.h:259:0: warning: "DEPRECATED" redefined [enabled by default]
In file included from /usr/src/linux-headers-3.14-kali1-common/include/linux/kernel.h:13:0,
                 from /usr/lib/vmware/modules/source/vmnet-only/driver.c:23:
/usr/src/linux-headers-3.14-kali1-common/include/linux/printk.h:96:0: note: this is the location of the previous definition
  CC [M]  /usr/lib/vmware/modules/source/vmnet-only/hub.o
In file included from /usr/lib/vmware/modules/source/vmnet-only/monitorAction_exported.h:31:0,
                 from /usr/lib/vmware/modules/source/vmnet-only/vnet.h:29,
                 from /usr/lib/vmware/modules/source/vmnet-only/vnetInt.h:24,
                 from /usr/lib/vmware/modules/source/vmnet-only/hub.c:43:
/usr/lib/vmware/modules/source/vmnet-only/vm_assert.h:259:0: warning: "DEPRECATED" redefined [enabled by default]
In file included from /usr/src/linux-headers-3.14-kali1-common/include/linux/kernel.h:13:0,
                 from /usr/lib/vmware/modules/source/vmnet-only/hub.c:23:
/usr/src/linux-headers-3.14-kali1-common/include/linux/printk.h:96:0: note: this is the location of the previous definition
  CC [M]  /usr/lib/vmware/modules/source/vmnet-only/userif.o
In file included from /usr/lib/vmware/modules/source/vmnet-only/monitorAction_exported.h:31:0,
                 from /usr/lib/vmware/modules/source/vmnet-only/vnet.h:29,
                 from /usr/lib/vmware/modules/source/vmnet-only/vnetInt.h:24,
                 from /usr/lib/vmware/modules/source/vmnet-only/userif.c:45:
/usr/lib/vmware/modules/source/vmnet-only/vm_assert.h:259:0: warning: "DEPRECATED" redefined [enabled by default]
In file included from /usr/src/linux-headers-3.14-kali1-common/include/linux/kernel.h:13:0,
                 from /usr/src/linux-headers-3.14-kali1-common/arch/x86/include/asm/percpu.h:44,
                 from /usr/src/linux-headers-3.14-kali1-common/arch/x86/include/asm/preempt.h:5,
                 from /usr/src/linux-headers-3.14-kali1-common/include/linux/preempt.h:20,
                 from /usr/src/linux-headers-3.14-kali1-common/include/linux/spinlock.h:50,
                 from /usr/src/linux-headers-3.14-kali1-common/include/linux/wait.h:8,
                 from /usr/src/linux-headers-3.14-kali1-common/include/linux/fs.h:6,
                 from /usr/src/linux-headers-3.14-kali1-common/include/linux/highmem.h:4,
                 from /usr/lib/vmware/modules/source/vmnet-only/userif.c:26:
/usr/src/linux-headers-3.14-kali1-common/include/linux/printk.h:96:0: note: this is the location of the previous definition
  CC [M]  /usr/lib/vmware/modules/source/vmnet-only/netif.o
In file included from /usr/lib/vmware/modules/source/vmnet-only/monitorAction_exported.h:31:0,
                 from /usr/lib/vmware/modules/source/vmnet-only/vnet.h:29,
                 from /usr/lib/vmware/modules/source/vmnet-only/vnetInt.h:24,
                 from /usr/lib/vmware/modules/source/vmnet-only/netif.c:42:
/usr/lib/vmware/modules/source/vmnet-only/vm_assert.h:259:0: warning: "DEPRECATED" redefined [enabled by default]
In file included from /usr/src/linux-headers-3.14-kali1-common/include/linux/kernel.h:13:0,
                 from /usr/lib/vmware/modules/source/vmnet-only/netif.c:23:
/usr/src/linux-headers-3.14-kali1-common/include/linux/printk.h:96:0: note: this is the location of the previous definition
  CC [M]  /usr/lib/vmware/modules/source/vmnet-only/bridge.o
In file included from /usr/lib/vmware/modules/source/vmnet-only/monitorAction_exported.h:31:0,
                 from /usr/lib/vmware/modules/source/vmnet-only/vnet.h:29,
                 from /usr/lib/vmware/modules/source/vmnet-only/vnetInt.h:24,
                 from /usr/lib/vmware/modules/source/vmnet-only/bridge.c:52:
/usr/lib/vmware/modules/source/vmnet-only/vm_assert.h:259:0: warning: "DEPRECATED" redefined [enabled by default]
In file included from /usr/src/linux-headers-3.14-kali1-common/include/linux/kernel.h:13:0,
                 from /usr/lib/vmware/modules/source/vmnet-only/bridge.c:23:
/usr/src/linux-headers-3.14-kali1-common/include/linux/printk.h:96:0: note: this is the location of the previous definition
  CC [M]  /usr/lib/vmware/modules/source/vmnet-only/filter.o
In file included from /usr/lib/vmware/modules/source/vmnet-only/monitorAction_exported.h:31:0,
                 from /usr/lib/vmware/modules/source/vmnet-only/vnet.h:29,
                 from /usr/lib/vmware/modules/source/vmnet-only/vnetInt.h:24,
                 from /usr/lib/vmware/modules/source/vmnet-only/filter.c:48:
/usr/lib/vmware/modules/source/vmnet-only/vm_assert.h:259:0: warning: "DEPRECATED" redefined [enabled by default]
In file included from /usr/src/linux-headers-3.14-kali1-common/include/linux/kernel.h:13:0,
                 from /usr/lib/vmware/modules/source/vmnet-only/filter.c:20:
/usr/src/linux-headers-3.14-kali1-common/include/linux/printk.h:96:0: note: this is the location of the previous definition
/usr/lib/vmware/modules/source/vmnet-only/filter.c:206:1: error: conflicting types for ‘VNetFilterHookFn
/usr/lib/vmware/modules/source/vmnet-only/filter.c:64:18: note: previous declaration of ‘VNetFilterHookFn’ was here
/usr/lib/vmware/modules/source/vmnet-only/filter.c:64:18: warning: ‘VNetFilterHookFn’ used but never defined [enabled by default]
/usr/lib/vmware/modules/source/vmnet-only/filter.c:206:1: warning: ‘VNetFilterHookFn’ defined but not used [-Wunused-function]
make[4]: *** [/usr/lib/vmware/modules/source/vmnet-only/filter.o] Error 1
make[3]: *** [_module_/usr/lib/vmware/modules/source/vmnet-only] Error 2
make[2]: *** [sub-make] Error 2
make[1]: *** [all] Error 2
make[1]: se sale del directorio `/usr/src/linux-headers-3.14-kali1-amd64'
make: *** [vmnet.ko] Error 2
 

Entonces, hemos confirmado que la raíz de la causa es el módulo vmnet.ko. Específicamente, VNetFilterHookFn en el fichero filter.c que es lo que causa el error en la construcción. Así que, ¿qué es lo que pasó allí?

Paso 2: RCA - Root Cause Analysis (Análisis de la raíz de la causa)

En la más última versión del kenel, 3.13.5, la firma del enganche de la función de netfilter (nf_hookfn) ha sido cambiada como resultado de las reparciones del código. Sin embargo, VNetFilterHookFn todavía está utilizando la definición antigua de nf_hookfn. Eso es el motivo por el cual no podía compilar vmnet.ko. Para más detalles, por favor revise el siguiente enlace: http://lxr.linux.no/linux+v3.13.5/include/linux/netfilter.h#L46 (este enlace a fecha de hoy 23/06/2014 no conecta")

Paso 3: Haciendo las repaciones.

En el artículo original, utiliza el comando diff para sacar las diferencias entre el archivo filter.c contra de otro llamado filter.c.orig sinceramente, no se si del enlace del Paso 2 es que sacó el archivo con estensión .orig sin embargo, al no encontrar dicho archivo me puse a repararlo a mano.

Así que, estas son las líneas que hay que cambiar:

[root@daveti vmnet-only]#  diff   filter.c.orig   filter.c
206c206,207
< VNetFilterHookFn(unsigned int hooknum,                 // IN:

> //VNetFilterHookFn(unsigned int hooknum,                 // IN:
> VNetFilterHookFn(const struct nf_hook_ops *ops, //daveti: fix
255c256,258
<    transmit = (hooknum == VMW_NF_INET_POST_ROUTING);

>    //transmit = (hooknum == VMW_NF_INET_POST_ROUTING);
>    //daveti: fix
>    transmit = (ops->hooknum == VMW_NF_INET_POST_ROUTING);
[root@daveti vmnet-only]#

Las diferencias estaban en las líneas 206 y 256 del archivo filter.c, por lo que para ubicar los números de línea con mayor rapidez ejecuté en ese mismo directorio gedit filter.c


Siendo un archivo con código fuente del lenguaje C, lo que hice tal como lo indica, comentarear las líneas que tiene indicadas con doble barra "//" y luego poner en la siguiente línea (copiando y pengando) las líneas de código que se encuentran de color rojo en su lugar correspondiente.

Paso 4: Verificando la reparación (ejecutando make de nuevo!)

Después de haber realizado el parcheado del archivo filter.c, ahora deberíamos de estar en la disposición de construir en el kernel el módulo vmnet. Asegurémonos que la reparación funciona.

root@kali:/usr/lib/vmware/modules/source/vmnet-only# make
Using 2.6.x kernel build system.
make -C /lib/modules/3.14-kali1-amd64/build/include/.. SUBDIRS=$PWD SRCROOT=$PWD/. \
      MODULEBUILDDIR= modules
make[1]: se ingresa al directorio `/usr/src/linux-headers-3.14-kali1-amd64'
  CC [M]  /usr/lib/vmware/modules/source/vmnet-only/filter.o
In file included from /usr/lib/vmware/modules/source/vmnet-only/monitorAction_exported.h:31:0,
                 from /usr/lib/vmware/modules/source/vmnet-only/vnet.h:29,
                 from /usr/lib/vmware/modules/source/vmnet-only/vnetInt.h:24,
                 from /usr/lib/vmware/modules/source/vmnet-only/filter.c:48:
/usr/lib/vmware/modules/source/vmnet-only/vm_assert.h:259:0: warning: "DEPRECATED" redefined [enabled by default]
In file included from /usr/src/linux-headers-3.14-kali1-common/include/linux/kernel.h:13:0,
                 from /usr/lib/vmware/modules/source/vmnet-only/filter.c:20:
/usr/src/linux-headers-3.14-kali1-common/include/linux/printk.h:96:0: note: this is the location of the previous definition
  CC [M]  /usr/lib/vmware/modules/source/vmnet-only/procfs.o
In file included from /usr/lib/vmware/modules/source/vmnet-only/monitorAction_exported.h:31:0,
                 from /usr/lib/vmware/modules/source/vmnet-only/vnet.h:29,
                 from /usr/lib/vmware/modules/source/vmnet-only/vnetInt.h:24,
                 from /usr/lib/vmware/modules/source/vmnet-only/procfs.c:43:
/usr/lib/vmware/modules/source/vmnet-only/vm_assert.h:259:0: warning: "DEPRECATED" redefined [enabled by default]
In file included from /usr/src/linux-headers-3.14-kali1-common/include/linux/kernel.h:13:0,
                 from /usr/lib/vmware/modules/source/vmnet-only/procfs.c:23:
/usr/src/linux-headers-3.14-kali1-common/include/linux/printk.h:96:0: note: this is the location of the previous definition
  CC [M]  /usr/lib/vmware/modules/source/vmnet-only/smac_compat.o
In file included from /usr/lib/vmware/modules/source/vmnet-only/monitorAction_exported.h:31:0,
                 from /usr/lib/vmware/modules/source/vmnet-only/vnet.h:29,
                 from /usr/lib/vmware/modules/source/vmnet-only/vnetInt.h:24,
                 from /usr/lib/vmware/modules/source/vmnet-only/smac_compat.c:53:
/usr/lib/vmware/modules/source/vmnet-only/vm_assert.h:259:0: warning: "DEPRECATED" redefined [enabled by default]
In file included from /usr/src/linux-headers-3.14-kali1-common/include/linux/kernel.h:13:0,
                 from /usr/lib/vmware/modules/source/vmnet-only/smac_compat.c:33:
/usr/src/linux-headers-3.14-kali1-common/include/linux/printk.h:96:0: note: this is the location of the previous definition
  CC [M]  /usr/lib/vmware/modules/source/vmnet-only/smac.o
  CC [M]  /usr/lib/vmware/modules/source/vmnet-only/vnetEvent.o
In file included from /usr/lib/vmware/modules/source/vmnet-only/monitorAction_exported.h:31:0,
                 from /usr/lib/vmware/modules/source/vmnet-only/vnet.h:29,
                 from /usr/lib/vmware/modules/source/vmnet-only/vnetEvent.h:27,
                 from /usr/lib/vmware/modules/source/vmnet-only/vnetEvent.c:57:
/usr/lib/vmware/modules/source/vmnet-only/vm_assert.h:259:0: warning: "DEPRECATED" redefined [enabled by default]
In file included from /usr/src/linux-headers-3.14-kali1-common/include/linux/kernel.h:13:0,
                 from /usr/src/linux-headers-3.14-kali1-common/arch/x86/include/asm/percpu.h:44,
                 from /usr/src/linux-headers-3.14-kali1-common/arch/x86/include/asm/preempt.h:5,
                 from /usr/src/linux-headers-3.14-kali1-common/include/linux/preempt.h:20,
                 from /usr/src/linux-headers-3.14-kali1-common/include/linux/spinlock.h:50,
                 from /usr/src/linux-headers-3.14-kali1-common/include/linux/mmzone.h:7,
                 from /usr/src/linux-headers-3.14-kali1-common/include/linux/gfp.h:5,
                 from /usr/src/linux-headers-3.14-kali1-common/include/linux/slab.h:14,
                 from /usr/lib/vmware/modules/source/vmnet-only/vnetKernel.h:30,
                 from /usr/lib/vmware/modules/source/vmnet-only/vnetEvent.c:56:
/usr/src/linux-headers-3.14-kali1-common/include/linux/printk.h:96:0: note: this is the location of the previous definition
  CC [M]  /usr/lib/vmware/modules/source/vmnet-only/vnetUserListener.o
In file included from /usr/lib/vmware/modules/source/vmnet-only/monitorAction_exported.h:31:0,
                 from /usr/lib/vmware/modules/source/vmnet-only/vnet.h:29,
                 from /usr/lib/vmware/modules/source/vmnet-only/vnetInt.h:24,
                 from /usr/lib/vmware/modules/source/vmnet-only/vnetUserListener.c:39:
/usr/lib/vmware/modules/source/vmnet-only/vm_assert.h:259:0: warning: "DEPRECATED" redefined [enabled by default]
In file included from /usr/src/linux-headers-3.14-kali1-common/include/linux/kernel.h:13:0,
                 from /usr/src/linux-headers-3.14-kali1-common/include/linux/plist.h:78,
                 from /usr/src/linux-headers-3.14-kali1-common/include/linux/pm_qos.h:7,
                 from /usr/src/linux-headers-3.14-kali1-common/include/linux/netdevice.h:28,
                 from /usr/lib/vmware/modules/source/vmnet-only/vnetUserListener.c:33:
/usr/src/linux-headers-3.14-kali1-common/include/linux/printk.h:96:0: note: this is the location of the previous definition
  LD [M]  /usr/lib/vmware/modules/source/vmnet-only/vmnet.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /usr/lib/vmware/modules/source/vmnet-only/vmnet.mod.o
  LD [M]  /usr/lib/vmware/modules/source/vmnet-only/vmnet.ko
make[1]: se sale del directorio `/usr/src/linux-headers-3.14-kali1-amd64'
make -C $PWD SRCROOT=$PWD/. \
      MODULEBUILDDIR= postbuild
make[1]: se ingresa al directorio `/usr/lib/vmware/modules/source/vmnet-only'
make[1]: `postbuild' está actualizado.
make[1]: se sale del directorio `/usr/lib/vmware/modules/source/vmnet-only'
cp -f vmnet.ko ./../vmnet.o

root@kali:/usr/lib/vmware/modules/source/vmnet-only#

Y efectivamente, compiló y se construyó el módulo en el kernel sin problema alguno.

Paso 5: Volver a empacar con tar e iniciar.

Ahora es tiempo de volver a empacar con tar la carpeta vment-only para que se llame "vmnet.tar", pero antes renombramos el fichero vmnet.tar antiguo (por ejemplo: vmnet.tar.old). Siempre por motivos prácticos, yendo a la interfaz gráfica, se hace clic-derecho sobre la carpeta vmnet-only y se escoge la opción comprimir y se escoge que sea extensión .tar

Empacando con tar la carpeta vmnet-only a su estado original vmnet.tar

En el lugar de destino, he dejado que cree el archivo vmnet.tar dentro de la misma carpeta vmnet-only, pero luego corto el archivo y lo pego fuera de la carpeta que es donde debe quedar.

Ahora para probar que todo funciona como debe ser, vamos a "Aplicaciones - Herramientas del Sistema - VMware Player", y a disfrutar de las máquinas virtuales, y de Untangle que me estaba esperando.

Compilando el módulo de Dispositivo de Red Virtual: Ok


Untangle, estado: Up and Running

Espero que esta versión en español (personalizada con mi versión del kernel) sea de utilidad para alguien como lo fue para mí la versión original en inglés:
http://davejingtian.org/2014/03/04/hack-make-vmware-player-6-0-1-start-on-linux-kernel-3-13-x/

Bytes.

4 comentarios:

Unknown dijo...

Muchas gracias por la currada que te has pegado. Me ha ayudado mucho después de bastante tiempo buscando la solución al problema. :)

root dijo...

Gracias a ti, Juan Fran Pérez, por tomarte el tiempo y poner un comentario. Se siente bien poder ser útil al prójimo.

Me alegra que te haya servido la solución que encontré y la interpretación del inglés que realicé.

Algunas partes del código de ejemplo son adaptaciones del problema que resolví.

Un saludo y éxitos.

FoxBack dijo...

tengo el mismo problema me podrias ayudar con los comandos cuales serian para arreglar este preoblema , gracias

root dijo...

FoxBack, lee despacio todo este post, allí están los comandos con los que pude resolver el problema.

Cada paso está marcado en negritas, y en cada paso están los comandos que utilicé.

Saludos.

 

Copyright © El igloo de Tux Design by O Pregador | Blogger Theme by Blogger Template de luxo | Powered by Blogger