# rm-rf.es

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.

Salir de la versión móvil