203.3 - Opciones de sistemas de archivos

Introduccion

Los sistemas de archivos modernos de Linux ofrecen funcionalidades avanzadas que van mucho mas alla del simple almacenamiento de archivos. Este subtema cubre las caracteristicas avanzadas de Btrfs y ZFS, el uso de tmpfs para almacenamiento en memoria, la comparativa entre ext4 y XFS, y los mecanismos de cifrado de sistemas de archivos con LUKS/dm-crypt y alternativas.

Peso del subtema: 2

Btrfs - B-tree File System

Introduccion a Btrfs

Btrfs es un sistema de archivos moderno de tipo copy-on-write (CoW) diseñado para Linux. Ofrece funcionalidades avanzadas que tradicionalmente requerian herramientas externas o gestores de volumenes.

Caracteristicas principales:

  • Copy-on-write (CoW) para datos y metadatos
  • Subvolumenes
  • Instantaneas (snapshots) eficientes
  • Compresion transparente
  • RAID integrado (0, 1, 10, 5, 6)
  • Checksums para datos y metadatos
  • Deduplicacion
  • Redimensionamiento en linea (expandir y reducir)
  • Envio/recepcion de instantaneas (send/receive)

Subvolumenes

Los subvolumenes son divisiones logicas dentro de un sistema de archivos Btrfs. Cada subvolumen puede montarse independientemente y tener sus propias instantaneas.

# Crear un subvolumen
btrfs subvolume create /mnt/btrfs/datos
btrfs subvolume create /mnt/btrfs/home
btrfs subvolume create /mnt/btrfs/var
 
# Listar subvolumenes
btrfs subvolume list /mnt/btrfs
 
# Mostrar informacion de un subvolumen
btrfs subvolume show /mnt/btrfs/datos
 
# Eliminar un subvolumen
btrfs subvolume delete /mnt/btrfs/datos
 
# Montar un subvolumen especifico
mount -o subvol=datos /dev/sdb1 /mnt/datos
mount -o subvolid=257 /dev/sdb1 /mnt/datos
 
# En /etc/fstab
UUID=xxxx  /datos  btrfs  defaults,subvol=datos  0  0
UUID=xxxx  /home   btrfs  defaults,subvol=home   0  0

Para el examen: Los subvolumenes de Btrfs son similares a particiones logicas pero mas flexibles. No tienen un tamano fijo y comparten el espacio del sistema de archivos. Se pueden montar de forma independiente usando subvol= o subvolid=.

Instantaneas (Snapshots)

Las instantaneas son copias punto-en-tiempo de un subvolumen. Gracias al mecanismo CoW, son casi instantaneas y no consumen espacio adicional hasta que los datos divergen.

# Crear una instantanea de solo lectura
btrfs subvolume snapshot -r /mnt/btrfs/datos /mnt/btrfs/snapshots/datos-20240115
 
# Crear una instantanea de lectura/escritura
btrfs subvolume snapshot /mnt/btrfs/datos /mnt/btrfs/snapshots/datos-writable
 
# Listar instantaneas (son subvolumenes)
btrfs subvolume list -s /mnt/btrfs
 
# Eliminar una instantanea
btrfs subvolume delete /mnt/btrfs/snapshots/datos-20240115
 
# Enviar/recibir instantaneas (backup incremental)
btrfs send /mnt/btrfs/snapshots/datos-20240115 | btrfs receive /mnt/backup/
 
# Envio incremental (solo diferencias desde la instantanea anterior)
btrfs send -p /mnt/btrfs/snapshots/datos-20240114 \
    /mnt/btrfs/snapshots/datos-20240115 | btrfs receive /mnt/backup/

Compresion transparente

Btrfs soporta compresion transparente de datos con varios algoritmos:

# Montar con compresion zlib (mejor ratio)
mount -o compress=zlib /dev/sdb1 /mnt/btrfs
 
