Backapear sistemas de archivos completos usando tuberias

Backapear sistemas de archivos completos usando tuberías
con cpio, bunzip2 , grep y split

Autor: Alejandro
Rozza



Por qué?


Es una forma simpática de usar cpio, bunzip2 , grep y split para
backapear tu GNU/Linux, HURD o cualquier unix similar. Tiene la
ventaja de que el backup es independiente del tipo de filesystem,
partición o disco rígido.
Usando cpio+bunzip2+grep+split tepermite restablecer el backup en una
partición distinta de la
original (la que usaste para generar el backups), podrá ser
de distinto tamaño, distinto formato
(ext2,ext3,reiserfs,etc,umsdos, etc) o ser un subárbol
distinto, por ejemplo para hacer un entorno GNU/Linux con chroot.


También se puede excluir directorios al hacer el backups
usando grep y con splt los archivos de backup serán de un
tamaño fijo. Esto es una ventaja sobre programas
como partimage donde las posibilidades de elegir destinos en donde
restablecer el
backups quedan ligados al formato y tamaño de la partición
que se uso para generar el backup.


Alcance del Articulo

La
idea de este articulo no es explicar detalladamente cada comando, ni
porque usar esta forma de backapear tu GNU/Linux. Simplemente es la
forma que llevo haciendo los backup desde hace tiempo, funciona para
mi y espero que funcione para vos.

No describiré cada opción
de los comandos, para ello están los man, solo describiere
algunas opciones junto con algunos comentarios.



Por qué usar cpio,bunzip2, grep y split?


cpio: Es portable y define un checksum (crc)

bunzip2: Se puede usar otroprograma de compresión (compres,gzip),
pero bunzip2
permitirte recuperar (bzip2recover) datos de un archivo dañado.


grep: Se usa para excluir los
directorios al realizar el backup, se pude usar perl o pyton :)


split: Para usarlo no tengo
ninguna razón, talvez sea que es multiplataforma (se puede
usar cp del msdos para unir las partes del archivo), pero
probablemente sea que es el único que conozco que fragmenta
archivos.. :)





Comencemos con el backup


Primero hay que crear un archivo
llamado /excluirDirectorios.txt que contendrá en cada línea
una expresión grep que concuerde con un directorio o archivo
que se desee excluir.

cat > /excluirDirectorios.txt 
^/cdrom
^/floppy
^/mnt/C
^/mnt/D
^/mnt/cdrw
^/mnt/hda1
^/mnt/hdc1
^/mnt/hdc7
^/home/lost+found
^/home
^/tmp
^/root/.mozilla/firefox/cyu2b861.default/Cache
^/root/.opera/cache4   
^/var/cache/apt/archives
^/proc
^/sys
^/usr/src/MisCompilaciones

Este archivo se usa para filtrar la
salida de comando find, por lo tanto debes definir una expresión
regular y colocarla en el archivo para todas las líneas
generadas por find que no quieres backapear.

En el ejemplo excluirDirectorios.txt
excluye subárboles de /mnt, porque al usar ' # find / ' no
quiero backapear las particiones hda1, hdc1 y hdc7 como tampoco la
partición /home, ni los archivos .deb que estan el cache del
apt-get. También excluiré las particiones /proc y
/sys.

Otra ventaja de hacer un backups a
nivel del árbol raíz, es que no hay que preocuparse de
las particiones que están montadas en el árbol. Por
ejemplo yo tengo particiones para /var y /usr pero no me preocupo
por ellas, simplemente se backapean transparentemente (con
herramientas como partimage hay que backapearlas por separado).

Recomendaciones


  • Nocoloques '/' al final de una linea, porque te dejara los directorios
    padres.
  • Tampoco coloques lineas vacías porque las interpreta como un
    comodín (*).
  • Es bueno
    colocar un '^' al principio de las lineas para asegurarte de excluir
    los directorios o archivos correctos.
  • No olvides
    de colocar caracteres de escape ( “” ) para los
    símbolos que están reservados para las expresiones
    regulares (^/home/lost+found)



Al fin, la Tubería

 # find / -print0 -depth | grep -zZEvf /excluirDirectorios.txt | cpio -o -0-vV -H crc | bunzip2 -cz9 | split -b680m - /mnt/D/IntanciaDebian/Debian_raiz_unafecha.cpio.bz2.split.

