Almacenamiento

Vamos a hablar sobre Ext3, Ext4 y XFS (sistema de archivos por defecto en CentOS/RHEL 7

EXT3

EXT3 es una versión mejorada de EXT2. Las mejoras son las siguientes:

Disponibilidad

Tras un apagado abrupto o una caida del sistema los sistemas EXT2 deben ser chequeados para garantizar la consistencia mediante el programa e2fsck. Est proceso es lento, especialmente en unidades grandes, además de que parte de los datos pueden haberse perdido.

EXT3 proporciona journaling, de modo que ya no es necesario hacer este tipo de chequeos.

Integridad

El journaling previene la pérdida de datos, salvo en caso de fallo de disco.

Velocidad

EXT3 optimiza los desplazamientos de los cabezales de disco, lo que mejora la velocidad de lectura/escritura.

Crear un sistema de archivos EXT3

mkfs -t ext3 /dev/sda8

El sistema de archivos EXT4

EXT4 es una extensión de EXT4:

  • Soporta archivos de 16 terabytes (en EXT3 es de 2 terabytes)
  • Soporta sistemas de archivos de 50 terabytes (en EXT3 es de 16 terabytes)
  • 64000 subdirectorios (en EXT3 pueden haber hasta 32000)

Además tiene algunas optimizaciones de rendimiento que cambian la estrategia de escritura. Por ejemplo, Ext4 utiliza retardo de escritura, lo que significa que cuando un programa escribe al sistema de archivos, no está garantizado que se escriba salvo que el programa ejecute fsync(). En Ext3 la escritura a disco es inmediata, lo que evita problemas con las aplicaciones que no ejecutan fsync(). Si la aplicación no fuerza la escritura inmediata, el retardo en la escritura permite que EXT4 reordene las operaciones de escritura para maximizar el rendimiento. Algunas características importantes de Ext4, además de las mencionadas, son:

  • Soporte de extents, que simplifica la gestión de bloques (no necesita mapear la ubicación de cada bloque, sino que mapea grupos contiguos de ellos).
  • Reserva de multibloques, que permite reservar de una vez varios bloques de una vez, en lugar de reservar múltiples veces un bloque.
  • Mayor eficiencia de fsck
  • Defragmentación en caliente. Las características de Ext4 reduce la fragmentación, pero aun así, el uso produce fragmentación. Ext4 permite defragmentar con la unidad montada.
  • Prereserva persistente, que permite a las aplicaciones reservar espacio en disco para posterior uso, y evitar que a mitad de una operación la aplicación se quede sin espacio.
  • Barreras activadas por defecto, que provoca que cualquier operación se escriba primero al registro de journaling, y después se lleve a cabo.

Para conocer más características de EXT4, consultar en ext4.wiki.kernel.org/index.php/Ext4_Howto

Formatear una partición como EXT4

# mkfs.ext4 /dev/sdb1

En http://rm-rf.es/crear-y-eliminar-particiones-con-fdisk-en-linux/ se puede ver cómo crear o eliminar una partición usando fsidk

Actividad 1. Añade a tu máquina virtual un nuevo disco de 1GB. Después crea en dicho disco una nueva partición de 250MB, y dale formato ext4. Finalmente móntala en la carpeta /mnt/sdb1.

Ejecuta el comando lsblk y toma una captura. Guárdala con el nombre Act1-almacenamientolinux.png

Redimensionar una partición EXT4

Antes de redimesionar una partición EXT4, es preciso asegurarse de que el dispositivo subyacente tiene un tamaño adecuado para almacenar el sistema de archivos redimensionado. Para incrementar el tamaño del sistema de archivos:

# resize2fs /punto/montaje tamaño

El tamaño es especificado en bloques, salvo que se especifique un sufijo de tamaño:

  • s - sectores de 512 bytes
  • K - kilobytes
  • M - megabytes
  • G - gigabytes

En caso de que no se especifique tamaño, se emplea todo el tamaño disponible en la partición.

El comando resize2fs no redimensiona la partición, sino el sistema de archivos. Si queremos que la partición cambie de tamaño, debemos usar fdisk para eliminar y recrear de nuevo la partición. Es importante que al recrear la partición, ésta comience en el mismo cilindro, o se podrían perder todos los datos.

El proceso para agrandar la partición /dev/sdb1 es el siguiente:

  1. Desmontar la partición: umount /punto/de/montaje/
  2. Eliminar la partición: fdisk /dev/sdb1 -> [opción d] -> [opción w]
  3. Crear de nuevo la partición con el nuevo tamaño: fdisk /dev/sdb1 -> [opción n] -> [opción p] -> [opción 1] -> [Elegir el nuevo tamaño] -> [opción w]
  4. Chequear el sistema de archivos contenido en la partición: e2fsck /dev/sdb1
  5. Redimensionar el sistema de archivos para que ocupe el nuevo tamaño de la partición: resize2fs /dev/sdb1
  6. Montar de nuevo la partición: mount /dev/sdb1 /punto/de/montaje

El proceso para reducir la partición /dev/sdb1 es el siguiente:

  1. Desmontar la partición: umount /punto/de/montaje/
  2. Chequear el sistema de archivos contenido en la partición: e2fsck /dev/sdb1
  3. Redimensionar el sistema de archivos al tamaño de la partición: resize2fs /dev/sdb1 xxxM
  4. Eliminar la partición:fdisk /dev/sdb1 -> [opción d] -> [opción w]
  5. Recrear la partición con el nuevo tamaño:fdisk /dev/sdb1 -> [opción n] -> [opción p] -> [opción 1] -> [Elegir el nuevo tamaño] -> [opción w]
  6. Montar de nuevo la partición: mount /dev/sdb1 /punto/de/montaje

Actividad 2. Llena la partición /dev/sdb1 con 70 archivos de 1 MB. Para hacer esto, utiliza el siguiente comando:

for ((i=0;i<71;i++)); do dd if=/dev/zero of=/mnt/sdb1/arch$i bs=1k count=1000; done

Comprueba que el sistema de archivos contiene los 70 archivos creados. A continuación, reduce el tamaño de la partición a 100MB. Finalmente monta de nuevo la partición reducida y comprueba que los archivos siguen estando.

Ejecuta el comando df -h y toma una captura. Guárdala con el nombre Act2-almacenamientolinux.png

XFS

XFS es el sistema de archivos por defecto en CentOS/RHEL 7. Fue creado por Silicon Graphics. XFS puede ser defragmentado y redimensionado en caliente. Extiende el tamaño máximo de partición a 500TB (mientras que Ext4 se queda en 50TB).

Sus características más destacables son:

  • Soporta journaling
  • Soporte nativo para backup
  • Soporte de extents (al igual que Ext4)
  • Escritura demorada
  • Prereserva de espacio en disco

Red Hat, y por lo tanto CentOS, se ha decantado por XFS como sistema de archivos empresarial, ya que está diseñado para soportar cargas de trabajo muy superiores a Ext4, más adecuado para escritorio. Se puede conocer más detalles al respecto en www.muylinux.com/2015/01/23/sistema-de-archivos-linux-ext4-btrfs-xfs.

Crear un sistema de archivos XFS

mkfs.xfs /dev/device

Si es está utilizando mkfs.xfs sobre un dispositivos que contiene un sistema de archivos, se usa -f para forzar la sobreescritura en dicho sistema de arhivos.

Cuando se crea un sistema de archivos XFS, no se puede reducir de tamaño. Sin embargo, puede ser extendido utilizando el comando xfs_growfs

Montaje de un sistema de archivos XFS

mount /dev/device /mount/point

Actividad 3. Crea la nueva partición /dev/sdb2, que tenga un tamaño de 100MB. Después, monta la partición en /mnt/sdb2. Para terminar, ejecuta el siguiente comando:

for ((i=0;i<71;i++)); do dd if=/dev/zero of=/mnt/sdb2/fich$i bs=1k count=1000;done

Ejecuta el comando df -h y toma una captura con el nombre Act3-almacenamientolinux.png

Incrementar el tamaño de un sistema de archivos XFS

xfs_growfs /mount/point -D size

La opción -D permite especificar un tamaño en bloques. Por ello es importante elegir un tamaño de bloque adecuado desde un principio.

Elegir el tamaño de bloque óptimo:

  • El tamaño mínimo es de 512 bytes. Bloques de pequeño tamaño disminuye el rendimiento, pero es recomendable cuando se utilizarán gran cantidad de archivos pequeños de unos pocos kilobytes.
  • El tamaño de bloque por defecto es de 4096 bytes (4K), que es el tamaño de bloque recomentado.
  • Se puede usar un tamaño de bloque de hasta 65536 bytes (64K), que solo es recomendable cuando se utilicen pocos archivos de gran tamaño.

Para crear un sistema de archivos XFS con un tamaño de bloque de 2048 bytes, podemos usar el siguiente comando:

mkfs.xfs -b size=2048 /dev/device

Para conocer el tamaño de bloque de una partición, usamos el comando siguiente:

blockdev --getbsz /dev/device

Actividad 4. El proceso para redimensionar una partición XFS es similar al que seguimos para redimensionar Ext4:

  1. Desmontar la unidad
  2. Eliminar la partición mediante fdisk y guardar
  3. Volver a crearla con el tamaño deseado mediante fdisk y guardar
  4. Volver a montar la unidad en su punto de montaje
  5. Ejecutar el comando xfs_growfs

Redimensiona la partición XFS creada anteriormente para que pase acupar 250MB.

Ejecuta el comando df -h y toma una captura llamada Act4-almacenamientolinux.png

Reparación de XFS

Si el sistema de archivos se ha corrompido, es posible repararlo mediante la herramienta xfs_repair /dev/device.

Actividad 5. Corrompe la unidad /dev/sdb2 empleando el siguiente comando:

dd if=/dev/zero of=/dev/sdb2 bs=1k count=10

Si intentas montar la unidad, obtendrás un error. En este punto, toma una captura llamada Act5-almacenamientolinux.png.

Después, repara la unidad, y vuelve a montarla.

Toma una captura tras ejecutar el comando mount y guárdala con el nombra Act5.2-almacenamientolinux.png.

Suspensión de un sistema de archivos

Hacer una copia de seguridad de un servidor puede ser un problema si queremos que dicha copia se haga en un instante concreto, ya que mientras se hace una copia, parte de los archivos pueden ir cambiando. En estos casos, lo que se recomienda es, o bien tener la partición desmontada (en cuyo caso los archivos no cambian), o bien "congelada" para que no se produzcan cambios durante la copia, y que de este modo la copia sea consistente. La primera opción no siempre es posible, pero XFS permite la suspensión del sistema de archivos (congelarlo) mediante el comando xfs_freeze:

Para congelar:

xfs_freeze -f /mount/point

Para descongelar:

xfs_freeze -u /mount/point

Podemos encontrar una referencia a este concepto en la documentación técnica de MySQL sobre EC2 con EBS.

Copia de seguridad de XFS

Se pueden hacer copias de seguridad incrementales con xfsdump:

xfsdump -l 0 -f /dev/device /path/to/filesystem

donde -f indica el dispositivo destino de la copia (como una cinta, /dev/st0, por ejemplo), y -l el nivel de copia y /patch/to/filesystem es el punto de montaje del sistema de archivos a copiar. Así, el comando anterior sería una copia completa. Para hacer una copia incremental (solo los archivos que han cambiado desde la copia total), utilizaríamos el siguiente comando:

xfsdump -l 1 -f /dev/device /path/to/filesystem

Y así sucesivamente con los parámetros -l 2, -l 3 y -l 4. El máximo valor para el nivel de copia es 9.

Restauración de una copia XFS

xfsrestore restaura la copia hecha con xfsdump. Para conocer las copias disponibles, usamos el siguiente comando:

xfsrestore -I

Este comando proporciona una salida con información de las copias realizas como la siguiente:

file system 0: fs id: 45e9af35-efd2-4244-87bc-4762e476cbab session 0: mount point: bear-05:/mnt/test device: bear-05:/dev/sdb2 time: Fri Feb 26 16:55:21 2010 session label: "my_dump_session_label" session id: b74a3586-e52e-4a4a-8775-c3334fa8ea2c level: 0 resumed: NO subtree: NO streams: 1 stream 0: pathname: /mnt/test2/backup start: ino 0 offset 0 end: ino 1 offset 0 interrupted: NO media files: 1 media file 0: mfile index: 0 mfile type: data mfile size: 21016 mfile start: ino 0 offset 0 mfile end: ino 1 offset 0 media label: "my_dump_media_label" media id: 4a518062-2a8f-4f17-81fd-bb1eb2e3cb4f xfsrestore: Restore Status: SUCCESS

De este modo, podemos realizar una restauración eligiendo el session-id a restaurar, con el siguiente comando:

xfsrestore -f /dev/st0 -S session-ID /path/to/destination

También es posible restaurar desde un backup incremental (con nivel 1 a 9) simplemente añadiendo la opción -r:

xfsrestore -f /dev/st0 -S session-ID -r /path/to/destination

Por último, XFS permite la restauración de archivos concretos mediante un diálogo interactivo:

xfsrestore -f /dev/st0 -i /destination/directory

Actividad 6. Prepara dos particiones XFS de 250MB de tamaño, por ejemplo /dev/sdb1 y /dev/sdb2. Después, escribe en /dev/sdb1 80MB de datos empleando el comando siguiente:

for ((i=0;i<80;i++)); do dd if=/dev/zero of=/mnt/sdb1 bs=1k count=1024; done

A continuación, congela el sistema de archivos de /dev/sdb1, y realiza una copia de seguridad empleando el backup nativo de XFS. Finalmente descongela el sistema de archivos.

Toma una captura al congelar el sistema de archivos y guárdala con el nombre Act6-xfs.png y otra al hacer la copia, con el nombre Act6.1-almacenamientolinux.png.

Actividad 7. Restaura la copia realizada en el ejercicio anterior en una partición diferente y comprueba que están todos los archivos que se copiaron.

Toma una captura con el nombre Act7-almacenamientolinux.png al restaurar la copia.

LVM

LVM es una implementación de un administrador de volúmenes lógicos para el kernel Linux. Se escribió originalmente en 1998, que se basó en el administrador de volúmenes de Veritas usado en sistemas HP-UX. Los bloques básicos que construyen LVM son:

  • Physical volume/Volúmenes físicos (PV): Particiones en el disco duro.
  • Volume group/Grupo de volúmenes (VG): Son grupos de volúmenes físicos que son usados como volúmenes de almacenamiento (como si fueran un solo disco). Sirven de soporte para que crear los volúmenes lógicos.
  • Logical volume/Volúmenes lógicos (LV): Una "partición virtual" que reside en un grupo de volúmenes. Son las particiones que finalmente el usuario utilizará.

Para dar más detalles, LVM es un administrador de volúmenes. Permite concatenar varios discos físicos en forma de Grupo de volúmenes, formando un Pool de almacenamiento, como si fuese un disco virtual. El espacio provisto en un pool, puede ser dividido en Volúmenes lógicos, que son usadas como particiones.

En CentOS/RHEL 7 tenemos ssm (Simple Storage Manager), que proporciona una interfaz de texto para administrar varias tecnologías como LVM, BTRFS y volúmenes cifrados.

Preparación de SSM

Instalación de ssm:

# yum install system-storage-manager

Para comprobar las unidades LVM disponibles usamos el comando ssm list:

En este ejemplo hay dos dispositivos físicos, /dev/sda y /dev/sdb, un pool llamado centos y dos volúmenes lógicos, /dev/centos/root y /dev/centos/swap.

Añadir un volumen físico al pool

Utilizamos el comando ssm add -p nombre_pool /dev/sdx. Si el pool no existe, se creará, de forma que si lo ejecutamos por primera vez, creamos un nuevo pool llamado nombre_pool que incluye un volumen físico. Por ejemplo:

Después de añadir una nueva partición física al pool, el tamaño de éste se incrementa en el tamaño de la partición. Para comprobar el nuevo tamaño del pool, volvemos a ejecutar ssm list. Al ejecutar este comando podremos comprobar que la unidad ha sido expandida en tamaño, si lo comprobamos en el apartado pool.

Una vez creado el pool, podemos añadir tantos volúmenes físicos como queramos.

Añadir un volumen lógico al pool

Para añadir un volumen LVM, es preciso que ya esté creado el pool (lo que podemos comprobar mediante ssm list). Para crear un volumen LVM de 500MB llamado "nombre-lvm" en el pool "nombre_pool", usamos el siguiente comando:

ssm create -s 500M -n nombre-lvm --fstype xfs -p nombre-pool

Expandir un volumen LMV

Si contamos con un tamaño extra en el pool (tras haber añadido una partición física al mismo (o bien había un espacio sin utilizar), podemos incrementar el tamaño de una unidad lmv que pertenezca al pool, usando el comando ssm resize -s+xxxM /dev/nombre_pool/nombre_lvm. Por ejemplo:

Podemos comprobar el nuevo tamaño del volumen lvm mediante ssm list

Para que el sistema de archivos ocupe todo el nuevo tamaño disponible en el volumen lvm, mediante el comando que emplee el sistema de archivos (resize2fs para EXT2/EXT3/EXT4, xfs_growfs para XFS, etc.).

En el caso de que estemos usando xfs, debemos comprobar en primer lugar el tamaño del volumen lvm, con el comando xfs_growfs:

En el ejemplo anterior, el tamaño máximo del volumen es 1886208, especificado en el parámetro blocks. Para expandir la unidad, usaremos el comando xfs_growfs /dev/centos/root -D 1886208

Después de expandir el tamaño de la unidad lvm, podemos comprobar de nuevo el tamaño, bien usando ssm list volumes o bien usando df -h /punto/de/montaje

Reducir de tamaño un volumen LVM

Es importante recordar que XFS no soporta la reducción de tamaño. Si contamos un tipo de partición que sí lo soporte, como Ext4, la operación es similar a la anterior, aunque añadimos el símbolo "-" delante de tamaño, en lugar de "+".

Crear un nuevo pool, y añadir volumen lvm en un solo comando

Con ssm podemos crear un pool, agregar volúmenes físicos al mismo y crear una unidad lvm sobre el pool, y montarla en un punto de montaje en un solo paso:

ssm create -s 500M -n disk0 --fstype xfs -p mypool /dev/sdc /mnt/test

En el comando anterior, tenemos lo siguiente:

  • -s 500M -> tamaño de la unidad lvm
  • -n disk0 -> nombre de la unidad lvm
  • -p mypool -> nombre del pool
  • /dev/sdc -> partición física que se añade al pool
  • /mnt/test -> punto de montaje para la unidad lvm

Después de esto, podemos volver a ejecutar ssm list:

Ahora deberíamos tener acceso a dicho punto de montaje.

Snapshots

Podemos tomar una instantánea de un volumen lvm en caliente. Para tomar una instantánea:

# ssm snapshot /dev/mypool/disk0

Una vez que el snapshot (instantánea) ha sido tomada, se almacena como un volumen especial de tipo snapshot, que almacena los datos en el volumen que se capturó en el momento de la copia. Una vez que el snapshot ha sido almacenado, es posible desmontar el volumen original y montar el volumen snapshot para acceder a los datos del snapshot.

NOTA: si intentamos montar la unidad snapshot mientras la unidad original está aun montada, obtendremos un mensaje de error:

kernel: XFS (dm-3): Filesystem has duplicate UUID 27564026-faf7-46b2-9c2c-0eee80045b5b - can't mount

Eliminar una unidad lvm

Eliminar una unidad lvm, o un pool, es cuestión de un comando: ssm remove /dev/pool/nombre_lvm para eliminar una unidad lvm, y ssm remove nombre-pool:

Actividad 8. Añade a tu máquina virtual dos discos de 1GB cada uno. A continuación crea en cada disco cuatro particiones de 250MB. Si los discos son /dev/sdb y /dev/sdc entonces tendrás las particiones /dev/sdb1, /dev/sdb2, /dev/sdb3, /dev/sdb4, /dev/sdc1, /dev/sdc2, /dev/sdc3 y /dev/sdc4.

Después, crea un pool llamado "pool1" que utilice las particiones físicas /dev/sdb1, /dev/sdb2 y /dev/sdc1, y un segundo pool llamado "pool2" que utilice las particiones /dev/sdb3, /dev/sdb4 y /dev/sdc2.

Crea en el pool1 un volumen LVM llamado lvm1 de tamaño 200MB y otro llamado lvm2 de tamaño 100MB.

Crea en el pool2 un volumen LVM llamado lvm1 de tamaño 300MB.

Finalmente, formatea los volúmenes LVM y móntalos en los puntos de montaje siguientes:

  • /mnt/pool1_lvm1 para /dev/pool1/lvm1
  • /mnt/pool1_lvm2 para /dev/pool1/lvm2
  • /mnt/pool2_lvm1 para /dev/pool2/lvm1

Una vez que termines ejecuta el comando ssm list y toma una captura con el nombra Act8-almacenamientolinux.png.

Actividad 9. Expande el volumen pool1-lvm2 para que ocupe 100MB más. Asegúrate de expandir también el sistema de archivos.

Una vez que termines ejecuta el comando ssm list y toma una captura con el nombra Act9-almacenamientolinux.png.

Actividad 10. Añade al pool "pool2" las particiones físicas /dev/sdc3 y /dev/sdc4.

Comprueba que "pool2" tiene un nuevo tamaño, mediante el comando ssm list y toma una captura con el nombre Act10-almacenamientolinux.png.

Actividad 11. Añade al volumen pool1-lvm1 10 archivos de 1 MB cada uno del siguiente modo:

for ((i=0;i<11;i++)); do dd if=/dev/zero of=/mnt/pool1_lvm1/arch$i bs=1k count=1024; done

Después crea un snapshot de dicho volumen.

Para comprobar que se ha creado correctamente el snapshot, monta la unidad de snapshot en el punto de montaje /mnt/pool1_snplvm1 y comprueba que los archivos siguen estando.

Ejecuta el comando ssm list y toma una captura con el nombre Act11-almacenamientolinux.png.

Averigua de qué modo puedes añadir una partición LVM a fstab para que se monte automáticamente durante el arranque.

Algunas anotaciones finales

ssm permite manejar de manera cómoda los volúmenes lvm. Sin embargo un conjunto de herramientas anterior, que también permite administrar lmv. Este conjunto de herramientas se llama lvm2. Una vez que se instala, se dispone una serie de herramientas separadas que permiten hacer lo mismo que ssm, pero empleando diferentes comandos.

Una de las cosas que ssm no permite, es la restauración de un volumen a un estado anterior, representado por un snapshot. Supongamos que contamos con un volumen lvm, llamado /dev/mipool/vol_datos y un snapshot de ese volumen, llamado /dev/mipool/vol_datos-07042015. Si queremos restaurar restaurar el volumen /dev/mipool/vol_datos, el comando necesario es:

lvconvert --merge /dev/mipool/vol_datos-07042015

Este comando restaurará el volumen original (en este caso /dev/mipool/vol_datos) al estado capturado en el snapshot.