domingo, 25 de octubre de 2009

Usar UUID o ID en lugar de nombres de dispositivos

El otro día compré una tarjeta expresscard eSata para poder conectar mi recién adquirida base (docking station) Sharkoon al portátil.



Al margen de las asombrosas velocidades de transferencia que se consiguen usando eSata en comparación con UBS, me encontré con el problema de que tanto al conectar el disco duro en caliente como al iniciar el sistema con él conectado, los nombres (o el orden) de los nombres de dispositivos pueden variar. Me explico...

Si arranco el sistema operativo sin el disco duro eSata conectado, el disco interno del portátil es /dev/sda, y las distintas particiones /dev/sda1, /dev/sda2, etc. Si conecto el disco eSata (el disco al docking, y el docking al puerto eSata de la expresscard), el sistema le asigna nombre de dispositivo /dev/sdb, y sus distintas particiones /dev/sdb1, /dev/sdb2, etc. En este estado de cosas, tendremos archivos de configuración, elinks, etc que hacen referencia a estas particiones y/o nombres de dispositivos. Pero si yo ahora arranco el sistema con el disco duro externo ya conectado al puerto eSata, puede pasar (de hecho en mi caso es lo que pasa) que el sistema le asigne a dicha unidad el nombre de dispositivo /dev/sda, y al disco duro interno /dev/sdb, con el consiguiente reordenado en las particiones.... y a partir de ahí ya os podéis imaginar la que se lía (en mi caso, del gestor de arranque ya no pasa).

Para evitar esta situación, podemos usar UUID (Identificador Universal Único) en lugar de nombres de dispositivos (/dev/sdx#). Los UUID se asignan unívocamente a cada unidad, independientemente de su orden de arranque, cambios en hardware, etc.
¿Y como podemos averiguar dichos UUID?. Una forma sencilla de hacerlo es a través de la utilidad de linea de comandos blkid. Tenemos que ejecutarla como superusuario (root), y el resultado puede ser parecido a éste:
linux-intb:~ # blkid
/dev/sda1: SEC_TYPE="msdos" LABEL="DellUtility" UUID="07D7-031C" TYPE="vfat"
/dev/sda2: UUID="A4C4FAA5C4FA78BE" TYPE="ntfs"
/dev/sda3: UUID="7688E5C284F748B5" TYPE="ntfs"
/dev/sda5: UUID="c57fbee4-4540-1d9a-7296-f108f9bb5959" TYPE="swap"
/dev/sda6: LABEL="kubuntu_9.04" UUID="c64c8686-4549-4b42-90f5-1db009068089" TYPE="ext4"
/dev/sda7: LABEL="openSUSE_11.2" UUID="42622030-05ab-44b0-a967-748d276fe753" TYPE="ext4"
pudiendo usar estos UUID tranquilamente en todas aquellas partes donde hasta ahora empleábamos los nombres de dispositivos y/o particiones (como en los archivos fstab, menu.lst y grub.conf). Por ejemplo, en el fstab, podemos añadir UUID=xxx.yyy.zzz (sin las comillas dobles) en sustitución de /dev/sdx#, es decir:
UUID=xxx.yyy.zzz  /media/eSATA     ext3 auto,user      0       2
en lugar de
/dev/sdb1  /media/eSATA     ext3 auto,user      0       2
De esta manera, nos ahorramos los quebraderos de cabeza ocasionados por cambios en el hardware.

Además de la especificación by-uuid, el administrador de dispositivos udev utiliza alternativamente otro tipo de alias denominado by-id. Una forma sencilla de averiguar estos id (así como uuid, etiquetas, etc) es sabiendo que udev establece estos alias al arranque sobre /dev/disk. Si ejecutamos:
ls /dev/disk -l
vemos 4 resultados:
josea@linux-intb:~> ls /dev/disk/ -l
drwxr-xr-x 2 root root 380 2009-10-25 14:00 by-id
drwxr-xr-x 2 root root 100 2009-10-25 15:00 by-label
drwxr-xr-x 2 root root 220 2009-10-25 14:00 by-path
drwxr-xr-x 2 root root 160 2009-10-25 15:00 by-uuid
Si a continuación ejecutamos:
ls /dev/disk/by-id -l
obtenemos
josea@linux-intb:~> ls /dev/disk/by-id/ -l
total 0
lrwxrwxrwx 1 root root 9 2009-10-25 15:00 ata-TOSHIBA_MK1234GSX_27LMTPXAT -> ../../sda
lrwxrwxrwx 1 root root 10 2009-10-25 15:00 ata-TOSHIBA_MK1234GSX_27LMTPXAT-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 2009-10-25 15:00 ata-TOSHIBA_MK1234GSX_27LMTPXAT-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 2009-10-25 15:00 ata-TOSHIBA_MK1234GSX_27LMTPXAT-part3 -> ../../sda3
lrwxrwxrwx 1 root root 10 2009-10-25 15:00 ata-TOSHIBA_MK1234GSX_27LMTPXAT-part4 -> ../../sda4
lrwxrwxrwx 1 root root 10 2009-10-25 15:00 ata-TOSHIBA_MK1234GSX_27LMTPXAT-part5 -> ../../sda5
lrwxrwxrwx 1 root root 10 2009-10-25 15:00 ata-TOSHIBA_MK1234GSX_27LMTPXAT-part6 -> ../../sda6
lrwxrwxrwx 1 root root 10 2009-10-25 15:00 ata-TOSHIBA_MK1234GSX_27LMTPXAT-part7 -> ../../sda7
lrwxrwxrwx 1 root root 9 2009-10-25 14:00 edd-int13_dev80 -> ../../sda
lrwxrwxrwx 1 root root 9 2009-10-25 15:00 scsi-SATA_TOSHIBA_MK1234G_27LMTPXAT -> ../../sda
lrwxrwxrwx 1 root root 10 2009-10-25 15:00 scsi-SATA_TOSHIBA_MK1234G_27LMTPXAT-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 2009-10-25 15:00 scsi-SATA_TOSHIBA_MK1234G_27LMTPXAT-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 2009-10-25 15:00 scsi-SATA_TOSHIBA_MK1234G_27LMTPXAT-part3 -> ../../sda3
lrwxrwxrwx 1 root root 10 2009-10-25 15:00 scsi-SATA_TOSHIBA_MK1234G_27LMTPXAT-part4 -> ../../sda4
lrwxrwxrwx 1 root root 10 2009-10-25 15:00 scsi-SATA_TOSHIBA_MK1234G_27LMTPXAT-part5 -> ../../sda5
lrwxrwxrwx 1 root root 10 2009-10-25 15:00 scsi-SATA_TOSHIBA_MK1234G_27LMTPXAT-part6 -> ../../sda6
lrwxrwxrwx 1 root root 10 2009-10-25 15:00 scsi-SATA_TOSHIBA_MK1234G_27LMTPXAT-part7 -> ../../sda7
Vamos con otro ejemplo: en menu.lst podemos utilizar la nomenclatura by-id en lugar de los nombres de dispositivos. En lugar de:
title openSUSE 11.2
root (hd0,6)
kernel /boot/vmlinuz-2.6.31.3-1-default root=/dev/sda7 resume=/dev/sda5 splash=silent quiet showopts vga=0x317
initrd /boot/initrd-2.6.31.3-1-default
podríamos poner:
title openSUSE 11.2
root (hd0,6)
kernel /boot/vmlinuz-2.6.31.3-1-default root=/dev/disk/by-id/ata-TOSHIBA_MK1234GSX_27LMTPXAT-part7 resume=/dev/disk/by-id/ata-TOSHIBA_MK1234GSX_27LMTPXAT-part5 splash=silent quiet showopts vga=0x317
initrd /boot/initrd-2.6.31.3-1-default

En el ejemplo que veíamos antes con fstab, si usásemos by-id en lugar de nombres de dispositivos o by-uuid, quedaría:
/dev/disk/by-id/scsi-3500000e01632b7d0-part2   /media/eSATA     ext3 auto,user      0       2
Ojo porque si creamos la partición durante la sesión en curso, udev no montará en /dev/disk los alias by-id o by-uuid hasta que reiniciemos.

2 comentarios:

rafaed dijo...

Muy bien explicado.

admin dijo...

Gracias, me ha sido de mucha utilidad.
Un saludo