Montaje de filesystems, /etc/fstab y UUID

El montaje es el mecanismo por el cual Linux integra un dispositivo de almacenamiento en el árbol de directorios. A diferencia de Windows, donde cada disco aparece como una letra (C:, D:), en Linux cualquier dispositivo —un disco NVMe, una memoria USB, una partición cifrada— se ancla en un directorio existente llamado punto de montaje. Ese directorio no desaparece; simplemente queda “tapado” por el contenido del dispositivo mientras está montado.

Internamente, mount le pide al kernel que asocie un dispositivo de bloque con un directorio del VFS (Virtual Filesystem Switch). A partir de ese momento, todas las operaciones sobre ese directorio pasan por el driver del filesystem correspondiente (ext4, xfs, vfat, lo que sea). umount deshace esa asociación, pero solo si el kernel puede hacerlo de forma limpia: si algún proceso tiene un descriptor de archivo abierto dentro de ese filesystem, o simplemente tiene su directorio de trabajo (cwd) ahí, el kernel rechaza el desmontaje. No es un capricho —forzar el desmontaje con procesos activos corrompería operaciones en vuelo.

Usas mount manualmente cuando estás explorando, recuperando datos, o probando opciones antes de escribirlas en configuración permanente. /etc/fstab es esa configuración permanente: le dice al sistema qué montar automáticamente al arrancar. Equivocarse en fstab tiene consecuencias reales: una entrada mal escrita puede impedir que el sistema arranque, o puede dejar un disco externo sin montar sin que nadie se entere hasta que hace falta.

El error más común con fstab es identificar dispositivos por nombre de dispositivo (/dev/sdb1) en lugar de por UUID. Los nombres /dev/sdX los asigna el kernel en el orden en que detecta los dispositivos, y ese orden puede cambiar entre reboots —especialmente en sistemas con muchos discos o tras cambios de hardware. El UUID, en cambio, está grabado en los metadatos del filesystem y no cambia nunca a menos que formatees la partición.

Escenario completo: disco de datos adicional

Supón que has añadido un disco formateado como ext4 en /dev/sdb1. Vamos a montarlo manualmente, identificar por qué falla el desmontaje, y finalmente dejarlo configurado en fstab correctamente.

# Montar temporalmente para verificar que el disco funciona
mount /dev/sdb1 /mnt/datos

# Comprobar que está montado y ver el espacio disponible
df -h /mnt/datos

# Intentar desmontar (puede fallar si algo lo está usando)
umount /mnt/datos

# Si falla con "target is busy", identificar qué proceso lo bloquea
# +D busca recursivamente en todo el árbol bajo ese directorio
lsof +D /mnt/datos

# Resultado típico:
# COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
# bash     4821 ana    cwd    DIR    8,17     4096    2 /mnt/datos

# Matar o reubicar ese proceso y reintentar; ahora sí funciona
umount /mnt/datos

# Obtener el UUID del dispositivo para usarlo en fstab
blkid /dev/sdb1
# /dev/sdb1: UUID="a3f2e1b0-7c4d-4e8a-9b5f-2d1c3e4f0a6b" TYPE="ext4" ...

# Crear el punto de montaje si no existe
mkdir -p /mnt/datos

# Añadir la entrada en /etc/fstab
# El orden de las columnas es:
# dispositivo  punto_de_montaje  tipo  opciones  dump  pass
cat >> /etc/fstab << 'EOF'
UUID=a3f2e1b0-7c4d-4e8a-9b5f-2d1c3e4f0a6b  /mnt/datos  ext4  defaults,noatime  0  2
EOF

# Verificar que la sintaxis es correcta antes de reiniciar:
# mount -a intenta montar todo lo que hay en fstab y no está montado aún
mount -a

# Confirmar que está montado correctamente
findmnt /mnt/datos

Lo que está pasando en cada decisión

El fallo de umount no es un error del sistema —es protección contra corrupción. Cuando lsof +D /mnt/datos muestra un proceso con cwd en ese directorio, significa que ese proceso tiene abierto el directorio como su directorio de trabajo actual. Basta con que un terminal haya hecho cd /mnt/datos para bloquearlo. La solución no es forzar (umount -l hace un desmontaje “lazy” que puede dejarte en estado inconsistente en ext4); la solución correcta es mover o terminar ese proceso.

blkid /dev/sdb1 lee los superblocks del filesystem y devuelve el UUID que ext4 grabó cuando fue formateado con mkfs.ext4. Ese valor es lo que pones en fstab, precedido de UUID=. Nunca uses el nombre /dev/sdb1 en producción; en cuanto añadas otro disco o cambies el orden de arranque, /dev/sdb1 puede pasar a ser otro dispositivo completamente distinto.

Las seis columnas de fstab tienen significado preciso. La quinta columna (dump, aquí 0) controla si el comando dump hace backup de este filesystem —en la práctica nadie usa dump hoy, siempre va a 0. La sexta columna (pass, aquí 2) le dice a fsck en qué orden revisar el filesystem durante el arranque: 1 es solo para el filesystem raíz (/), 2 para los demás que quieres que se comprueben, 0 para que fsck lo ignore por completo. Poner 2 en tu disco de datos es correcto; poner 1 en algo que no es raíz causará que fsck se queje.

defaults,noatime: defaults es un alias que expande a rw,suid,dev,exec,auto,nouser,async —el conjunto sensato para la mayoría de filesystems locales. noatime desactiva la actualización del access time en cada lectura de archivo. En ext4, cada vez que lees un archivo el kernel normalmente escribe en el inodo para actualizar atime. Con noatime, esa escritura no ocurre, lo que reduce la carga de escritura especialmente en SSDs y en discos con muchos archivos pequeños leídos frecuentemente.

mount -a es imprescindible antes de reiniciar. Ejecuta exactamente lo que ejecutaría el arranque (monta todo lo que hay en fstab y no está ya montado), por lo que si hay un error de sintaxis o el UUID es incorrecto, lo descubres ahora, en vivo, sin tener que reiniciar y quedarte con un sistema en modo de emergencia. Si mount -a devuelve un error, corrige fstab antes de tocar nada más.

Para discos externos o dispositivos que no siempre estarán presentes, añade nofail a las opciones: defaults,noatime,nofail. Sin esa opción, si el disco no está conectado al arrancar, systemd esperará 90 segundos y luego te dejará en un prompt de emergencia. Con nofail, simplemente salta esa entrada y sigue arrancando. Para filesystems de red (NFS, CIFS), usa además _netdev para indicarle a systemd que espere a que la red esté disponible antes de intentar montarlos.

88

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll al inicio