Bienvenido! - Willkommen! - Welcome!

Bitácora Técnica de Tux&Cía., Santa Cruz de la Sierra, BO
Bitácora Central: Tux&Cía.
Bitácora de Información Avanzada: Tux&Cía.-Información
May the source be with you!

Thursday, July 29, 2010

ntfsclone & dd & netcat

Fuente
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).
:wq

Entradas relacionadas

No comments: