~
~
:wq

Sunday, 17 April 2011

Establecer el UUID a particiones reiserfs. Jugando con bash

english version - all spanish posts

Acabo de darme cuenta que en un viejo PC las particiones en el fstab no están asociadas al correspondiente UUID. Normalmente suelo asociarlas ya que así evito cualquier problema al añadir/quitar discos.

Este PC en concreto tiene la mayoría de las particiones de los usuarios (distintos /home/XXXX) con reiserfs. Hace muchos años usaba reiserfs de manera preferente a ext2 por razones obvias. Con la llegada de ext3 dejé de usar el sistema de ficheros reiser.

Por curiosidad he tratado de averiguar la antigüedad de estas particiones pero no he sido capaz (quizá algún avezado forense me pueda ayudar... debugreiserfs no muestra esa información). Los ficheros mas antiguos tiene fechas de acceso del 2004 pero estoy seguro que las particiones son anteriores....

Volviendo al tema del UUID. Las particiones reiser no llevan asociado el UUID:

root@oldandbeloveddesktop:~# debugreiserfs /dev/sda7 | grep UUID
debugreiserfs 3.6.21 (2009 www.namesys.com)

UUID: 00000000-0000-0000-0000-000000000000
root@oldandbeloveddesktop:~# blkid /dev/sda7
/dev/sda7: TYPE="reiserfs"

Por lo que habrá que generar el UUID y asignárselo a las particiones reiserfs. Lo haremos en un solo comando:

root@oldandbeloveddesktop:~# mount -t reiserfs | while read part; do umount ${part%% *}; reiserfstune --uuid $(uuidgen -r) ${part%% *}; mount ${part%% *} ; done

Eso es todo, ya hemos asignado un uuid a cada una de las particiones reiserfs. Podemos verificarlo mediante blkid:

root@oldandbeloveddesktop:~# blkid | grep reiserfs
/dev/sda7: TYPE="reiserfs" UUID="3cfa0f14-c35b-49fc-82a8-ff3e6e225af8"
/dev/sda10: TYPE="reiserfs" UUID="76255e20-92b1-4352-a604-6b371eb5ace0"
/dev/sda11: TYPE="reiserfs" UUID="06c74789-d403-408a-898f-b8e8880d3d3a"

Como colofón podemos editar el fstab mediante sed para reemplazar las entradas tipo /dev/sdXY por su correspondiente UUID. Bastará ejecutar:

root@oldandbeloveddesktop:/etc# for part in $(mount -t reiserfs); do sed -i "/^\/dev.*reiser/ s@^${part%% }@#original ${part%% }\n$(blkid ${part%% }|awk '{print $NF}') @" /etc/fstab; done
root@oldandbeloveddesktop:/etc# mount -a -o remount

Y esto es todo amigos!

Como el post se me ha quedado muy corto voy a explicar de manera detallada el proceso.

El primer comando que nos servía para asignar un UUID a cada partición reiserfs se resume en los siguientes pasos.

  1. mediante mount -t reiserfs listamos las particiones reiserfs

  2. el output se lo pasamos al "while" de bash quien iterará cada línea de la salida del anterior comando asignándosela a la variable "part".

  3. Mediante la expansión de parámetros de bash obtenemos sólo el dispositivo de la partición; o lo que gráficamente es:

    root@oldandbeloveddesktop:~# part="/dev/sda7 /home reiserfs defaults 0 2"
    root@oldandbeloveddesktop:~# echo ${part%% *}
    /dev/sda7
    
  4. para cada una de las particiones:

    4.1) desmontamos la partición mediante umount

    4.2) obtenemos un uuid aleatorio con uuidgen:

    uuidgen -r
    

    4.3) y se lo asignamos con reiserfstune.

    4.4) volvemos a montar la partición.

El segundo comando, que edita el fichero /etc/fstab reemplazando las entradas tipo /dev/sdXY por su correspondiente UUID, se detalla en los siguientes pasos:

  1. como en el primer comando usamos "mount -t reiserfs" para obtener el listado de las particiones reiserfs que tenemos (montadas) en el sistema.

  2. al igual que antes el output se lo pasamos a while asignando a $part cada línea. Recordemos que ''${part %% *}'' corresponderá a cada uno de las particiones en el formato '/dev/sdXY'.

  3. Para cada partición reiserfs ejecutaremos sed sobre /etc/fstab. El comando sed se divide en:

    3.1) una primera parte en la que seleccionamos las líneas de las particiones reiserfs, es decir con formato:

    /dev/...............reiser............
    

    3.2) sobre la selección anterior editaremos el campo /dev/sdXY 3.3) y lo reemplazaremos por un header que recuerde cual era el nombre original y la entrada fstab con el correspondiente UUID.

    3.3.1) el UUID lo obtendremos con blkid quedándonos únicamente con el valor UUID="foo" que corresponde al último campo del output si lo dividimos en espacios (awk). Por ejemplo si originalmente la línea correspondía a:

        /dev/sda10 /chroot reiserfs defaults 0 2
    
    quedará como:
        #original /dev/sda10
        UUID="76255e20-92b1-4352-a604-6b371eb5ace0"  /chroot reiserfs defaults 0 2
    

Ahora, si, esto es todo. El objetivo ha sido conseguido. Hemos asignado un UUID a cada partición reiserfs y nos hemos divertido un rato con la shell.

0 comments:

Post a Comment