Linux avanzado para principiantes (2)

Esta es la segunda parte de la guía “Linux avanzado para principiantes” y viene de la parte 1: El sistema de archivos de Linux.

Esperando no le resulte aburrido que cada tanto les aparezca con un post larguísimo de estos a los que no usan Linux, intentará dar un pantallazo general del sistema de bloques  y superbloques para que entiendas un poco mejor como funciona y como reaccionar en caso de que algo falle.

Bloques usan  todos los sistemas de archivos de todos los sistemas operativos, es una forma de homogeneizar una unidad básica de información. Hoy vamos a tratar a los de Linux –obviamente-, siempre a bajo nivel.

TUX en Buenos Aires

(Tux en Buenos Aires: Imagen de Juan Manuel Caicedo Carvajal)

Los bloques en los sistemas de archivos de Linux:

Cuando se formatea una partición (El contenedor, las patas de la estantería, que definen en última instancia cual es el tamaño máximo de estantes que podremos usar) entre otras cosas se especifica el tamaño máximo de cada unidad de información que a su vez define el tamaño mínimo de información que se puede leer o escribir por cada operación. Es como tomar una hoja en blanco y cuadricularla, en cada bloque de 1×1 solo se puede escribir una letra por vez, en cada bloque de 4×4 se pueden leer o escribir de a 4 letras sin levantar la vista o el puño y así sucesivamente hasta llegar a donde quería: Cuadraditos de 4096 bytes.

4096 Bytes (4Kb) es el tamaño de bloque por defecto de la gran mayoría de los sistemas de archivos en Linux, lo cual en muchos casos es totalmente inconveniente. ¿Querés verificarlo? Como root en una consola tipeá (o copiá y pegá):

# tune2fs -l /dev/sda3 | grep -i "Block size"
Block size:               4096

(**Donde sda3 es mi partición raíz pero puede que no lo sea en tu caso, /dev/sda3 es donde está alojado el sistema operativo en mi caso. Si no sabés como pasarte a modo root o sobre que partición hacer estas pruebas seguí leyendo, mas abajo te explico mejor y de paso buscaremos tu partición raíz. )

Todo ese chorizo incomprensible es para filtrar la salida del comando tune2fs -l /dev/sda3 y que muestre solo el tamaño de bloque. La salida del comando se pasa por medio de una tubería (un pipe, identificado con el símbolo “ | “ ) a otro comando, en este caso “grep” encargado de filtrar todo lo que no diga “Block size” ignorando mayúsculas y minúsculas gracias al “-i”.

Tener cada unidad mínima de información, cada bloque, de 4Kb de tamaño para Linux, que usa muchísimos archivos pequeñitos de texto es un tremendo desperdicio de espacio, por que no puede haber mas de un único archivo por bloque. Si el archivo es menor que 4Kb, todo lo que sobre del bloque quedará desperdiciado para siempre. Por ejemplo, si meto un archivo que ocupa 1Kb en una partición en donde cada bloque tiene 4Kb, 3Kb tirados a la basura. Lo mismo va para un archivo que ocupe 5Kb, llenará un bloque completo y un pedacito del otro, desperdiciando tres cuartos de este último.

Cualquiera diría que 3Kb no es nada pero multiplicado por cientos de miles, la cosa suma bastante, por ejemplo; Creo un archivo de 1Gb al que llamaré “disco-virtual.bin” para hacer el experimento por medio del comando Disk Dump:

# dd if=/dev/zero of=disco-virtual.bin bs=512 count=2097152
2097152+0 records in
2097152+0 records out
1073741824 bytes (1.1 GB) copied, 73.1275 s, 14.7 MB/s

(**La sintaxis del comando es: Input File=/dev/zero, para que rellene el archivo que creé con ceros, Output File=disco-virtual.bin, que usaremos para hacer la prueba, Block Size=512bits que es el tamaño de cada “sector” virtual que tendrá nuestro disco y que cuente un total de 2097152 de estos sectores de 512bits c/u para llegar a hacer 1 Gigabyte de tamaño)

