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.
Pingback: Transferir una imagen de disco a través de la red. Bash y más | PlanetaLibre /
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
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!
This is such awesome content i got to read after lot of time. Its so interesting as well as informative. I am sure everyone who read it got a lot to learn from it.Eddie munson vest
Hello, I read this nice article. I think You put a best effort to write this perfect article. I appreciate your work. thank you so much.
Women’s Red Long Coat