Al momento de actualizar el kernel en un guest CentOS, las VMware Tools dejan de funcionar debido a que los módulos del kernel Linux provistos por VMware para dar soporte a las mismas dejan de ser cargados. Esto ocurre porque estos módulos dependen de librerías del kernel. Y luego de una actualización del kernel (o si se inicia desde un kernel diferente) dejan de funcionar porque la configuración apunta a librerías diferentes.



Esta es la versión oficial del Knowledge Base de VMware. La realidad es que los módulos precompilados son compatibles entre diferentes versiones del kernel, y sólo se trata de una cuestión de configuración de módulos, tal como demostraré unos párrafos más adelante.

Veamos un caso puntual. He actualizado el kernel en un servidor CentOS 6 desde la versión "2.6.32-504.8.1" a la "2.6.32-504.12.2". Luego de reiniciar el sistema, las VMware Tools no están corriendo.

Al listar los módulos del kernel actualmente cargados, se observa que faltan los módulos de VMware vmci, vsock y vmxnet:

[root@centos6 ~]# lsmod 
Module                  Size  Used by
ipv6                  334740  0 
ipt_LOG                 5845  1 
xt_limit                2118  1 
ipt_REJECT              2351  1 
nf_conntrack_ipv4       9506  8 
nf_defrag_ipv4          1483  1 nf_conntrack_ipv4
xt_state                1492  8 
nf_conntrack           80422  2 nf_conntrack_ipv4,xt_state
iptable_filter          2793  1 
ip_tables              17831  1 iptable_filter
ext2                   68236  1 
ppdev                   8537  0 
vmware_balloon          7199  0 
parport_pc             22658  0 
parport                36209  2 ppdev,parport_pc
e1000                 160675  0 
i2c_piix4              11776  0 
i2c_core               29964  1 i2c_piix4
sg                     29318  0 
shpchp                 29130  0 
ext4                  378476  5 
jbd2                   93427  1 ext4
mbcache                 8193  2 ext2,ext4
sd_mod                 36998  5 
crc_t10dif              1305  1 sd_mod
sr_mod                 15049  0 
cdrom                  39085  1 sr_mod
mptspi                 16411  3 
mptscsih               36636  1 mptspi
mptbase                93647  2 mptspi,mptscsih
scsi_transport_spi     25447  1 mptspi
pata_acpi               3701  0 
ata_generic             3837  0 
ata_piix               24409  0 
dm_mirror              14384  0 
dm_region_hash         12085  1 dm_mirror
dm_log                  9930  2 dm_mirror,dm_region_hash
dm_mod                 95622  20 dm_mirror,dm_log

La versión actual del kernel es la más recientemente instalada:

[root@centos6 ~]# uname -r
2.6.32-504.12.2.el6.x86_64

Entonces, los módulos de VMware deberían estar instalados en el directorio /lib/modules/2.6.32-504.12.2*:

[root@centos6 ~]# cd /lib/modules/2.6.32-504.12.2.el6.x86_64/

Sin embargo, una búsqueda rápida demuestra que no se encuentran:

[root@centos6 2.6.32-504.12.2.el6.x86_64]# find . -type f -iname "vm*"
./kernel/drivers/scsi/vmw_pvscsi.ko
./kernel/drivers/net/vmxnet3/vmxnet3.ko
./kernel/drivers/misc/vmware_balloon.ko
./kernel/crypto/vmac.ko

Esto es bastante lógico si se piensa que el manejador de paquetes no tiene forma de saber qué módulos se han instalado manualmente. O sí, si fuese más flexible y examinara el contenido del archivo modules.dep antes de instalar el nuevo kernel. Aunque el problema sería que desconoce si estos módulos son compatibles o no con el nuevo kernel (entonces, tal vez por una cuestión de seguridad y robustez, no los agrega).

Sea como sea, los módulos no son cargados (sólo el balloon):

[root@centos6 2.6.32-504.12.2.el6.x86_64]# lsmod | grep vm
vmware_balloon          7199  0 

Al buscar dentro del directorio de módulos correspondientes al kernel anterior, encontramos los módulos faltantes:

[root@centos6 2.6.32-504.12.2.el6.x86_64]# find ../2.6.32-504.8.1.el6.x86_64/ -iname "vm*"
../2.6.32-504.8.1.el6.x86_64/kernel/drivers/scsi/vmw_pvscsi.ko
../2.6.32-504.8.1.el6.x86_64/kernel/drivers/net/vmxnet3
../2.6.32-504.8.1.el6.x86_64/kernel/drivers/net/vmxnet3/vmxnet3.ko
../2.6.32-504.8.1.el6.x86_64/kernel/drivers/misc/vmware_balloon.ko
../2.6.32-504.8.1.el6.x86_64/kernel/crypto/vmac.ko
../2.6.32-504.8.1.el6.x86_64/misc/vmxnet.ko
../2.6.32-504.8.1.el6.x86_64/misc/vmci.ko

