Esta pagina se ve mejor con JavaScript habilitado

Inodo ese gran desconocido

 ·  🎃 kr0m

Los sistemas de ficheros se componen de bloques, cada bloque es un pedacito del disco duro, estos pedacitos se pueden utilizar para varios propósitos, metadatos y superbloques.

  • Metadatos: Información útil del usuario
  • Superbloques: Información como tipo de sistema de ficheros, tamaño, estado, información de estructuras.

Como esta información es imprescindible esta es replicada en varias localizaciones del sistema de ficheros.

Se puede localizar según el tamaño de bloque:
1k –> Bloque 8193
2k –> Bloque 16384
4k –> Bloque 32768

O desmontando el sistema de ficheros y ejecutando:

mke2fs -n /dev/sdaX
dumpe2fs /dev/sdaX|grep -i superblock

Los inodos sirven para localizar en que bloques físicos están los ficheros/directorios dentro del sistema de ficheros, además almacenan cierta info:

  • Tipo de fichero: ejecutable, bloque especial…
  • Permisos
  • Porpietario
  • Grupo
  • Tamaño
  • Último acceso
  • Hora de borrado
  • Número de links(hard/soft)
  • Atributos extendidos como append-only, no-borrable
  • ACLs

NOTA: La relación nombre – Inodo está en una tabla, esta tabla tiene un tamaño máximo.

Cada partición tiene su propia tabla de inodos, esto implica que no se puedan hacer hard-links(dos ficheros con el mismo inodo) entre partciones, con un ejemplo se verá mas fácil:

El rojo representa los sectores ocupados por el fichero1 mientras que los verdes los ocupados por fichero2.
Tabla inodos:

Nombre Fichero Inodo
Fichero1 Inodo1
Fichero2 Inodo2

Tabla datos inodos:

Inodo Sectores/Propietario/…
Inodo1 1-2
Inodo2 3-5

Si queremos generar un hard-link en esta partición no tendríamos problemas ya que tan solo hay que crear una entrada en la tabla de inodos:
Tabla inodos:

Nombre Fichero Inodo
Fichero1 Inodo1
Fichero2 Inodo2
Fichero3 Inodo2

De esta manera Fichero2 y 3 son el mismo fichero ya que ocupan los mismos sectores en el disco duro, el problema viene cuando hay varias particiones y queremos crear hard-links entre ellas, como cada tabla de inodos en cada partición es independiente nos es imposible.

Se puede consultar el inode de un fichero:

ls -i /etc/passwd
stat /etc/passwd

Es posible que nos quedemos sin inodes antes que sin espacio en el HD, esto es posible si se crean muchos ficheros pero de tamaño reducido, la tabla de inodes acabará full a pesar de disponer de espacio útil.

Si preveemos en la instalación del SO que vamos a generar muchísimos ficheros podemos generar el sistema de ficheros con tablas mayores a lo habitual.
mkfs.ext4
-N number-of-inodes –> Sobreescribimos el número de inodos calculados cuando se crea el sistema de ficheros.
-n –> Realizamos una simulación de la generación del sistema de ficheros, de este modo somos capaces de determinar la localización de los superbloques en el sistema de ficheros.


TROUBLESHOOTING:

No quedan inodos.
Se puede optar por varias opciones:

  • Si tenemos otras particiones: mover ficheros a esta y ln desde la localización original.
  • Añadir un disco duro, copiar los ficheros y montar el directorio en la partición nueva.
  • Crear un sistema de ficheros loop y montarlo en otro sitio:

Generamos el fichero con el espacio que tendrá nuestra nueva partición ficticia

dd if=/dev/zero of=my_fs bs=1024 count=3072000
losetup /dev/loop0 my_fs
mkfs -t ext4 -m 1 -v /dev/loop0
mount /dev/loop0 /mnt/aux/

El espacio se carga en la partición donde está el fichero my_fs y los inodos a /mnt/aux/, en la partición donde está my_fs solo se ha consumido un inodo, el del fichero en si mismo ;)

  • Eliminar tantos ficheros como podamos –>  el tamaño es indiferente, lo que realmente cuenta es el número de ficheros.
  • Hacer un backup en un HD externo.

Formatear con la opción -N de mkfs.ext4
Averiguamos cuantos inodos va a generar mkfsext4: mkfs.ext4 -n /dev/sdXX
Multiplicamos esa cifra por X y le indicamos cuantos inodos generar: mkfs.ext4 -N AA /dev/sdXX

Volcar los datos

Problemas con el sistema de ficheros.

Primero desmontamos el sistema de ficheros:

umount /DIR

Ralizamos un backup por si las moscas:

dd if=/dev/sdaX of=/diskX/backup-sdaX.img

Luego chequeamos el sistema de ficheros:

e2fsck -f /dev/sdaX

Si el superbloque está dañado e2fsck no podrá realizar la comprobación, como esta info está redundada se le puede indicar que utilize el superbloque de backup, esta info está en una localización diferente dependiendo del tamaño de bloque:
1k –> Bloque 8193
2k –> Bloque 16384
4k –> Bloque 32768

También se puede obtener con:

mke2fs -n /dev/sdaX
dumpe2fs /dev/sdaX|grep -i superblock
e2fsck -f -b {alternative-superblock} /dev/sdaX

Borrar ficheros por inodo:

Hay ocasiones en las que el fichero tiene un nombre con carácteres especiales y es necesario borrarlo mediante inodos(también se podría hacer escapando los carácteres):

Sacamos los inodos:

stat {file-name}
ls -il {file-name}

Borramos:

find . -inum [inode-number] -exec rm -i {} ;

Si te ha gustado el artículo puedes invitarme a un RedBull aquí