Lo hice y lo entendí

El blog de Vicente Navarro
07 dic

Usando ntfsclone y dd para clonado por red con netcat

Siguiendo con la entrada Alternativas al Ghost para crear imágenes de NTFS en Linux: Partimage y ntfsclone, veamos ahora cómo usar el ntfsclone y el dd para crear imágenes con ntfsclone de particiones en sistemas en los que no tenemos sitio para almacenarlas o para clonar discos completos con dd directamente a través de la red sin necesidad de crear un fichero de imagen intermedio.

Imaginemos, para empezar, el caso de que queremos hacer una imagen de una de las particiones NTFS de nuestro sistema. Puede ser para su posterior recuperación o puede ser para usar esa imagen con otros sistemas (y, por tanto, clonar el actual). Pero, desafortunadamente, no tenemos espacio en otra partición del sistema para almacenar el fichero de imagen localmente tal y como hacíamos en Alternativas al Ghost para crear imágenes de NTFS en Linux: Partimage y ntfsclone.

Si vamos a usar Partimage, no vamos a tener ningún problema para escribir la imagen remotamente, ya que es precisamente una de sus funcionalidades: la posibilidad de tener un servidor de imágenes de Partimage donde podemos escribir todas las imágenes de nuestros sistemas a través de la red.

Centrémonos, por tanto, en el ntfsclone, y en cómo usarlo a través de la red. La propia página de man del ntfsclone nos sugiere cómo hacerlo a través de SSH:

Backup an NTFS volume to a remote host, using ssh. Please note, that ssh may ask for a password!

    ntfsclone --save-image --output - /dev/hda1 | \\
    gzip -c | ssh host 'cat > backup.img.gz'

Restore an NTFS volume from a remote host via ssh. Please note, that ssh may ask for a password!

    ssh host 'cat backup.img.gz' | gunzip -c | \\
    ntfsclone --restore-image --overwrite /dev/hda1 -

Sin embargo, a mí me gusta más usar netcat para este propósito. netcat se autodenomina “la navaja suiza de TCP/IP”, y es verdad que lo es. De las varias implementaciones existentes, si usamos la original (cuyo autor es *Hobbit*) y leemos su README (en Debian/Ubuntu en /usr/share/doc/netcat-traditional/README.gz), veremos unos pocos ejemplos de sus posibilidades, suficientes para sorprendernos de la enorme versatilidad de esta herramienta.

En su forma más sencilla de uso, a mí me gusta ver a netcat como una tubería (pipe) que se extiende a otra máquina de la red. Por ejemplo, si hacemos:

sistema1 $ echo "Hola Mundo" | nc -q 0 -lp 2222

sistema2 $  nc sistema2 2222 | cat
Hola Mundo

es como si hiciéramos:

echo "Hola Mundo" | envia_por_red_a_sistema2 | cat

Por tanto, para escribir una imagen de ntfsclone en otro sistema, podríamos (tras haber arrancado Linux en dicho sistema desde una instalación propia o desde un LiveCD) hacer (sisdest es donde vamos a guardar la imagen de la partición NTFS y sisorig es donde tenemos la partición NTFS):

sisdest $ nc -lp 2222 > ntfsclone.gz

sisorig # ntfsclone -o - -s /dev/sda1 | gzip | nc -q 0 sisdest 2222 
ntfsclone v1.13.2-WIP (libntfs 10:0:0)
NTFS volume version: 3.1
Cluster size       : 4096 bytes
Current volume size: 10725732352 bytes (10726 MB)
Current device size: 10725732864 bytes (10726 MB)
Scanning volume ...
100.00 percent completed
Accounting clusters ...
Space in use       : 1231 MB (11.5%)   
Saving NTFS to image ...
100.00 percent completed
Syncing ...

Para escribir la imagen de vuelta a la partición, podemos hacer:

sisdest $ cat ntfsclone.gz | nc -q 0 -lp 2222

sisorig # nc sisdest 2222 | gzip -d | ntfsclone -r -O /dev/sda1 -
ntfsclone v1.13.2-WIP (libntfs 10:0:0)
Ntfsclone image version: 10.0
Cluster size           : 4096 bytes
Image volume size      : 10725732352 bytes (10726 MB)
Image device size      : 10725732864 bytes
Space in use           : 1231 MB (11.5%)   
Offset to image data   : 56 (0x38) bytes
Restoring NTFS from image ...
100.00 percent completed
Syncing ...

Si quisiéramos clonar la partición directamente en otro sistema, sin pasar por un fichero de imagen intermedio, podríamos hacerlo en un único comando (por sistema):

sisdest # nc -lp 2222 | gzip -d | ntfsclone -r -O /dev/sda1 -

sisorig # ntfsclone -o - -s /dev/sda1 | gzip | nc -q 0 sisdest 2222 

Si queremos clonar una partición no NTFS o si queremos clonar todo el disco en otro sistema, podemos usar dd:

sisdest # nc -lp 2222 | gzip -d | dd of=/dev/sda

sisorig # dd if=/dev/sda | gzip | nc -q 0 sisdest 2222

Sin embargo, mientras que la salida del ntfsclone nos dice qué porcentaje de la imagen lleva leído o escrito, el dd no dice absolutamente nada hasta que finaliza. Como clonar un disco de muchos Gigabytes puede ser una tarea bastante larga, puede ser muy útil introducir entre los comandos de la tubería un pv para saber por dónde va la copia. El pv es un interesante comando que, usado en una tubería (pipe), copia directamente la información de la entrada estándar en la salida estándar y además nos informa del volumen de datos que ha movido por la tubería por la salida de error:

sisdest # nc -lp 2222 | pv | gzip -d -c | dd of=/dev/sda
 949MB 0:02:56 [9.65MB/s] [                        <=>                        ]

sisorig # dd if=/dev/sda | gzip | pv | nc -q 0 sisdest 2222
 822MB 0:02:38 [8.15MB/s] [                                        <=>        ]

En el ejemplo anterior, como hemos puesto el pv entre el gzip y el nc, medimos la tasa de datos comprimidos que enviamos a la red. Si lo comparamos con el informe que nos da el dd al final de su ejecución de datos escritos en el dispositivo (sin comprimir), podremos ver cuánto se han comprimido los datos antes de ser enviados por la red:

sisdest # nc -lp 2222 | pv | gzip -d | dd of=/dev/sda2
19.7GB 0:49:51 [6.76MB/s] [         <=>                                       ]
103426470+0 records in
103426470+0 records out
52954352640 bytes (53 GB) copied, 2991.03 s, 17.7 MB/s

sisorgi # dd if=/dev/sda2 | gzip | pv | nc -q 0 sisdest 2222
19.7GB 0:49:49 [6.76MB/s] [          <=>                                      ]
103426470+0 records in
103426470+0 records out
52954352640 bytes (53 GB) copied, 2989.45 s, 17.7 MB/s

También podríamos poner el pv entre el dd y el gzip para ver qué cantidad de datos sin comprimir, de los que tiene el disco o partición, hemos procesado ya.

Sin embargo, si vamos a hacer esta operación de clonado de discos muy a menudo, tal vez nos interese probar si no nos interesa eliminar el comando gzip de las tubería de ambos sistemas remotos: Si los sistemas de ambos extremos no son capaces de comprimir y descomprimir datos a más velocidad de la que tiene la red, es muy posible que nos interese más enviar los datos por la red sin comprimir:

sisdest # nc -lp 2222 | pv | dd of=/dev/sda2
49.3GB 0:20:09 [41.7MB/s] [        <=>                                        ]
103426470+0 records in
103426470+0 records out
52954352640 bytes (53 GB) copied, 1209.69 s, 43.8 MB/s

sisorig # dd if=/dev/sda2 | pv | nc -q 0 sisdest 2222
49.3GB 0:20:08 [41.8MB/s] [        <=>                                        ]
103426470+0 records in
103426470+0 records out
52954352640 bytes (53 GB) copied, 1208.32 s, 43.8 MB/s

Por cierto, la diferencia en cantidades es porque dd usa Gigabytes y pv usa Gibibytes:

$ bc

52954352640/1000/1000/1000
52.9543526400

52954352640/1024/1024/1024
49.3175840377

Para finalizar, comentar que si vamos a usar dd y gzip y vamos a clonar un mismo disco multitud de veces, nos puede interesar mucho llenar todos los espacios vacíos de los sistemas de ficheros del disco con ceros para que el gzip pueda comprimir lo máximo posible. Para ello, tendríamos que hacer en cada partición del disco un “dd if=/dev/zero of=ceros; rm ceros” o un sdelete (ver Compactar imágenes de disco de VirtualBox: vditool vs VBoxManage).

Actualización 10/12/08: Obtener estadísticas de dd mientras se está ejecutando

:wq

Entradas relacionadas

6 Comentarios a “Usando ntfsclone y dd para clonado por red con netcat”

  • MrEleodore dice:

    Felicitaciones, otro post currado, donde se explican las cosas hasta las ultimas consecuencias, :).
    Existe un LiveCD, clonezilla, que usa precisamente ntfsclone,dd y partimage en función del sistema de ficheros que detecte, hace copias en red, permite dividir el backup en varios ficheros del tamaño que queramos (ej: de 4’2 gigas para grabarlos luego en DVD´s), comprime el backup en varios formatos, “entiende” volumenes lógicos…una maravilla! Lo he descubierto hace poco y es perfecto para lo que necesitabamos en el trabajo.

    Saludo y sigue así.

  • @MrEleodore ¡Muchas gracias! También me hablaron del Clonezilla en la anterior entrada, pero me temo que aún no he tenido la ocasión de probarlo. ¡A ver si lo hago! Gracias por la sugerencia.

  • Akas84 dice:

    Muy buen post,

    Aunque para enviar los datos por red encuentro mucho mas seguro el ssh, ya que como bien sabes, nc envia los paquetes sin cifrar a traves de la red ;)

    Sigue así!

  • @Akas84 ¡Gracias! Tienes razón, SSH es mucho más seguro y recomendable, pero si tienes que clonar un disco de p.e. 500 GB, tenemos que tener en cuenta el coste en tiempo procesador de encriptar y desencriptar los datos en ambos extremos. Si trabajamos sobre una red controlada, creo que podemos considerar razonable el usar el netcat el tiempo justo en el que se tarda en trasferir la imagen.

  • Reirok dice:

    Hola SuperCoco.

    La verdad excelente.

    Sobran las palabras.

    Una pregunta, en algún momento probaste algo ISCSI o AOE ???

  • @Reirok ¡Gracias! Pues la verdad es que no, es algo que tengo pendiente desde hace tiempo, sobre todo lo del iSCSI.

Tema LHYLE09, creado por Vicente Navarro