Linux: Inodes y borrado masivo de archivos

Los index nodes o inodes son metadatos de un objeto del sistema, por ejemplo un archivo, un directorio o una liga simbólica. Aquí les muestro cómo se pueden manejar este tipo de objetos.

Estos metadatos contienen información como:

  • Tipo de archivo
  • Tamaño del archivo.
  • Propietario.
  • Grupo.
  • Permisos.
  • Etcétera.

Lo importante, es que se tiene un inode por cada objeto que existe, no importando el tamaño del objeto, recordemos, este objeto puede ser un archivo, un directorio o una liga simbólica.

¿Cómo se sabe que hay un problema con inodes?

El problema principal, es que no hay espacio libre en un file system. Por ejemplo, con un simple echo mandando la salida a un archivo de texto, se puede obtener lo siguiente:

doomsday|laboratory|$ echo "Mensaje de texto" > archivo.txt
-bash: archivo.txt: No space left on device

Al revisar en qué directorio estamos situados, se ve que es el /home/doomsday:

doomsday|laboratory|$ pwd
/home/doomsday

Y al ver los file systems, se observa que no hay uno especial para /home ni para /home/doomsday:

doomsday|laboratory|$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1   14G 6.2G 6.9G  48% /
tmpfs      3.0G 284K 3.0G   1% /dev/shm
doomsday   901G 338G 563G  38% /media/sf_doomsday

Por lo tanto, este reside en el file system raíz (/), ¡que tiene espacio suficiente!:

doomsday|laboratory|$ df -h /
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 14G 6.2G 6.9G 48% /

Sin embargo, al revisar los inodes de dicho archivo, vemos que hay un problema porque están prácticamente al 100% de ocupación, por eso el error generado:

doomsday|laboratory|$ df -i /
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 917504 917502 2 100% /

Importante. Aunque el tipo de file system ext3 y ext4 tienen capacidad para millones de archivos, en realidad, los inodes son configurados estáticamente y tienen un límite realmente pequeño. En este caso, de apenas 917,504.

Al comparar el espacio libre en el file system, 6.9GB contra el límite de inodes alcanzado, se puede inferir fácilmente, que se han creado muchos archivos de tamaño pequeño, por eso, se ha alcanzado el límite de los inodes antes que llenar el file system con espacio físico de los mismos archivos.

¿Cómo liberar los inodes?

No queda de otra más que borrar los archivos, en este caso, se detecta dónde están creados estos y hay que liberarlos.

Proceso para liberar muchos archivos.

Es común que no se pueda fácilmente borrar muchos archivos así como así en Linux o Unix, debido a que en memoria, se contruyen listas con los objetos que serán tratados con comandos de borrado como el rm o el find:

doomsday|laboratory|$ rm *.txt
-bash: /bin/rm: Argument list too long

doomsday|laboratory|$ find * -name '*.txt' -exec rm {} \;
-bash: /bin/find: Argument list too long

doomsday|laboratory|$ ls -lhrt *.txt | head -5
-bash: /bin/ls: Argument list too long

Por lo que no sirve un proceso típico de borrado, hay que seccionar la información en pedazos más pequeños (divide y vencerás). En este caso, primero hay que ver cuántos archivos se tienen:

doomsday|laboratory|$ ls | wc -l
800884

Luego, sin usar la expresión regular *.txt, se puede hacer un seccionamiento al ordenar los archivos del más antiguo al más nuevo, e imprimiendo los 15 más viejos:

