Fecha: 2022-02-17 Tiempo de lectura: 4 minutos Categoría: Sistemas Tags: linux / mount / filesystem / UUID
Ha vuelto a pasar: tengo una máquina virtual con un disco secundario que se queda pequeño.
Añado otro disco, lo preparo, sincronizo los datos y configuro su montaje en el /etc/fstab,
usando su nombre de dispositivo. Eventualmente, reinicio el servidor, tras retirar el disco
antiguo y su nombre de dispositivo ha cambiado, causando que la máquina no arranque.
Harto de este tipo de situaciones, y visto que el nombre de dispositivo no es de fiar, ha llegado la hora de buscar un método alternativo de especificar un disco. Y el más fiable de todos es su identificador único de disco o partición (UUID). Este se asigna cada vez que formateamos el disco o partición.
Mi máquina virtual tiene 2 discos, uno en el puerto SATA 0, que es mi disco raíz, y otro
en el puerto SATA 1, digamos que dispone de 4GB y está montado en /var/lib/docker. En este
estado, Linux asigna el dispositivo /dev/sda al disco en el puerto SATA 0, y /dev/sdb
al disco del puerto SATA 1.
Eventualmente, me doy cuenta de que el disco de 4GB de /var/lib/docker se ha quedado corto.
Nada nuevo; simplemente añado un disco de 32GB en el puerto SATA 2, reinicio la máquina virtual,
y monto este /dev/sdc (o partición) temporalmente a otra carpeta para sincronizar los datos
y actualizo el /etc/fstab acorde a /dev/sdc. Apago la máquina, quito el disco en el puerto
SATA 1 y la vuelvo a levantar. ¡ERROR!
A pesar de que el disco de 32GB está en el puerto SATA 2, Linux le asigna el siguiente /dev/sdX
libre, que a falta de un disco en el puerto SATA 1, es /dev/sdb: el nombre del dispositivo
ha cambiado y el fichero /etc/fstab tiene /dev/sdc, lo que causa que la máquina virtual
no arranque.
Como ya hemos explicado, el nombre del dispositivo puede cambiar por varios motivos, pero
cada disco o partición dispone de un identificador único que se crea en tiempo de formateo,
con herramientas tipo mkswap o mkfs.
Podemos localizar el UUID de nuestras particiones de varias maneras. Podemos usar los
comandos blkid, lsblk o tune2fs; alternativamente podemos sacar esa información listando
los ficheros de dispositivos en /dev. Sin ser una lista exhaustiva, pongo algunos ejemplos:
gerard@server:~$ lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
sda
└─sda1 ext4 1.0 3723d7aa-ca4d-4959-ade2-80d7b2d0bb5e 1,1G 43% /
sdb
└─sdb1 ext4 1.0 9b85a769-bd34-47a2-b69d-3549aa76f930 31,3G 0% /var/lib/docker
sr0
gerard@server:~$
gerard@server:~$ sudo blkid
/dev/sda1: UUID="3723d7aa-ca4d-4959-ade2-80d7b2d0bb5e" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="db07bacb-01"
/dev/sdb1: UUID="9b85a769-bd34-47a2-b69d-3549aa76f930" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="0d8dbb9b-c731-7a43-8310-7e64d3eea84c"
gerard@server:~$
gerard@server:~$ ls -lh /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root 10 feb 17 14:22 3723d7aa-ca4d-4959-ade2-80d7b2d0bb5e -> ../../sda1
lrwxrwxrwx 1 root root 10 feb 17 14:22 9b85a769-bd34-47a2-b69d-3549aa76f930 -> ../../sdb1
gerard@server:~$
gerard@server:~$ sudo tune2fs -l /dev/sdb1 | grep UUID
Filesystem UUID: 9b85a769-bd34-47a2-b69d-3549aa76f930
gerard@server:~$
RESULTADO: Nos queda claro que el disco que es /dev/sdb1 (por el momento) y que está
montado en /var/lib/docker tiene el UUID 9b85a769-bd34-47a2-b69d-3549aa76f930.
/etc/fstabNormalmente, suelo montar la partición “a mano” y sacar la línea del fichero /etc/fstab
revisando /etc/mtab o /proc/mounts (son el mismo fichero); sacar esa línea del comando
mount requiere cambiar el formato final y por ello lo suelo descartar.
gerard@server:~$ mount | grep "/var/lib/docker"
/dev/sdb1 on /var/lib/docker type ext4 (rw,relatime)
gerard@server:~$
gerard@server:~$ grep "/var/lib/docker" /etc/mtab
/dev/sdb1 /var/lib/docker ext4 rw,relatime 0 0
gerard@server:~$
gerard@server:~$ grep "/var/lib/docker" /proc/mounts
/dev/sdb1 /var/lib/docker ext4 rw,relatime 0 0
gerard@server:~$
Luego pego esa última línea en el fichero /etc/fstab:
gerard@server:~$ grep "/var/lib/docker" /etc/fstab
/dev/sdb1 /var/lib/docker ext4 rw,relatime 0 0
gerard@server:~$
Sin embargo, sabiendo que el nombre del dispositivo cambia, pero el identificador no,
podemos modificar esa línea en el fichero /etc/fstab, cambiando el nombre del dispositivo
por UUID="xxxx". En este caso quedaría así:
gerard@server:~$ grep "/var/lib/docker" /etc/fstab
#/dev/sdb1 /var/lib/docker ext4 rw,relatime 0 0
UUID="9b85a769-bd34-47a2-b69d-3549aa76f930" /var/lib/docker ext4 rw,relatime 0 0
gerard@server:~$
Y con esto ya podemos añadir y quitar discos en el servidor, sin miedo a que nos descoloque los puntos de montaje en el proceso.