# Montar con compresion lzo (mas rapido)
mount -o compress=lzo /dev/sdb1 /mnt/btrfs
 
# Montar con compresion zstd (equilibrio velocidad/ratio)
mount -o compress=zstd /dev/sdb1 /mnt/btrfs
 
# Especificar nivel de compresion zstd
mount -o compress=zstd:3 /dev/sdb1 /mnt/btrfs
 
# Forzar compresion (incluso para archivos ya comprimidos)
mount -o compress-force=zstd /dev/sdb1 /mnt/btrfs
 
# En /etc/fstab
UUID=xxxx  /datos  btrfs  defaults,compress=zstd  0  0
 
# Comprimir archivos existentes
btrfs filesystem defragment -r -czstd /mnt/btrfs/
AlgoritmoVelocidadRatio compresionUso recomendado
lzoMuy rapidaBajoUso general, SSD
zlibLentaAltoArchivos, poco acceso
zstdRapidaAltoRecomendado por defecto

RAID integrado en Btrfs

# Crear Btrfs con RAID1 (espejo) para datos y metadatos
mkfs.btrfs -d raid1 -m raid1 /dev/sdb1 /dev/sdc1
 
# Crear con RAID0 para datos, RAID1 para metadatos
mkfs.btrfs -d raid0 -m raid1 /dev/sdb1 /dev/sdc1
 
# Agregar un dispositivo a un Btrfs existente
btrfs device add /dev/sdd1 /mnt/btrfs
 
# Eliminar un dispositivo
btrfs device remove /dev/sdc1 /mnt/btrfs
 
# Convertir perfil de datos a RAID1
btrfs balance start -dconvert=raid1 /mnt/btrfs
 
# Ver uso del sistema de archivos
btrfs filesystem usage /mnt/btrfs
btrfs filesystem df /mnt/btrfs
btrfs device stats /mnt/btrfs

Gestion general de Btrfs

# Informacion del sistema de archivos
btrfs filesystem show
btrfs filesystem show /mnt/btrfs
 
# Uso del espacio
btrfs filesystem df /mnt/btrfs
btrfs filesystem usage /mnt/btrfs
 
# Redimensionar
btrfs filesystem resize +10G /mnt/btrfs    # Expandir 10GB
btrfs filesystem resize -5G /mnt/btrfs     # Reducir 5GB
btrfs filesystem resize max /mnt/btrfs     # Expandir al maximo
 
# Verificar integridad
btrfs scrub start /mnt/btrfs
btrfs scrub status /mnt/btrfs
 
# Balance (reorganizar datos entre dispositivos)
btrfs balance start /mnt/btrfs
btrfs balance status /mnt/btrfs

ZFS - Zettabyte File System

Introduccion a ZFS

ZFS es un sistema de archivos y gestor de volumenes combinado, originalmente desarrollado por Sun Microsystems para Solaris. En Linux se usa a traves del proyecto OpenZFS. Debido a incompatibilidades de licencia (CDDL vs GPL), ZFS no esta integrado directamente en el kernel de Linux.

Caracteristicas principales:

  • Pools de almacenamiento (zpools)
  • Datasets (equivalentes a subvolumenes)
  • Instantaneas y clones
  • Compresion y deduplicacion
  • RAID-Z (niveles 1, 2, 3)
  • Checksums en todos los datos
  • Reparacion automatica de datos corruptos
  • Copy-on-write
  • Sin limite practico de tamano

zpools - Pools de almacenamiento

# Crear un pool simple
zpool create mipiscina /dev/sdb
 
# Crear un pool con espejo (mirror/RAID1)
zpool create mipiscina mirror /dev/sdb /dev/sdc
 
# Crear un pool con RAID-Z1 (equivalente a RAID5)
zpool create mipiscina raidz /dev/sdb /dev/sdc /dev/sdd
 
# Crear un pool con RAID-Z2 (equivalente a RAID6)
zpool create mipiscina raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde
 