En cambio, en el kernel actual ni siquiera existe el directorio misc:

[root@centos6 2.6.32-504.12.2.el6.x86_64]# ll misc
ls: cannot access misc: No such file or directory

Entonces no queda otra alternativa que reinstalar las VMware Tools, tarea que se encarga de instalar los módulos faltantes, entre otras cosas. Para ello ejecutar vmware-config-tools.pl:

[root@centos6 2.6.32-504.12.2.el6.x86_64]# vmware-config-tools.pl 
Initializing...


Making sure services for VMware Tools are stopped.



[EXPERIMENTAL] The VMware FileSystem Sync Driver (vmsync) is a new feature that
creates backups of virtual machines. Please refer to the VMware Knowledge Base 
for more details on this capability. Do you wish to enable this feature? 
[no] 

Found a compatible pre-built module for vmci.  Installing it...


Found a compatible pre-built module for vsock.  Installing it...


The module vmxnet3 has already been installed on this system by another 
installer or package and will not be modified by this installer.  Use the flag 
--clobber-kernel-modules=vmxnet3 to override.

The module pvscsi has already been installed on this system by another 
installer or package and will not be modified by this installer.  Use the flag 
--clobber-kernel-modules=pvscsi to override.

The module vmmemctl has already been installed on this system by another 
installer or package and will not be modified by this installer.  Use the flag 
--clobber-kernel-modules=vmmemctl to override.

The VMware Host-Guest Filesystem allows for shared folders between the host OS 
and the guest OS in a Fusion or Workstation virtual environment.  Do you wish 
to enable this feature? [no] 

Found a compatible pre-built module for vmxnet.  Installing it...


The vmblock enables dragging or copying files between host and guest in a 
Fusion or Workstation virtual environment.  Do you wish to enable this feature?
[no] 

No X install found.

Creating a new initrd boot image for the kernel.
vmware-tools start/running
The configuration of VMware Tools 8.6.10 build-913593 for Linux for this 
running kernel completed successfully.

You must restart your X session before any mouse or graphics changes take 
effect.

You can now run VMware Tools by invoking "/usr/bin/vmware-toolbox-cmd" from the
command line or by invoking "/usr/bin/vmware-toolbox" from the command line 
during an X server session.

To enable advanced X features (e.g., guest resolution fit, drag and drop, and 
file and text copy/paste), you will need to do one (or more) of the following:
1. Manually start /usr/bin/vmware-user
2. Log out and log back into your desktop session; and,
3. Restart your X session.

Enjoy,

--the VMware team

Al finalizar la instalación, los módulos quedan cargados en el kernel:

[root@centos6 2.6.32-504.12.2.el6.x86_64]# lsmod | grep vm
vmxnet                 17152  0 
vmci                   42456  1 vsock
vmware_balloon          7199  0

Y se ha creado el directorio misc, como era de esperarse:

[root@centos6 2.6.32-504.12.2.el6.x86_64]# find . -type f -iname "vm*"
./kernel/drivers/scsi/vmw_pvscsi.ko
./kernel/drivers/net/vmxnet3/vmxnet3.ko
./kernel/drivers/misc/vmware_balloon.ko
./kernel/crypto/vmac.ko
./misc/vmxnet.ko
./misc/vmci.ko

Desde el host ESX se comprueba que las VMware Tools están corriendo:

Ahora bien, si comparamos los módulos recientemente instalados con los de la versión anterior del kernel, vemos que son exactamente los mismos (notar que poseen el mismo tamaño en bytes):

[root@centos 2.6.32-504.12.2.el6.x86_64]# ll misc/
total 192
-rw-r--r-- 1 root root 79440 abr 20 09:56 vmci.ko
-rw-r--r-- 1 root root 34048 abr 20 09:57 vmxnet.ko
-rw-r--r-- 1 root root 73768 abr 20 09:56 vsock.ko
[root@centos 2.6.32-504.12.2.el6.x86_64]# ll ../2.6.32-504.8.1.el6.x86_64/misc/
total 192
-rw-r--r-- 1 root root 79440 ene 29 09:01 vmci.ko
-rw-r--r-- 1 root root 34048 ene 29 09:01 vmxnet.ko
-rw-r--r-- 1 root root 73768 ene 29 09:01 vsock.ko

Basta con calcular el checksum MD5 de uno para comprobarlo:

[root@centos 2.6.32-504.12.2.el6.x86_64]# cat misc/vmci.ko | md5sum 
e3f79d2cf0b65cc84d6b699cf240c84c  -
[root@centos 2.6.32-504.12.2.el6.x86_64]# cat ../2.6.32-504.8.1.el6.x86_64/misc/vmci.ko | md5sum
e3f79d2cf0b65cc84d6b699cf240c84c  -