doomsday|laboratory|$ ls -lhrt | head -15
total 3.1G
drwxr-xr-x. 2 doomsday doomsday 4.0K Mar 1 2018 Desktop
drwxr-xr-x. 2 doomsday doomsday 4.0K Mar 1 2018 Templates
drwxr-xr-x. 2 doomsday doomsday 4.0K Mar 1 2018 Downloads
drwxr-xr-x. 2 doomsday doomsday 4.0K Mar 1 2018 Videos
drwxr-xr-x. 2 doomsday doomsday 4.0K Mar 1 2018 Public
drwxr-xr-x. 2 doomsday doomsday 4.0K Mar 1 2018 Pictures
drwxr-xr-x. 2 doomsday doomsday 4.0K Mar 1 2018 Music
drwxr-xr-x. 2 doomsday doomsday 4.0K Mar 1 2018 Documents
drwxr-xr-x. 2 doomsday doomsday 4.0K Jul 17 13:55 ooo_scripts
-rw-r--r--. 1 doomsday doomsday 0 Sep 3 18:33 1536017588.txt
-rw-r--r--. 1 doomsday doomsday 5 Sep 3 18:40 t1536018000.txt
-rw-r--r--. 1 doomsday doomsday 5 Sep 3 18:40 t1536018001.txt
-rw-r--r--. 1 doomsday doomsday 5 Sep 3 18:40 t1536018002.txt
-rw-r--r--. 1 doomsday doomsday 5 Sep 3 18:40 t1536018003.txt

Así, ya se obtiene un resultado, por el hecho de que sin la expresión regular *.txt, se pueden leer todos los archivos y directorios, Linux simplemente trae los primeros archivos que se ncuentra. De hecho, se observan al inicio, unos directorios, estos no estorbarán para el proceso siguiente.

Como se puede entonces leer una cantidad grande archivos, por medio del uso de pipes (|), se podrán entonces traer los 500 archivos más viejos y borrarlos en directo. Los directorios no se borrarán porque no se está agregando el modificador -rf al borrado:

doomsday|laboratory|$ ls -rt | head -5000 | xargs rm
rm: cannot remove `Desktop': Is a directory
rm: cannot remove `Templates': Is a directory
rm: cannot remove `Downloads': Is a directory
rm: cannot remove `Videos': Is a directory
rm: cannot remove `Public': Is a directory
rm: cannot remove `Pictures': Is a directory
rm: cannot remove `Music': Is a directory
rm: cannot remove `Documents': Is a directory
rm: cannot remove `ooo_scripts': Is a directory

De esta manera, ya se redujo la cantidad de archivos en la primer fase de borrado:

doomsday|laboratory|$ ls | wc -l
795893

Se pueden hacer pruebas borrando más archivos porque son tantos que en rebanadas tan pequeñas de 5,000, tomaría mucho tiempo el liberar el espacio.

doomsday|laboratory|$ ls -rt | head -10000 | xargs rm
rm: cannot remove `Desktop': Is a directory
rm: cannot remove `Templates': Is a directory
rm: cannot remove `Downloads': Is a directory
rm: cannot remove `Videos': Is a directory
rm: cannot remove `Public': Is a directory
rm: cannot remove `Pictures': Is a directory
rm: cannot remove `Music': Is a directory
rm: cannot remove `Documents': Is a directory
rm: cannot remove `ooo_scripts': Is a directory

doomsday|laboratory|$ ls | wc -l
785902

Este proceso se puede repetir las veces que sea necesario hasta dejar sólo un pequeño conjunto de archivos.  Una vez que esto ocurra:

doomsday|laboratory|$ ls | wc -l
85965

Se puede ahora sí, usar un método tradicional de borrado:

doomsday|laboratory|$ find * -name '*.txt' -exec rm {} \;
doomsday|laboratory|$ ls | wc -l
9

Una vez que ya se limpió el file system de tanto archivo generado, ya se puede ver que los inodes han bajado a un porcentaje de uso muy pequeño:

doomsday|laboratory|$ df -i /
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 917504 116627 800877 13% /

Con lo cual, se podrá crear el archivo que inicialmente no se podía:

doomsday|laboratory|$ echo "Mensaje de texto" > archivo.txt
doomsday|laboratory|$ ls -lha archivo.txt
-rw-r--r--. 1 doomsday doomsday 17 Sep 4 11:04 archivo.txt

De esta forma, si un día necesitan borrar alguna cantidad importante de archivos, lo podrán hacer y si un día a pesar de que haya espacio en el file system, no puedan crear un archivo, sabrán cuál es la razón….. ¡los inodes!

Si la información de este post te ha sido de utilidad o quieres que agregue algo más, deja por favor un comentario, contestaré a la brevedad.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

A %d blogueros les gusta esto: