Publi

Transferir una imagen de disco a través de la red. Bash y más


Foto: nrkbeta Flickr (CC-by)

Todo surgió cuando quería cambiar el disco duro de mi mediacenter. El disco duro lo tenía en mi ordenador de trabajo y el mediacenter (que hace también las veces de router/firewall y demás) no podía desenchufarlo. Es verdad que para un disco duro montado y activo no es la mejor forma, pero ya puestos, quería hacer el experimento, por lo que elegí algunas particiones que no tenían demasiada actividad (que luego fsck se encargue :))

Para lo que sí puede servir es para crear imágenes de discos duros y transmitirlas a un servidor central para su almacenaje, ya sea por problemas de sitio, que no tengas espacio suficiente en algún dispositivo externo, o porque por seguridad se quiere transmitir a un servidor remoto o también, porque se tengan que instalar muchos ordenadores con configuraciones parecidas y, una vez configurado uno (ya sea con Windows, o cualquier UNIX), los configuramos todos desde aquí.

Eso sí, para ejecutar esto necesitamos Bash, dd (que suele con los *nix), pv (podemos pasar de el, pero se agradece), bzip2 (para comprimir) y netcat (para transmitir). ¡Manos a la obra!

¡ Tened cuidado cuando estéis probando esto ! ¡ Podéis escribir directamente en el disco y perder información !

En la máquina destino: Servidor

En la máquina donde queremos copiar la imagen. El destino, hará de servidor (podríamos invertir los papeles). En esa máquina (suponiendo que el disco destino sea (/dev/sdd1) y que el puerto que queremos el 19000), en un terminal, escribiremos esto:

1
$ nc -l 19000 | bzip2 -d | sudo dd bs=16M of=/dev/sdd1

En esta línea:

  • nc (netcat) será el encargado de la transmisión de datos, con -l 19000 lo ponemos en modo escucha por el puerto 19000
  • bzip2 será el programa de compresión encargado de descomprimir (para eso el -d)
  • dd escribirá en el dispositivo (le ponemos sudo porque esta operación requerirá privilegios de escritura en dicho dispositivo), con bs=16M especificamos el tamaño del bloque, y of=/dev/sdd1 especifica el dispositivo.

Si queremos que se almacene en un archivo directamente, sin escribir en ningún dispositivo:

1
$ nc -l 19000 | bzip2 -d > destino.bz2

En la máquina origen: cliente

Esta imagen será la que emitirá la imagen, se conectará con el host servidor, la comprimirá y se la pasará. Nuestro dispositivo de origen será /dev/sda1 y la máquina con la que conectaremos 192.168.0.20:

1
$ ORIGIN=/dev/sda1 sudo dd bs=16M if="$ORIGIN" | pv -s $(lsblk -n -b -o SIZE "$ORIGIN")  | bzip2 -c | nc 192.168.0.20 19000

En este caso:

  • ORIGIN=/dev/sda1 : Lo ponemos para no tener que repetir /dev/sda1 en la instrucción y evitar fallos del copia y pega
  • dd : Como antes, es el encargado de interactuar con el disco, como ahora extraemos información de él (of=”$ORIGIN”), en este caso es lo mismo que of=/dev/sda1
  • pv : Nos indicará el progreso, ¿ cuántos bytes lleva copiados ? creará una barra de progreso que podemos mirar para ver cuánto queda. Es muy útil porque la transmisión de un disco duro por red es muy lenta y queremos saber cuánto queda. Con -s especificamos el tamaño que lo calcularemos con lo siguiente:
  • lsblk : Extrae información de un dispositivo de bloques, tiene una salida compleja, por eso, con -n le quitamos encabezados, con -b especificamos la salida en bytes, con -o SIZE decimos que sólo queremos que nos diga el tamaño del dispositivo, y “$ORIGIN” indicará el dispositivo, que aquí es /dev/sda1 (si queremos podemos poner esto directamente). Además, todo está entre $(…) para pasar el valor resultante al argumento -s de pv.
  • bzip2 : será el compresor esta vez, por eso -c.
  • nc : se encarga de la transmisión por red, conectará con el host 192.168.0.20 y el puerto 19000

¡Y listo! Pasado un rato, hemos transmitido la imagen de disco que necesitábamos.

También podría interesarte...

There are 3 comments left Ir a comentario

  1. Pingback: Transferir una imagen de disco a través de la red. Bash y más | PlanetaLibre /

  2. esteban /
    Usando Mozilla Firefox Mozilla Firefox 37.0 en Ubuntu Linux Ubuntu Linux

    Hola, lo voy a probar, pero en la linea que guarda la imagen a un archivo no tendria que ser asi? $ nc -l 19000 | bzip2 -d | sudo dd bs=16 of=imagendisco.img

    1. Gaspar Fernández / Post Author
      Usando Mozilla Firefox Mozilla Firefox 37.0 en Ubuntu Linux Ubuntu Linux

      Hola Esteban,

      Deberían servir las dos formas. En la del post, cogemos la salida de bzip y la escribimos directamente en un archivo (incluso si queremos almacenar en el ordenador de destino el archivo sin comprimir podemos quitar lo del bzip). En tu método estamos pasándole los datos a dd y éste los está copiando también.
      Con tu forma podríamos escribir en directorios con privilegios de root.

      Muchas gracias por tu aportación!

Leave a Reply