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.