Buscar en este blog

25.3.10

Clonado de un "filesystem" Unix/Linux y el problema de los "Hard Links"

Encontrarse con que el disco duro de un sistema está completamente lleno es muy común. La virtualización y el aprovisionamiento de recursos bajo demanda ayuda a suavizar las molestias que esto supone.

En el mejor de los casos, los filesystems del disco estarán manejados con LVM (o similares en otros Unix), de forma que se añade un nuevo disco y se exitienden los volúmenes sobre él.
En el peor, los filesystems estarán generados directamente sobre las particiones físicas del disco.


En ocasiones, para máquinas no críticas, es posible parar durante varias horas, sustituir el disco por otro u otros de mayor capacidad, reinstalar el sistema operativo, las aplicaciones, configurar, probar y volver a producción. Es una buena solución, pero es posible reducir el tiempo de parada clonando los filesystems al disco de mayor capacidad, manteniendo las configuraciones.

El principal problema cuando se clona un disco con comandos tipo 'tar', 'dd' ó 'cp' es que los hard links no se mantienen. En la mayoría de filesystems Unix, los enlaces simbólicos consisten en una entrada que a su vez apunta a otra entrada que enlaza a los datos en el disco. Un enlace duro, o hard link, apunta directamente a los datos de disco. Los archivos en disco son enlazados a través de inodos en el sistema de archivos. El inodo almacena información acerca del archivo, pero no su nombre, por lo que el nombre del archivo debe contener el número de inodo en que está el archivo. Podemos tener un archivo con dos (o más) nombres enlazados en diferentes lugares del filesystem; solamente deben apuntar el inodo del que cuelga el archivo.

Al utilizar el comando 'cp' sobre un archivo, el sistema copia el archivo a un nuevo lugar del disco, lo enlaza en un inodo disponible y después genera el nuevo nombre del archivo indicando el número de inodo del que depende.
Si el archivo tiene varios nombres (tiene diferentes hard links) apuntando hacia él, este proceso se repetirá, recopiando el archivo en diferentes inodos a los que solamente apuntará el último de los hard links.

Pero muchas de las herramientas de copiado de archivos tienen opciones para mantener la integridad de los hard links, comprobando que el inodo al archivo que se pretende copiar pueda existir y en este caso simplemente asignar el número de inodo en que está. Una de estas herramientas es "rsync" y su parámetro "-H", que hace exactamente esto.

La secuencia de pasos para el clonado del disco podría ser la siguiente:
  • Detener el sistema.
  • Conectar el nuevo disco.
  • Arrancar con un sistema Live tipo Knoppix y con ambos discos duros conectados.
  • Particionar el nuevo disco con un esquema similar al antiguo pero ajustando las necesidades de espacio y generar los filesystems (no tiene porque estar formateados con el mismo sistema de archivos).
  • Montar, en diferentes puntos de montaje del sistema Live, los filesystems origen y destino correlativos a los disco nuevo y antiguo.
  • Utilizar "rsync" para copiar el contenido de uno a otro manteniendo los hard links:
#> rsync -Hva /mnt/disco_origen_sda1 /mnt/disco_destino_sdb1
#> rsync -Hva /mnt/disco_origen_sda2 /mnt/disco_destino_sdb2

  • Instalar/reparar el arranque del sistema. Típicamente, instalando grub (o el gestor de arranque elegido) en el MBR del nuevo disco:
#> grub-install /dev/sdb


  • Parar el sistema, desconectar el disco antiguo y conectar el disco nuevo en el mismo lugar que estaba el antiguo. De esta forma, es muy probable que el dispositivo sea reconocido con los mismos nombres (/dev/sda1, /dev/sda2...) y arranque sin tener que hacer nada más.