Formateamos a continuación este archivo en modo ext4, para no perder la costumbre:

# mkfs.ext4 disco-virtual.bin
mke2fs 1.41.12 (17-May-2010)
disco-virtual.bin is not a block special device.
Proceed anyway? (y,n) y

Montamos el archivo en un directorio temporal que creamos a tal efecto:

# mkdir temporal
# mount -o loop disco-virtual.bin temporal

Y ahora si, con un tamaño de bloque de 4Kb que tiene por defecto, procedo a llenarlo de miles de archivos de texto descomprimiendo por ejemplo un archivo ahí dentro:

# tar -jxvf /portage-latest.tar.bz2 -C temporal/

(**Tar es un programa para efectuar lecturas/escrituras y búsquedas secuenciales sobre archivos, como maneja muy bien compresores y descompresores se ha vuelto el estándar a la hora de descomprimir archivos desde la consola. Portage-latest.tar.bz2 es un archivo conteniendo el repositorio de paquetes de mi distribución de Linux: Gentoo)

En total, acabo de meter dentro del disco virtual 161216 archivos:

# ls temporal/portage/ -R | wc -w
161216

(** El comando "ls" que se usa para listar el contenido de un directorio, combinado con el parámetro "-R" lista los directorios recursívamente, con un pipe a el comando "wc" por word count combinado con el parámetro "-w" cuento cuantas palabras distintas hay en la salida de "ls -R", en definitiva, cuento cuantos archivos, directorios y subdirectorios hay)

Todos los archivos, descomprimidos sobre un tamaño de bloque de 4Kb ocupan 653Mb:

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/loop0            768M  653M   64M  92% /home/temporal

(**El comando Disk Free te indica en pantalla cuanto espacio utilizado/libre hay en tus particiones montadas. Usé –h (por human readable, legible para los que no podemos interpretar la matrix a golpe de vista) para que en lugar de mostrarme el tamaño en bloques, me lo muestre en bytes).

Ahora, si en lugar de usar 4Kb formateo el sistema de archivos usando un tamaño de bloque y de inodo de 1024 bytes (es decir 1Kb, cuatro veces menos que antes):

# mkfs.ext4 -i 1024 -b 1024 disco-virtual.bin

Para luego descomprimir dentro exactamente el mismo archivo, donde antes usaba 653Mb de espacio ahora necesité:

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/loop0            768M  301M  417M  42% /home/temporal

301Mb, menos del 50% del espacio que ocupé antes y tengo almacenada exactamente la misma cantidad de información.

También se puede hacer un poquito mas de espacio reduciendo a 0% el espacio que la partición tiene asignado para root (Por defecto un 5% del tamaño total de la partición):

# tune2fs -m 0 disco-virtual.bin
tune2fs 1.41.12 (17-May-2010)
Setting reserved blocks percentage to 0% (0 blocks)

Verificando la diferencia:

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/loop0            768M  301M  468M  40% /home/temporal

Aplicá este método último sobre tus particiones reales y después me contás. 5% de un disco de 500Gb son 25Gb que estás desocupando, ¡Eso es muchísimo!.

Volviendo a los bloques: Podríamos separar los bloques del sistema de archivos en dos tipos: Los que contienen información del usuario y los superbloques, que contienen los metadatos que hacen al funcionamiento del sistema de archivos en sí.

El superbloque principal y las copias de respaldo que siempre se hacen automáticamente del mismo contienen la información que describe a tu sistema de archivos. Se puede leer y escribir el contenido de los superbloques en tiempo real alterando de inmediato el comportamiento del sistema de archivos.

Haciendo uso de las utilidades tune2fs y dumpe2fs podés alterar la configuración del superbloque principal de tu sistema de archivos en tiempo real y por consiguiente de los de respaldo. Para no seguir mareando con nombres complicados vamos a los bifes con algunos ejemplos así que abrí una consola de nuevo y cambiate a modo superusuario:

$ sudo su -