# Ver estado del pool
zpool status
zpool status mipiscina
 
# Ver estadisticas de uso
zpool list
 
# Agregar un dispositivo al pool
zpool add mipiscina /dev/sde
 
# Exportar un pool (para mover a otro sistema)
zpool export mipiscina
 
# Importar un pool
zpool import mipiscina
 
# Destruir un pool
zpool destroy mipiscina
 
# Verificar integridad (scrub)
zpool scrub mipiscina

Datasets

Los datasets de ZFS son similares a los subvolumenes de Btrfs:

# Crear un dataset
zfs create mipiscina/datos
zfs create mipiscina/home
zfs create mipiscina/home/usuario1
 
# Listar datasets
zfs list
 
# Ver propiedades de un dataset
zfs get all mipiscina/datos
 
# Establecer propiedades
zfs set compression=lz4 mipiscina/datos
zfs set quota=50G mipiscina/home/usuario1
zfs set reservation=10G mipiscina/datos
zfs set mountpoint=/datos mipiscina/datos
 
# Eliminar un dataset
zfs destroy mipiscina/datos

Instantaneas y clones en ZFS

# Crear una instantanea
zfs snapshot mipiscina/datos@backup-20240115
 
# Listar instantaneas
zfs list -t snapshot
 
# Restaurar desde una instantanea (rollback)
zfs rollback mipiscina/datos@backup-20240115
 
# Crear un clon (instantanea escribible)
zfs clone mipiscina/datos@backup-20240115 mipiscina/datos-clon
 
# Enviar/recibir (backup)
zfs send mipiscina/datos@snap1 | zfs receive backuppool/datos
 
# Envio incremental
zfs send -i mipiscina/datos@snap1 mipiscina/datos@snap2 | zfs receive backuppool/datos

Para el examen: ZFS combina la gestion de volumenes y el sistema de archivos en una sola capa. Los zpools son los pools de almacenamiento (equivalentes a grupos de volumenes) y los datasets son los sistemas de archivos individuales. Las instantaneas usan la sintaxis dataset@nombre.

tmpfs - Sistema de archivos en memoria

Descripcion

tmpfs es un sistema de archivos que almacena todos los datos en la memoria RAM (y opcionalmente en swap). Los datos se pierden al reiniciar el sistema.

Ventajas:

  • Velocidad extrema (lectura/escritura en RAM)
  • Tamano dinamico (solo usa la memoria necesaria)
  • Ideal para datos temporales

Usos comunes:

  • /tmp - Archivos temporales
  • /run - Datos de tiempo de ejecucion
  • /dev/shm - Memoria compartida POSIX
# Montar tmpfs manualmente
mount -t tmpfs -o size=2G tmpfs /tmp
 
# En /etc/fstab
tmpfs  /tmp      tmpfs  defaults,noatime,size=2G       0  0
tmpfs  /dev/shm  tmpfs  defaults,noexec,nodev,size=4G  0  0
 
# Verificar uso
df -h /tmp
OpcionFuncion
size=2GTamano maximo (puede usar sufijos K, M, G)
nr_inodes=1000000Numero maximo de inodos
mode=1777Permisos del directorio
uid=1000Propietario
gid=1000Grupo propietario

Para el examen: tmpfs no tiene un tamano fijo asignado; crece y se reduce dinamicamente segun el uso. El parametro size= define el tamano maximo, no una asignacion fija de RAM. Por defecto, si no se especifica tamano, usa la mitad de la RAM.

Comparativa ext4 vs XFS

Caracteristicaext4XFS
Tamano maximo FS1 EiB8 EiB
Tamano maximo archivo16 TiB8 EiB
Redimensionar (expandir)Si, en linea y offlineSi, solo en linea
Redimensionar (reducir)Si, solo offlineNo soportado
JournalSiSi
Desfragmentacion en lineaSi (e4defrag)Si (xfs_fsr)
Herramienta reparacione2fsckxfs_repair
Herramienta informaciondumpe2fsxfs_info
Herramienta parametrostune2fsxfs_admin
Bloques reservadosSi (por defecto 5%)No
Rendimiento archivos grandesBuenoExcelente
Rendimiento muchos archivosBuenoBueno
Uso recomendadoGeneral, servidoresArchivos grandes, alto rendimiento
Distribucion por defectoDebian/UbuntuRHEL/CentOS/Fedora

Cifrado de sistemas de archivos

LUKS y dm-crypt

LUKS (Linux Unified Key Setup) es el estandar de cifrado de disco en Linux. Funciona sobre dm-crypt, que es la capa de cifrado del device mapper del kernel.

Arquitectura:

Aplicacion -> Sistema de archivos -> dm-crypt (cifrado) -> Disco fisico

Configuracion de LUKS

# Crear un volumen cifrado LUKS
cryptsetup luksFormat /dev/sdb1
 
# Abrir (desbloquear) el volumen
cryptsetup luksOpen /dev/sdb1 datos_cifrados
# O en sintaxis moderna:
cryptsetup open --type luks /dev/sdb1 datos_cifrados
 
# El dispositivo descifrado aparece en /dev/mapper/datos_cifrados
 
# Crear un sistema de archivos en el volumen descifrado
mkfs.ext4 /dev/mapper/datos_cifrados
 
# Montar
mount /dev/mapper/datos_cifrados /mnt/cifrado
 
# Desmontar y cerrar
umount /mnt/cifrado
cryptsetup luksClose datos_cifrados
# O en sintaxis moderna:
cryptsetup close datos_cifrados

Gestion de claves LUKS

LUKS soporta hasta 8 slots de clave (0-7), permitiendo multiples contraseñas:

# Ver informacion del volumen LUKS
cryptsetup luksDump /dev/sdb1
 
# Agregar una clave adicional
cryptsetup luksAddKey /dev/sdb1
 
# Eliminar una clave
cryptsetup luksRemoveKey /dev/sdb1
 
# Eliminar una clave por slot
cryptsetup luksKillSlot /dev/sdb1 1
 
# Cambiar una clave
cryptsetup luksChangeKey /dev/sdb1

Montaje automatico con /etc/crypttab

# /etc/crypttab
# <nombre>        <dispositivo>                                    <clave>    <opciones>
datos_cifrados     UUID=xxxx-xxxx-xxxx-xxxx                        none       luks
datos_auto         UUID=yyyy-yyyy-yyyy-yyyy                        /etc/keys/keyfile  luks
 
# Luego en /etc/fstab
/dev/mapper/datos_cifrados  /mnt/cifrado  ext4  defaults  0  2

Para el examen: LUKS cifra una particion completa a nivel de bloque. El archivo /etc/crypttab define los volumenes cifrados que se abren al arrancar. none como clave significa que se pedira la contraseña interactivamente. Se pueden usar archivos de clave para montaje automatico.

EncFS y eCryptfs - Cifrado a nivel de archivo

A diferencia de LUKS que cifra a nivel de bloque, EncFS y eCryptfs cifran archivos individuales.

eCryptfs

eCryptfs funciona como una capa sobre el sistema de archivos existente:

# Montar un directorio cifrado con eCryptfs
mount -t ecryptfs /datos/cifrado /datos/cifrado
 
# Se solicitaran opciones de cifrado interactivamente:
# - Algoritmo (aes, blowfish, twofish, etc.)
# - Tamano de clave
# - Passthrough en texto plano
# - Cifrado de nombres de archivo

Caracteristicas de eCryptfs:

  • Cifrado por archivo (no por particion)
  • Los archivos cifrados son accesibles individualmente
  • Usado por Ubuntu para cifrado del directorio home
  • Integrado en el kernel de Linux

EncFS

EncFS funciona en espacio de usuario (FUSE):

