Backup de todo tu Raspberry

Hoy les dejo un detalle que siempre es muy util, si estamos haciendo una investigación forense informática o queremos clonar un disco, siempre es necesario conocer todos los comandos.
En este caso el que utilizo continuamente para clonar proyectos con la RaspberrPi, es el DD, ya que utilizo a diario MAC oSX y LINUX, la mejor forma de realizar esto es mediante la interfaz de comando.

De esta manera evitamos perdidas de rendimiento con el renderizado de las GUI y demás tonterías que solo embellecen el programa, que por debajo realiza la misma tarea.

Necesitamos acceso ROOT, por tal motivo pondremos el sudo delante del comando.

sudo dd if=/dev/rdisk1 of=~/Desktop/pi.img bs=1m

El atributo “if” nos indica el Input File.
El atributo “of” nos indica el Output File.

En el caso inicial queremos realizar una copia o imagen del disco SD de la rasp. Por esto en el caso del atributo “if” indicaremos el disco que se le asigno a la tarjeta SD.
Cuando conectamos una tarjeta a nuestro MACOSX o LINUX, este le asigna una unidad o device. La cual encontraremos dentro del directorio “/dev”

El comando genérico para ver esto es “df -k”, el cual devuelve una lista de las “devices” asignadas a los diferentes dispositivos.

En MacOsx veremos disk con un numero. Por ejemplo /dev/disk1
En Linux veremos un sd con una letra. Por ejemplo /dev/sdb o sdc
Las “s1 o números” tras estas, solo indican las particiones. En este caso no nos importan.

Para estar seguros de lo que hacemos podemos ejecutar “df -k” antes de poner la tarjeta SD. Obteniendo por ejemplo:

sh-3.2# df -k
Filesystem 1024-blocks Used Available Capacity iused ifree %iused Mounted on
/dev/disk0s2 487546976 461145040 26145936 95% 115350258 6536484 95% /
devfs 181 181 0 100% 628 0 100% /dev
map -hosts 0 0 0 100% 0 0 100% /net
map auto_home 0 0 0 100% 0 0 100% /home
localhost:/DiO2XSaMW-DZkD_gbnPrOS 487546976 487546976 0 100% 0 0 100% /Volumes/MobileBackups

Lo importante son los “devs”

Conectamos la tarjeta SD y repetimos el comando.

sh-3.2# df -k
Filesystem 1024-blocks Used Available Capacity iused ifree %iused Mounted on
/dev/disk0s2 487546976 461145200 26145776 95% 115350298 6536444 95% /
devfs 185 185 0 100% 640 0 100% /dev
map -hosts 0 0 0 100% 0 0 100% /net
map auto_home 0 0 0 100% 0 0 100% /home
localhost:/DiO2XSaMW-DZkD_gbnPrOS 487546976 487546976 0 100% 0 0 100% /Volumes/MobileBackups
/dev/disk1s1 57288 20288 37000 36% 512 0 100% /Volumes/boot

Mágicamente aparece un nuevo “dev” llamado disk1s1.
En MacOSX también existe otro comando de lectura mas cómoda. “diskutil list”

sh-3.2# diskutil list
/dev/disk0 (internal, physical):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme *500.1 GB disk0
1: EFI EFI 209.7 MB disk0s1
2: Apple_HFS MacOsx 499.2 GB disk0s2
3: Apple_Boot Recovery HD 650.0 MB disk0s3
/dev/disk1 (external, physical):
#: TYPE NAME SIZE IDENTIFIER
0: FDisk_partition_scheme *8.0 GB disk1
1: Windows_FAT_32 boot 58.7 MB disk1s1
2: Linux 7.9 GB disk1s2

En ambos comandos vemos que el disco SD es el “disk1”.

Con dicha información ya podemos incluir el atributo “if” = /dev/disk1 (¿porque disk1 y no disk1s1? porque queremos copiar el disco completo y no solo una partición).

en el atributo “of” tendremos que indicar el destino de los datos. En este caso podemos poner un archivo de imagen. Por ejemplo “copiaRasp.img”

Finalemente el ultimo atributo que no es obligatorio pero ayuda, es el “BS”, que indica la cantidad de bloques que queremos leer en cada ciclo. En este caso se puede poner lo que desees, pero tras varias pruebas hemos determinado que lo mas compatible con todos los sistemas es poner “1Mb”.

Ya tenemos todo, construimos el comando.

$ sudo dd if=’/dev/disk1′ of=’copiaRasp.img’ bs=1m

antes de ejecutar el comando vamos a “tunearlo un poco”

La experiencia nos ha dicho siempre que si leemos de un dispositivo, es mejor que no este montado, para evitar cambios mientras lo leemos, por tal motivo lo desmontaremos.

En linux
$sudo unmount /dev/disk1
En MacOsx
$diskutil unmountDisk /dev/disk1

También la experiencia nos enseña que si leemos el disco original en formato RAW, es una lectura mas rápida. Por tal motivo reemplazamos el “disk1” por “rdisk1”

Quedándonos este comando:

$sudo dd if=’/dev/rdisk1′ of=’copiaRasp.img’ bs=1m

Una vez que tenemos nuestra imagen copiada, lo cual tarda un tiempo proporcional a la velocidad de lectura de nuestra tarjeta SD y al tamaño de esta.

Nota: Con este comando la imagen generada tendrá el mismo tamaño que el tamaño de la SD, porque copia todo el disco.

Procederemos a quitar la tarjeta SD y poner la nueva, y ejecutamos el comando de forma inversa.

Verificamos el “device” asignado a nuestra tarjeta SD, en la mayoría de los casos como quitamos una y conectamos otra el numero de device será el mismo. Para otros casos no, y por eso mejor verificamos esto con el comando anteriormente mencionado “df -k o diskutil list”

Cuando tenemos seguridad del numero del device ejecutaremos el comando. No antes, ya que este paso y el comando DD ejecutado como ROOT, son una herramienta muy poderosa, y puede eliminarnos un disco en segundos.
Verificamos nuevamente que el device sea el correcto y si es necesario, una vez mas. Nada es suficiente para cuidar nuestro ordenador.

$sudo dd if=’copiaRasp.img’ of=’/dev/rdisk1′ bs=1m

La escritura siempre toma mas tiempo, y necesitamos paciencia.

Ahora mejorando lo anterior, podemos aprovechar el espacio y reducir el archivo de backup podemos comprimir la imagen con “gzip”, este comando elimina todo el espacio en blanco de la tarjeta y comprime estos espacios.
Por ejemplo si tenemos “0000000000” el comando gzip comprime en “10*0”, es una forma de explicarlo.

Para comprimirlo podemos hacerlo todo en el mismo comando, por ejemplo utilizando “|”

sudo dd if=/dev/rdisk1 bs=1m | gzip > copiaRasp.gz

Y para copiar la imagen a la nueva tarjeta SD

gzip -dc ~/Desktop/pi.gz | sudo dd of=/dev/rdisk1 bs=1m

Os recomiendo utilizar este ultimo comando, ya que se aprovecha mucho mejor el espacio y la imagen no depende del tamaño de la SD original sino de los programas que tengamos instalados.
En mi caso, el primer comando resulto una imagen de 8GB, porque la tarjeta tenia este tamaño, y el segundo comando resulto una imagen de 4,3GB porque los datos ocupaban eso.

Saludos.

Leave a Reply

Your email address will not be published. Required fields are marked *


Mi perfil de Google Plus

Visitas

Mis FOTOS

[slickr-flickr]