Verificas si sos root (superusuario/administrador) por que te cambia el color del prompt o por que en lugar de tipear todos los comandos después de un signo $ los tipeás a continuación de un #. También podés preguntarle a Linux: ¿Quien soy? –en inglés– y verificarlo.

# whoami
  root

¿Cual es la partición de tu Linux que te interesa verificar? Si no sabés por donde empezar, busquemos la partición raíz y trabajemos sobre esa:

Primero, ¿Cuantas particiones tiene tu disco? En mi caso:

# fdisk -l

Disk /dev/sda: 10.3 GB, 10262568960 bytes
/dev/sda1     1         5     40131  83  Linux
/dev/sda2     6        71    530145  82  Linux swap / Solaris
/dev/sda3    72      1247   9446220  83  Linux

Estamos buscando la partición raíz, la que contiene a todo el resto. Esta partición siempre es de tipo Linux, identificada como 83 así que en mi caso puede ser sda1 o sda3.

Si aún estuvieras en duda, podés verificar la configuración GRUB, el gestor de arranque:

# grep root /boot/grub/menu.lst
root (hd0,0)
kernel /boot/kernel root=/dev/sda3

(** Estoy usando nuevamente el comando “grep” para filtrar de todo el archivo de configuración de GRUB 0.9 /boot/grub/menu.lst únicamente las líneas que contengan la palabra “root”, de esa forma sé que mi partición raíz en este Linux es /dev/sda3. Se puede dar el caso en que tu partición raíz no esté especificada como “root=/dev/…” si no como “realroot=”/dev/…”)

El famoso “Superbloque”

Habiendo encontrado ya tu partición raíz, podés tener un pantallazo general de la información que contiene el superbloque –únicamente en inglés lamentablemente– ejecutando en una consola:

# tune2fs -l /dev/sda3

Como habrás visto, traducido o deducido de la salida del comando anterior, a grandes rasgos el superbloque contiene:

  • El tipo de sistema de archivos.
  • El Estado general del mismo.
  • El tamaño, geometría y composición.
  • Los metadatos, que hacen a la configuración del funcionamiento.

Es tan importante el superbloque que Linux siempre mantiene copias de respaldo, no solo una si no varias. Estas copias de respaldo te pueden servir para recuperar toda la información de la partición en caso de que se te corrompiera el superbloque principal.

Podés saber en dónde se almacenan las copias de respaldo del superbloque ejecutando:

# dumpe2fs /dev/sda3 | grep Backup

(** Dumpe2fs lista el contenido del superbloque, con un pipe a grep se filtra todo lo que no contenga la palabra “Backup” que es lo que nos interesa. Se puede usar dumpe2fs en modo amigable si le pasás al argumento la opción –h)

De todos los parámetros configurables que el superbloque contiene, puede interesarte modificar algunos, por poner algunos de los ejemplos mas útiles:

Configurar la verificación automática del estado del sistema de archivos:

Cada N cantidad de reinicios exitosos sin malos apagados el sistema de archivos es verificado en busca de inconsistencias, –por las dudas, por eso de que mas vale prevenir que curar– lo mismo pasa cada N cantidad de días. Podés cambiar la cantidad de montajes (reinicios) después de los cuales se hará la verificación preventiva usando:

# tune2fs -c 10 /dev/sda3

tune2fs 1.41.12 (17-May-2010)
Setting maximal mount count to 10

(** De esa forma, cada diez reinicios se revisará el sistema de archivos –Usa un cero para deshabilitar la verificación por completo-)

Que hacer en caso de detectarse un error:

# tune2fs –e <comportamiento_deseado> /dev/sda3

Las opciones posibles para el parámetro “–e” son:

  • -e continue : Siga viaje, como si no hubiera pasado nada. Mas adelante se verá que hacemos, este el el comportamiento por defecto a menos que se le especifique otra cosa.
  • -e remount-ro : Desmóntese el sistema de archivos y móntese inmediatamente en modo solo lectura. Para casos en donde las papas queman, por que la partición almacena información realmente importante. De de esta forma se previene pérdida de datos. (Microsoft, superá eso).
  • -e panic : ¡Uia! !Falló el sistema de archivos! Kernel, dejá de hacer lo que sea que estabas haciendo por importante que hubiera sido y reiniciá la PC de inmediato.

