Mapeo persistente de dispositivos / discos con udev

En ocasiones, pueden no ser suficiente con disponer de un identificador fijo para un filesystem (blkid, uuid, ya sabéis), sino que necesitamos un identificador fijo para el dispositivo o disco.

Puede haber casos en los que puede ser válido utilizar las nomenclaturas disponibles en la ruta /dev/disk:

$ ls -l /dev/disk/
total 0
drwxr-xr-x 2 root root 600 2014-08-19 07:40 by-id
drwxr-xr-x 2 root root  80 2014-08-19 09:38 by-label
drwxr-xr-x 2 root root 240 2014-08-19 09:38 by-path
drwxr-xr-x 2 root root 180 2014-08-19 07:40 by-uuid

Como véis, encontramos los discos identificados por «id«, «label«, «path» y «uuid«. Ejemplo:

$ ls -lR /dev/disk/*
/dev/disk/by-id:
total 0
lrwxrwxrwx 1 root root  9 2014-08-19 07:39 ata-ST9320423AS_5VH5928G -> ../../sda
lrwxrwxrwx 1 root root 10 2014-08-19 07:39 ata-ST9320423AS_5VH5928G-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 2014-08-19 07:39 ata-ST9320423AS_5VH5928G-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 2014-08-19 07:39 ata-ST9320423AS_5VH5928G-part3 -> ../../sda3
[...]

/dev/disk/by-label:
total 0
lrwxrwxrwx 1 root root 10 2014-08-19 07:39 storage -> ../../sda1
lrwxrwxrwx 1 root root 10 2014-08-19 07:39 System\x20Reserved -> ../../sda2

/dev/disk/by-path:
total 0
lrwxrwxrwx 1 root root  9 2014-08-19 07:39 pci-0000:00:1a.0-usb-0:1.2:1.0-scsi-0:0:0:0 -> ../../sdb
lrwxrwxrwx 1 root root  9 2014-08-19 07:39 pci-0000:00:1f.2-scsi-0:0:0:0 -> ../../sda
lrwxrwxrwx 1 root root 10 2014-08-19 07:39 pci-0000:00:1f.2-scsi-0:0:0:0-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 2014-08-19 07:39 pci-0000:00:1f.2-scsi-0:0:0:0-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 2014-08-19 07:39 pci-0000:00:1f.2-scsi-0:0:0:0-part3 -> ../../sda3
[...]

/dev/disk/by-uuid:
total 0
lrwxrwxrwx 1 root root 10 2014-08-19 07:40 278b1de4-fd78-41b6-9271-fda3ebe31b9b -> ../../sda6
lrwxrwxrwx 1 root root 10 2014-08-19 07:39 583fb8a1-4935-4e01-bef4-49bd8ffd27c1 -> ../../sda7
lrwxrwxrwx 1 root root 10 2014-08-19 07:40 9f7b446b-6852-4840-96e0-5d8045926b44 -> ../../dm-0
lrwxrwxrwx 1 root root 10 2014-08-19 07:39 a78dc39a-ffa1-4f89-baa3-29673b084c7c -> ../../sda5
[...]

Si esto no es suficiente, podemos recurrir a «udev» y su capacidad de asignar identificadores fijos a dispositivos (no sólo a discos, también a tarjetas de red por ejemplo). Para dar un mapeo fijo a un disco lo primero es conocer su scsi_id (identificador único SCSI):

# /sbin/scsi_id --whitelisted --replace-whitespace /dev/sdj
3600144f0956df03d000053eac12d0003

Ahora que tenemos el SCSI_ID, creamos un nuevo fichero con las reglas udev, hay un directorio específico para añadir nuestras reglas personalizadas:

/etc/udev/rules.d/20-persistent-disk.rules

En el fichero indicado, añadimos las siguientes líneas:

KERNEL=="sd[a-z]", SUBSYSTEM=="block", PROGRAM="/sbin/scsi_id --whitelisted --replace-whitespace /dev/$name", RESULT=="3600144f0956df03d000053eac12d0003", NAME="persistente"
KERNEL=="sd[a-z][0-9]", SUBSYSTEM=="block", PROGRAM="/sbin/scsi_id --whitelisted --replace-whitespace /dev/$name", RESULT=="3600144f0956df03d000053eac12d0003", NAME="persistente%n"

Básicamente, en la primera línea estamos diciendo que el dispositivo de bloques que sea sd* y su SCSI_ID sea el que hemos sacado antes, le asigne el nombre permanente /dev/persistente. La segunda línea es para sus particiones, le asignará /dev/persistente1, /dev/persistente2, etc.

Finalmente recargamos las reglas de udev con el siguiente comando:

# udevadm control --reload-rules

Y ya deberíamos ver nuestro dispositivo con nombre persistente:

# ls -l /dev/persistente
brw-rw---- 1 root disk 8, 32 ago 12 20:03 /dev/persistente

Nota: cuando asignas un nombre persistente, es posible que el disco (/dev/sd*) ya no aparezca al hacer un fdisk, por lo menos a mí me ha pasado.

4 comentarios en “Mapeo persistente de dispositivos / discos con udev

  1. La recomendación de Red Hat es usar SYMLINK en vez de NAME, porque puede (y a mi me ha pasado) que cuando quieras eliminar la regla en caliente el nombre persistente que has creado no desaparezca. Usando SYMLINK mantienes además los /dev/sd-algo, por lo que no los «perderás» para hacer un fdisk.

    Por cierto, no lo mencionas, pero también acepta la creación de ficheros de dispositivo dentro de subdirectorios en /dev, lo que puede ser útil a veces :-)

    • Crear un enlace simbólico (SYMLINK como tu le llamas) también es una mala practica, ya que ciertas aplicaciones no se adhieren si reconocen la ruta como un enlace simbólico, lo cual te puede dar problemas cuando tengas dependencias de esa ruta en particular.

  2. Ah, y un problema típico, si la máquina es virtual, es que no esté activo el general el uuid del disco, por lo que al hacer el scsi_id devuelva un valor vacío. Eso, en VMWare se soluciona en la configuración de la máquina virtual con la opción disk.enableUUID=true

Comments are closed.