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.
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.
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
Muchas gracias por la información tsao, ahora mismo echo un vistazo a lo que comentas de SYMLINK ;)