En cualquiera de los tres casos, al próximo reinicio se verificará la consistencia del sistema de archivos.

Etiquetá tus particiones:

# tune2fs –L partición-raiz /dev/sda3

De ahora en mas, podés llamar a tu partición raíz por la etiqueta que le hubieras puesto usando “LABEL=partición-raiz” en lugar de andar escribiendo /dev/sda3 desde varios de los comandos acceden al disco, también podés usarlo en tu /etc/fstab.

# tune2fs -l LABEL=particion-raiz | grep name
Filesystem volume name:   particion-raiz

Acelerá la búsqueda en directorios que contienen mucha información:

tune2fs –O dir_index LABEL=partición-raiz

(** Si tenés un directorio realmente grande, lleno de archivos (útil en tu partición raíz por ejemplo), habilitar esta opción vuelve mucho mas rápido el encontrar un archivo puntual en medio de toda la maraña. Por contrapartida, vuelve mas lento el acceso al disco en general. Yo prefiero tener la opción desactivada y mantener en su lugar slocate actualizado)

Además de todas las anteriores que son las de uso mas frecuente hay unas cuantas opciones mas que pueden resultarte de utilidad, como activar o desactivar el sistema de journalling, mover el journal a otro disco rígido,  definir quienes además de root pueden usar ese 5% reservado por defecto al administrador, etc, etc, y un larguísimo etc.

Pueden averigüar mas leyendo el manual:

# man tune2fs

El próximo artículo (en redacción todavía) voy por los inodos, enlaces simbólicos, directorios y permisos.

9 Comentarios

  1. Pues que te puedo decir, muchas gracias por tu dedicación y escribir este post..

    saludos y sigue así

  2. Outch!!

    No tenía idea de que por defecto se dejaba un tamaño de bloque tan grande en linux.

    Cuando llegue mi nuevo disco lo formatearé como se debe. Gracias.

  3. genial, me viene como anillo al dedo, ahora que estoy viendo sistemas de archivos en la facu… =P

  4. Que tal, yo vengo con una duda.

    Aparte del ahorro en espacio al cambiar el tamaño de los bloques en el DD de 4KB a 1KB, ¿Qué otras ventajas o desventajas se producen por ello?

    Es decir, quizá se dejan de 4KB para que el DD no se vuelva loco teniendo que buscar tantos bloques como pasaría si fuesen de 1KB (En resumen: El número de bloques a consultar es menor, por ende, mayor velocidad)… Etc.

    O eso se me ocurre, ¿Qué opinas tu?

  5. Es cierto Jonateo, puede disminuir el rendimiento, por eso es que hay que encontrar un equilibrio. Como dijo el amigo en el articulo los archivos con que funciona el sistema son muy pequeños por lo cual es más óptimo tener un tamaño de bloque pequeño en la partición que se use como raíz del sistema, por otro lado para la partición que dediquemos a /home puede que sea mejor dejar el bloque de 4k ya que ahí solemos guardar archivos grandes como Mp3, videos, imágenes ISO, etc.
    Es importante dejar bien particionado el disco para distribuir los distintos tipos de archivos en la partición más indicada y así tener una buena relación espacio/rendimiento.

  6. Muy Bien explicado todo, buenos Ejemplos una observacion en el párrafo:

    # dumpe2fs /dev/sda3 | grep Backup

    (** Dumpe2fs lista el contenido del superbloque, con un pipe a grep se filtra todo lo que no contenga la palabra “Backup” que es lo que nos interesa.

    el grep debe tener -v para filtrar lo que no contenga Backup
    la instrucción debería ser

    # dumpe2fs /dev/sda3 | grep -v Backup

    Se que hay principiantes que siguen las cosas al pie y se pueden confundir.

    Un saludo desde Panamá.

Dejar respuesta

Please enter your comment!
Please enter your name here