Esta tubería genera archivos
Debian_raiz_unafecha.cpio.bz2.split.* de tamaño 680MB, ellos contienen
el backup.

Yo uso un
tamaño de 680MB para grabarlos en un cdrom de 700MB, pero se
le puede poner cualquier tamaño.

El backups generado no contendrá los directorios o archivos
definidos en /excluirDirectorios.txt y se podrá restablecer
una parte
de este o todo completo.


Con esto ya
tenemos nuestro backup totalmente flexible, ahora podes dejar de
usar partimage para backapear tu GNU/Linux y usarlo para el windows
en desuso que tienes por ahí.

Recomendaciones:

Si sos paranoico puedes generar
el backups booteando desde tu live-cd favorito, yo normalmente lo
realizo en modo single-user, pero
si confías plenamente en tu Debian puedes correrlo mientras
escuchas tus .Ogg preferidos y navegando por esDebian.org (en teoría
no debería haber grandes problemas, eso creo...)

Testear el Backup

# cat Debian_raiz_unafecha.cpio.bz2.split.* | bunzip2 -cd | cpio -it

Siempre es
bueno probar un backup después de crearlo y antes que sea
realmente necesario :), esto no es una gran prueba pero peor es no
hacer nada..



Recuperar el backup

# cd PathDestino
# cat Debian_raiz_unafecha.cpio.bz2.split.* | bunzip2 -cd | cpio -id -H crc -m -v --no-absolute-filenames

El PathDestino es donde se debe restablecer el backups, este puede ser cualquier subárbol del árbol de GNU/linux.
Esta es la parte en donde usar cpio+bunzip2+grep+split permite una alta flexibilidad, PathDestino puede ser una partición con un filesystem o tamaño distinto a la partición original. Actualmente tengo un entorno GNU/Linux con chroot creado de esta forma.
También se puede recuperar un archivo o directorio en particular del backup, ver apendice


Asegúrate que todo sea perfecto en un futuro

Una buena practica es firmar con una función hash los archivos del backup, para poder al momento de restablecer el backup verificar sus firmas, con esto te aseguras de estar restableciendo archivos correctos (una lectora defectuosa o un windows puede copiar un archivo y no indicar falla de crc).

 # ls -1 Debian_raiz_unafecha.cpio.bz2.split.* | xargs sha1sum > Debian_raiz_unafecha.cpio.bz2.split.sha1sum

lo verificas con:

 # sha1sum -c Debian_raiz_unafecha.cpio.bz2.split.sha1sum

Yo soy un poco mas “paranoico” y genero códigos hash a todos los
archivos antes de realizar el backups. (ver Apéndice )


Notas del autor:

En esta sección debería
haber una reflexión (de un par de lineas) interesante y
profunda que produzca una buena impresión, lo siento.... No
hay ninguna (no me gusta dar buenas impresiones) flaco@esdebian.org



Apéndice


-print0, -z, -Z, -0:
No olvides alguna de estas
opciones, porque tendras problemas con archivos o directorios que
contengan símbolos raros o espacios.


--no-absolute-filename:

Es opción
es muy importante, hace que la extracción sea relativa al
pathDestino. Si te la olvidas puedes llegar a sobrescribir archivos
de árbol del GNU/linux que estas ejecutando al momento de
restablecer el backup.


Realizar el backup con carga de trabajo: Creo que no debería haber problemas, puede aparecer
inconsistencias con archivos abiertos pero como los archivos que nos
interesan al backapear un filesystem raíz no se modifican
amenudo, no debería haber problemas. Si conoces alguna razón
para no hacer un backup con carga de trabajo, seria bueno que lo
comentes.

Verificar los archivos luego de recuperados: Una ves me paso recuperar un backup y notar que el archivo /bin/tar
no tenia asignado los permisos de ejecución, luego de
asignarcelos e al intentar ejecutar el programa este producia un
dump. Recupere de nuevo el directorio /bin, verifique el valor hash
del archivo y me dio correcto. La razón de tener un /bin/tar
defectuoso nunca la pude descubrir, pero eso me enseño a ser
un poco mas paranoico :)

Recuperar un archivo o directorio:
Puedes recuperar el directorio /root con:

# cpio -idv "root*" 

Investiga como hacerlo sobre una tubería y nos cuentas a todos...