Se observa que ambos módulos son exactamente iguales, por ende lo único que hizo el instalador vmware-config-tools.pl fue copiar los módulos al nuevo directorio "misc" dentro de la versión actual del kernel, y luego regenerar la imagen initrd para que sean cargados automáticamente durante el inicio.

Un experimento

Entonces, si son exactamente iguales, ¿qué pasa si intento instalarlos manualmente (en otro servidor CentOS similar)?

Comprobar la versión del kernel:

[root@another-centos ~]# uname -r
2.6.32-504.12.2.el6.x86_64

Cambiar al directorio de módulos correspondiente al kernel actual:

[root@another-centos ~]# cd /lib/modules/2.6.32-504.12.2.el6.x86_64/

Copiar los módulos desde la versión anterior:

[root@another-centos 2.6.32-504.12.2.el6.x86_64]# cp -a ../2.6.32-504.8.1.el6.x86_64/misc/ .

A continuación, intentar cargar el módulo vmci:

[root@another-centos 2.6.32-504.12.2.el6.x86_64]# modprobe vmci
FATAL: Module vmci not found.

El sistema no reconoce al módulo vmci ya que no está configurado en el archivo modules.dep. Para ello sería necesario ejecutar depmod -a. Sin embargo, a modo de prueba, es posible instalar módulos manualmente utilizando la herramienta insmod y especificando la ruta al archivo:

[root@another-centos 2.6.32-504.12.2.el6.x86_64]# cd misc/
[root@another-centos misc]# insmod vmci.ko
[root@another-centos misc]# insmod vsock.ko 
[root@another-centos misc]# insmod vmxnet.ko

Ahora sí, con los módulos cargados, es posible iniciar el demonio vmtoolsd para levantar las VMware Tools:

[root@another-centos misc]# /usr/sbin/vmtoolsd &
[1] 3714

Las VMware Tools están corriendo al igual que en el servidor anterior:

Esto es lo que, básicamente, ejecuta el script Perl vmware-tools-config.pl (además de regenerar la imagen initrd).

¿Por qué en Debian no ocurre lo mismo? Al actualizar el kernel Linux no siempre es necesario reinstalar las VMware Tools.

Porque a diferencia de CentOS y derivados, en Debian existe un único directorio para cada rama del kernel Linux dentro de /lib/modules (hasta el cuarto número). Por ejemplo, mientras que en un sistema CentOS existen los siguientes directorios:

[root@centos ~]# ll /lib/modules
total 20
drwxr-xr-x. 3 root root 4096 ago  7  2014 2.6.32-431.5.1.el6.x86_64
drwxr-xr-x  8 root root 4096 abr 20 09:57 2.6.32-504.12.2.el6.x86_64
drwxr-xr-x  8 root root 4096 ene  6 09:18 2.6.32-504.3.3.el6.x86_64
drwxr-xr-x  8 root root 4096 ene 29 09:01 2.6.32-504.8.1.el6.x86_64
drwxr-xr-x  7 root root 4096 nov  5 09:49 2.6.32-504.el6.x86_64

Es decir, cuatro directorios individuales para cada versión del kernel perteneciente a la rama 2.6.32-504.

En un sistema Debian existe un único directorio para la rama 2.6.32-5:

root@debian:~# ll /lib/modules/
total 20
drwxr-xr-x  3 root root  4096 nov  9  2012 .
drwxr-xr-x 11 root root 12288 mar 10 07:53 ..
drwxr-xr-x  4 root root  4096 feb 26 07:40 2.6.32-5-amd64

Cada vez que se actualiza a una nueva versión dentro de una misma rama, no es necesario reconfigurar los módulos ya que se detectan automáticamente, pues utiliza el mismo directorio. Solo será necesario reinstalar las VMware Tools al actualizar a una rama diferente (cosa poco probable al utilizar un kernel de la rama estable).

Por lo tanto, cada vez que se actualiza el kernel en un sistema CentOS, es necesario reconfigurar las VMware Tools, debido a esta cuestión particular de CentOS de utilizar un directorio nuevo para cada kernel.

Si se desea automatizar el proceso de reconfiguración de VMware Tools, es posible ejecutar el script Perl vmware-tools-config.pl de forma desatendida (respondiendo a todas las preguntas con la respuesta por defecto) utilizando el parámetro -d:

vmware-config-tools.pl -d

Espero que sea útil y les haya servido para comprender un poco cómo interactuan los diferentes componentes que hacen al funcionamiento de las VMware Tools en sistemas GNU/Linux.

Referencias

VMware Tools fail to start after a Linux guest operating system kernel upgrade

VMCI Overview

VMware Tools Balloon


Tal vez pueda interesarte


Compartí este artículo