# Crear/montar un directorio cifrado
encfs /ruta/almacenamiento_cifrado /ruta/punto_montaje
 
# Desmontar
fusermount -u /ruta/punto_montaje

Comparativa de cifrado:

CaracteristicaLUKS/dm-crypteCryptfsEncFS
NivelBloque (particion)Archivo (kernel)Archivo (FUSE)
RendimientoAltoMedioBajo
Cifra nombres archivoSi (todo el bloque)OpcionalOpcional
Cifra metadatosSiParcialNo
Tamano visibleFijo (particion)VariableVariable
Requiere particionSiNoNo
Backup incrementalDificilFacilFacil

Para el examen: LUKS/dm-crypt cifra a nivel de bloque (particion completa), eCryptfs cifra a nivel de archivo dentro del kernel, y EncFS cifra a nivel de archivo en espacio de usuario (FUSE). LUKS es mas seguro pero menos flexible para backups; eCryptfs/EncFS permiten backups incrementales de archivos individuales.

Resumen de archivos y comandos clave

RecursoFuncion
/etc/crypttabDefinicion de volumenes cifrados LUKS
/dev/mapper/Dispositivos descifrados por dm-crypt
btrfs subvolumeGestion de subvolumenes Btrfs
zpoolGestion de pools ZFS
zfsGestion de datasets y snapshots ZFS
cryptsetupHerramienta de gestion de LUKS/dm-crypt
mount -t tmpfsMontar sistemas de archivos en RAM

Trampas del examen

Errores comunes y distinciones criticas que LPI suele evaluar en este subtema:

  • LUKS cifra a nivel de bloque, eCryptfs a nivel de archivo — LUKS/dm-crypt cifra toda la particion (nada es legible sin la clave); eCryptfs cifra archivos individuales sobre un FS existente. El examen puede preguntar cual usar segun el escenario (backup incremental favorece eCryptfs, seguridad maxima favorece LUKS)
  • cryptsetup luksOpen vs cryptsetup open — ambos abren un volumen LUKS, pero open --type luks es la sintaxis moderna. El dispositivo descifrado aparece en /dev/mapper/<nombre>, no en /dev/
  • /etc/crypttab con none como clave pide contrasena interactivamente — si el campo de clave es none, el sistema solicitara la contrasena durante el arranque. Si apunta a un archivo de clave (/etc/keys/keyfile), el montaje es automatico
  • tmpfs size= define el maximo, no una asignacion fijatmpfs size=2G no reserva 2 GB de RAM. tmpfs crece dinamicamente y solo usa la memoria necesaria. Sin especificar size=, el maximo es la mitad de la RAM total
  • Subvolumenes Btrfs no tienen tamano fijo — a diferencia de particiones o LVs, los subvolumenes comparten todo el espacio del FS. No puedes asignar un tamano maximo a un subvolumen directamente (se usan quotas para eso)
  • Snapshots Btrfs de solo lectura vs lectura/escriturabtrfs subvolume snapshot -r crea uno de solo lectura (necesario para btrfs send); sin -r es de lectura/escritura. El examen puede preguntar cual es necesario para enviar instantaneas
  • ZFS no esta integrado en el kernel Linux por licencia — la licencia CDDL de ZFS es incompatible con la GPL del kernel. Se instala como modulo externo (OpenZFS/DKMS). Btrfs si esta integrado nativamente
  • RAID-Z1 de ZFS equivale a RAID 5, RAID-Z2 a RAID 6 — RAID-Z1 tolera 1 disco fallido, RAID-Z2 tolera 2. Confundir los niveles o los minimos de disco (RAID-Z1 necesita minimo 3, RAID-Z2 minimo 4) es una trampa comun
  • Compresion Btrfs: zstd es el recomendado actualmentelzo es rapido pero comprime poco, zlib comprime mucho pero es lento, zstd ofrece el mejor equilibrio. El examen puede preguntar cual algoritmo usar segun el caso de uso