Comencemos hablando de lo que es un inodo. Imaginémoslo como un descriptor de un archivo dentro de un dispositivo de almacenamiento específico. En otras palabras, es un tipo de objeto de metadatos que le dice al sistema operativo dónde se encuentra un archivo en el disco y también tiene otros datos importantes del mismo archivo, excepto su nombre y los datos.

Los inodos se almacenan por partición y tienen un límite real por partición.

Un problema muy poco común que pueden encontrar en vCenter Server Appliance o incluso en ESXis es que hayan alcanzado el límite de inodos disponibles en un disco específico o partición, pero, ¿cómo es eso?

Cada partición puede contener una “x” cantidad de inodos, lo que significa que tenemos un límite de cantidad de archivos que podemos almacenar en un disco. Esto es aparte del tamaño de cada archivo, que también determina cuándo un disco está lleno. Para resumir esta línea, podemos tener un disco o partición “lleno” cuando se alcanza el 100% del espacio o cuando se ha utilizado el 100% de los inodos disponibles.

Por lo tanto, el propósito de este artículo es mostrarles cómo lidiar con los inodos cuando han ejecutado el comando “df -h” y todas las particiones están por debajo del 100%, pero aún obtienen el error “No space left on device“. Esto podría ser un problema de inodos que tenemos que arreglar.

¿Cómo sé si me quedé sin inodos disponibles en una partición?

En el ejemplo del comando de abajo tenemos que mirar la salida del comando “df -i” para vCenter Appliance. Notemos que estamos usando la opción “-i”, que es para mostrarnos la cantidad de inodos disponibles, usados y libres de cada partición. También observemos que “/dev/sda3” se ha quedado sin inodos. Para ESXi el comando es “stat -f /” donde podemos cambiar “/” por otra partición como “/tmp” para ver si existe algún problema.

vCenter Server Appliance

ESXi

root@vcsa [ / ]# df -i
Filesystem                                 Inodes  IUsed    IFree IUse% Mounted on
devtmpfs                                  3083436    528  3082908    1% /dev
tmpfs                                     3085136      4  3085132    1% /dev/shm
tmpfs                                     3085136    695  3084441    1% /run
tmpfs                                     3085136     16  3085120    1% /sys/fs/cgroup
/dev/sda3                                  712704 712704    0   100% /
tmpfs                                     3085136     97  3085039    1% /tmp
/dev/sda1                                   32768    306    32462    1% /boot
/dev/mapper/dblog_vg-dblog                1638400    101  1638299    1% /storage/dblog
/dev/mapper/imagebuilder_vg-imagebuilder  1638400     14  1638386    1% /storage/imagebuilder
/dev/mapper/netdump_vg-netdump             655360     11   655349    1% /storage/netdump
/dev/mapper/db_vg-db                      1638400   4256  1634144    1% /storage/db

[root@esxi-1:~] stat -f /
File: "/"
ID: 100000000 Namelen: 127 Type: visorfs
Block size: 4096
Blocks: Total: 300410 Free: 130384 Available: 130384
Inodes: Total: 655360 Free: 0

Entonces, ¿cómo podemos solucionarlo?

Tenemos que encontrar cuál directorio tiene muchos archivos, normalmente pequeños archivos de unos pocos bytes o kilobytes. Pero, ¿cómo podemos hacer eso? ejecutemos este comando:

for i in /*; do echo $i; find $i |wc -l; done

Este comando les mostrará una lista de todos los directorios y subdirectorios a partir del directorio raíz y la cantidad de archivos que contiene. Lo que deben hacer a continuación es identificar cuál directorio tiene muchos archivos (probablemente miles) y ejecutar el comando nuevamente cualquier cantidad de veces hasta que encuentren el directorio final que almacena todos esos pequeños archivos.

Ahora, ya identificamos el directorio, ¿qué sigue? Simplemente usar el comando “rm” para eliminarlos.

¿De repente hay muchos archivos y tienen problemas para eliminarlos todos al mismo tiempo?

Lo mejor es utilizar comodines de linux como “*” y “#” para eliminar  automáticamente muchos archivos el mismo tiempo en un sólo comando. Un ejemplo de esto es que el comando “ls -l” puede retornar una lista parecida de archivos:

tmpRhga234.txt
tmpRhga235.txt
tmpRhga236.txt
tmpRhga237.txt
tmpRhga238.txt
tmpRhga239.txt
tmpRhga240.txt
tmpRhga241.txt

Noten que tienen un patrón inicial con el nombre tmpRhga2 en cual es igual en todos, entonces podemos borrarlos así:

rm tmpRhga2*.txt

¿Aún tienen problemas? Es muy probable que el mensaje de error que reciban sea “The argument is too long“, por lo que la forma más rápida es eliminar todo el directorio, pero tengan mucho cuidado si hay más directorios dentro, si este es el caso, no continúen y borren una lista de archivos más pequeños al mismo tiempo. Si no hay más directorios dentro y solo hay archivos, ejecuten los siguientes comandos:

  • Anota los permisos, el dueño y el grupo del directorio:
ls -l
  • Elimina el directorio:
rm -rf nombreDirectorio
  • Crea un directorio nuevo:
mkdir nombreDirectorioIgualAlAnterior
  • Cambia los permisos:
chmod ### nombreDirectorioIgualAlAnterior

donde ### es el numero indicado para dar permisos al directorio como por ejemplo 755.

  • Luego cambien el dueño del directorio y el grupo:
chown owner:group nombreDirectorioIgualAlAnterior

¿Cuáles archivos eliminar?

Aparte de saber cómo eliminar los archivos que les acabo de enseñar, es muy importante saber cuáles archivos son seguros de eliminar.

La siguiente lista les ayudará a identificar que es posible eliminar sin miedo.

Archivos en /tmp

Muchas veces tenemos problemas de plugins, drivers o funcionamiento de algunos servicios de ESXi o vCenter porque /tmp se quedó sin espacio o sin inodos. Si /tmp está lleno, lo mejor es reiniciar, mas si no es posible, entonces podriamos eliminar los archivos aquí.

ESXi:

Archivos en /var/run/log

Podemos borrar archivos antiguos de logs identificados con extension .log.# donde # es un número de 0 a 9.

vCenter:

Archivos en /var/log/vmware

Dentro de /var/log/vmware existen varias carpetas de todos los servicios de vCenter. Dentro de cada una es normal encontrar logs antiguos que rotaron en su momento con extensiones .log.#.zip. Es posible eliminar estos archivos.

Archivos .txt

Han existido algunos drivers en la historia de ESXi o plugins de vCenter que han escrito muchos archivos pequeños .txt en ciertas ubicaciones. Si los encontramos, busquemos que tenga un patrón en el nombre y podemos borrarlos.

Ante la duda abrir un caso de soporte con VMware

¿Cómo abrir un caso de soporte con VMware?