Esta página puede ser redistribuida libremente bajo los términos de la licencia GPL. Vease ( GPL texto original ) o si lo prefiere (Traducción española no oficial de la GPL) Al margen de las obligaciones legales que se derivan del uso de esta licencia rogamos sea respetada la referencia a su lugar de publicación original www.ciberdroide.com. y a su autor original Antonio Castro Snurmacher (Madrid 01/01/2000).

Ausencia de Garantía

Esta ausencia de garantía se hace extensa a cualquier tipo de uso de este material y muy especialmente a las prácticas, ejercicios, y de ejemplos que encuentre en estas páginas. Deberá trabajar siempre salvo indicación contraria con un SO Linux y con un usario distinto de 'root' sin privilegios especiales. Como directorio de trabajo se procurará usar el directorio '/tmp' o algún otro que no contenga información valiosa. Tampoco se considera buena idea practicar en una máquina que contenga información valiosa.

Todo esto son recomendaciones de prudencia. En cualquier caso si algo sale mal toda la responsabilidad será únicamente suya. En ningún caso podrá reclamar a nadie por daños y perjuicios derivados del uso de este material. Para más información lea el contenido de la licencia GPL y abstengase de hacer prácticas si no está dispuesto a asumir toda la responsabilidad.

COPIAS DE SEGURIDAD

/ = = = = = = = = = = = = = = = /

Porque dedicamos un capítulo completo a esto.
Este capítulo trata de las Copias de Seguridad, también llamados respaldos o en inglés Backups y vamos en primer lugar a justificar la razón de dedicar un amplio capítulo a este tema que podría parecer más apropiado para un curso de administración.

Evidentemente garantizar la integridad de la información de un sistema es un tema que es de responsabilidad del administrador del sistema pero, como ya hemos mencionado anteriormente, el objetivo de esta segunda parte del curso incluye las nociones más necesarias para administrar su propio ordenador personal con Linux. El objetivo es que sea autosuficiente.

La seguridad frente a ataques intencionados queda fuera de los propósitos de este curso pero no hay daño que no pueda ser reparado si tenemos una copia de seguridad de toda la información que nos interesa.

Un buen sistema de respaldo es la mejor forma de evitar perdidas de información. Estas deben ser prevenidas dentro de lo posible pero dependiendo de las causas no siempre resulta posible hacerlo.

Las posibles causas para una perdida de información son:

La peor de todas es el borrado accidental por parte de un usuario autorizado, porque es totalmente imposible de prevenir.

Algo puede hacerse. Por ejemplo en Linux hay sustitutos para el comando 'rm' que dejarán los ficheros borrados en una papelera. También se pueden seguir ciertas recomendaciones de prudencia que minimicen los riesgos mediante determinadas prácticas pero siempre cabrá la posibilidad de un fallo humano. El tema es amplísimo y nos vamos a limitar a tratar solo de Respaldos o Copias de seguridad.

/ = = = = = = = = = = = = = = = /

Borrado accidental de ficheros.
Debe saber que la operación normal de borrado no destruye toda la información de los ficheros. Si alguna vez borra algo muy importante en un sistema de ficheros y no tiene copia de seguridad. Deberá evitar volver a trabajar sobre ese sistema de ficheros en modo lectura-escritura. Por el contrario deberá montar ese sistema de ficheros en modo solo-lectura y confiar en que quede algo recuperable en algún lado. Hay programas que pueden ayudar en estas situaciones siempre que la información no esté machacada con posteriores operaciones de escritura sobre esa partición. Si no sabe que hacer no haga nada y pregunte antes de intentar cosas que podrían destruir definitivamente toda la información. Este tipo de recuperaciones son solo un último recurso y las posibilidades de éxito no son muy grandes.

Una cosa que se puede intentar en modo read-only (solo-lectura) es leer directamente del dispositivo intentando filtrar cadenas de ficheros presentes en los ficheros borrados. Por ejemplo usando grep. Si las cadenas aparecen es señal de que no se ha destruido toda la información.

/ = = = = = = = = = = = = = = = /

Características de un buen sistema de respaldo.
Un sistema de respaldo debe de estar perfectamente planificado. Su planificación de forma automática no siempre es posible debido a que requieren con frecuencia intervención humana. Especialmente la copias que no caben en una sola cinta (multivolumen). Lo ideal es organizar su propio sistema de respaldo en función de las necesidades de su sistema. En un sistema es conveniente clasificar las diferentes partes de la información atendiendo a su importancia. Lo ideal sería hacer respaldo de todo regularmente manteniendo distintas copias en rotación. Es decir si tenemos tres cintas para almacenar respaldos (Cinta A, Cinta B, y Cinta C) deberemos ir grabando siguiendo una secuencia circular A, B, C, A, B, C,... La frecuencia de los respaldos se determina en función de lo importante que sean los datos. Generalmente es bueno hacer una copia diaria al menos de la parte del sistema que suponga mayor perdida de horas de trabajo en caso de incidente. De todas formas hay que tener en cuenta que este sistema solo nos permite mantener copia de los últimos tres o cuatro días. Esto no es suficiente porque muchas veces nos interesa recuperar una información de hace una semana, un mes, o incluso más tiempo. Por ello algunas veces se usan rotaciones de siete cintas (una para cada día de la semana) y una vez al mes se saca otra copia en una cinta distinta que se conserva por un espacio de tiempo más largo según convenga.

Una práctica común es guardar regularmente copias en otro edifico distinto para protegerse de esa forma de incendios, inundaciones, terremotos, robos. Si después de un desastre conservamos los datos vitales de nuestro negocio quizás podamos resurgir de nuestras cenizas más tarde.

Algunas veces no es posible hacer demasiadas copias de todo el sistema con demasiada frecuencia. Por ello se pueden delimitar areas con distinto grado de necesidad de respaldo. El sistema operativo y las aplicaciones no suelen variar y pueden ser recuperadas desde CDs de instalación. Es importante siempre mantener copias de todo el sistema. En cualquier caso siempre ha de usarse rotación de cintas porque usar una sola copia es muy arriesgado.

Las cintas son razonablemente seguras pero se pueden romper con el uso. De todas formas es importante que la planificación de respaldo del sistema no resulte complicada. Trabajar con demasiados conjuntos de cintas distintos no es bueno.

En la copia general de todo el sistema seguramente se guardarán cosas que varían poco pero que quizás costaron mucho trabajo configurar. Por tanto es una copia que no necesita hacerse con frecuencia pero deberemos disponer siempre de algunas copias en buen estado aunque no sean muy recientes.

Todas las copias deben ser sometidas de forma automática a un proceso de verificación que en el caso más sencillo consiste en leer la lista de ficheros que contiene. No es muy fiable pero al menos detectaremos los fallos más importantes. En el mejor de los casos la comprobación se hace sobre el contenido completo comparándolo con el original. En este caso cuando la copia termina el original puede haber cambiado y por ello la detección de diferencias entre original y copia puede deberse a un cambio en el original en lugar de un error en la copia.

Una cosa que se usa mucho son las copias globales combinadas con posteriores copias incrementales. Es un sistema cuya principal ventaja es la comodidad.

Copia incremental significa que solo salvamos lo último que ha cambiado desde la última copia global. Por eso cada nueva copia incremental resulta generalmente de mayor tamaño que la anterior.

Si la copia global ocupa varias cintas. Podemos hacer copias incrementales hasta que debido a su progresivo aumento de ocupación no quepan en una sola cinta por ejemplo, momento en el que se puede hacer una nueva copia global. En general podemos hacer una nueva copia global cuando la incremental empiece a resultar incomoda debido a su progresivo aumento de tamaño.

Este sistema de copia hace recaer demasiada responsabilidad en una sola cinta. La última copia global suele ser muy voluminosa y puede contener información que no se encuentre en ninguna otra cinta.

Hay actividades que pueden generar enormes ficheros de datos y eso incrementará mucho la ocupación de nuestra siguiente copia incremental. Por ejemplo si estamos generando una imagen animada de gran tamaño o si estamos descargado de Internet imágenes de CDs enteras deberíamos guardar esos datos en un sistema de ficheros especialmente dedicado a ello. De esta forma cuando hagamos respaldo podemos desmontar antes esa partición para poder realizar respaldos independientes con la frecuencia que convenga en cada caso.

Siempre que se añadan paquetes, aplicaciones, se configure algo conviene volver a sacar una nueva copia global de todo el sistema.

/ = = = = = = = = = = = = = = = /

Los soportes de la información
El soporte más adecuado son las cintas. Es un sistema que supone un fuerte desembolso inicial pero a la larga resulta más rentable y más seguro que los demás. Además cuando cambiemos de ordenador podremos conservarlo.

En cualquier caso cada cinta debe de estar perfectamente etiquetada (Identificador clave de la cinta, Tipo de copia, máquina, contenido, formato, periodicidad, etc...)

Después en un papel habrá que registrar cada copia realizada con identificador de la cinta y fecha de la copia que contiene.

Es muy importante tener un sistema bien pensado para que ofrezca el máximo de seguridad con el máximo de comodidad. Hay que establecer un buen plan que deberá convertirse en una rutina de trabajo. Considere la incomodidad como un gravísimo peligro porque puede derivar en incumplimiento de esa importante obligación.

El día que no cumplamos nuestra obligación de hacer copia de respaldo será el día que el sistema elija para darle un disgusto (ley de Murphy). Para resultar cómodo debemos automatizar con scripts nuestro sistema de respaldo y las copias no deben tardar más de lo necesario.

Los discos duros extraibles son una buena alternativa para sistemas caseros. Lo que no tiene ningún sentido es hacer copias de seguridad en el mismo disco duro que contiene los datos aunque se utilice una partición diferente. Recuerde que los discos duros pueden perder toda su información de forma repentina.

Para guardar datos de interés histórico que deban conservarse durante años suele ser muy interesante usar CDs.

Los disquetes son un medio muy poco fiable y cabe poca cosa.

/ = = = = = = = = = = = = = = = /

Respaldo por partes
Antes que nada debe plantearse si realmente necesita hacer respaldo por partes. Recuerde que no conviene complicar mucho el plan de respaldo y no hay nada más sencillo que hacer respaldo de todo de una vez siempre que el tamaño de los datos lo permitan.

Para determinar la necesidad de respaldo de las partes del sistema conviene que repase la lección de 'Sistema de Ficheros III' Concretamente el párrafo dedicado a la 'Estructura estándar del sistema de ficheros de Linux'. Esto le ayudará a comprender la naturaleza de los datos en las distintas partes del sistema.

Recuerde que pueden existir variaciones, en función de cada distribución.

Cada sistema dependiendo de la actividad a la que sea dedicado tendrá unas necesidades totalmente especiales de respaldo.

Las partes de mayor interés con vistas a respaldos frecuentes suelen ser /home/ , /root/, y /usr/local/ En algunos casos /var/log o un directorio que contenga una base de datos pueden ser muy importantes pero eso son cosas que cada cual debe determinar. Si lo importante ocupa más del 50% del sistema lo más sencillo sería por copias globales e incrementales de todo el sistema, pero en un ordenador de uso personal con gran cantidad de paquetes instalados la parte importante a la hora de hacer respaldo no suele ser tan grande.

La parte más variable del sistema está en /var/ y concretamente en /var/log es donde se registran los logs del sistema que son ficheros que informan de todo tipo de cosas que van sucediendo en el mismo. En algunos sistemas estos logs tienen una importancia mayor que en otros. Por ejemplo si existe alguna aplicación que toma estos logs para elaborar estadísticas. En otros sistemas no resultará demasiado crítico que la última copia de /var/ no sea muy reciente pero que exista al menos una copia si es fundamental.

Hacer las cosas en un solo paso no es siempre buena idea. Lo principal es dar pasos que puedan deshacerse si nos equivocamos en algo, por eso siempre que sea posible conviene recuperar en un lugar distinto al original. Luego si todo ha ido bien podemos trasladar las cosas a su destino definitivo. Los que se preguntan para que tantas precauciones son los que más tarde se preguntarán así mismo cosas bastante lamentables. Cuando se pierde toda la información de un sistema tendremos que recuperarlo todo partiendo de los discos de instalación y de la copia.

/ = = = = = = = = = = = = = = = /

Programas de utilidad para realizar respaldos.
Para realizar copias de seguridad podemos usar aplicaciones completas pensadas para ello o fabricarnos algo a medida combinando una serie de utilidades de las cuales la mayoría ya han sido mencionadas alguna vez en capítulos anteriores. Esto último es lo que vamos a hacer nosotros porque así podrá diseñar algo personalizado y también porque resulta más didáctico.

Nosotros solo vamos describir todas estas utilidades de forma muy enfocada al uso que vamos a hacer de ellas. Puede usar el manual para consultar lo que no necesite.

Los programas más útiles son aquellos que sirven para empaquetar dentro de un solo fichero una gran cantidad de ficheros y directorios, como por ejemplo 'tar', 'cpio', y 'afio' pero de ellos hablaremos en el siguiente capítulo. Antes vamos a comentar otra serie de programas que pueden combinar con estos empaquetadores o que su uso puede ser interesante en tareas relacionadas con el respaldo.

find(1) Se usará para elaborar una lista de ficheros que deseamos salvar. Su versatilidad es enorme. La opción -newer resultará de especial interés en el caso de desear hacer copias incrementales. Observe que nosotros nos situaremos previamente en un directorio adecuado y luego usaremos 'find . ' para pasar a find nombres que empiezan con '.'. Es decir usaremos caminos relativos en lugar de caminos absolutos. Esto tiene su importancia porque de ese modo luego podremos recuperar la información situándola en otro lugar distinto al original si fuera necesario.

egrep(1) Se usa para intercalarlo entre la salida de 'find' y la entrada de 'cpio' de esa forma se aumenta la flexibilidad de uso. Se puede usar para incluir determinados ficheros que cumplan determinada expresión regular y/o para excluir determinados ficheros que cumplan determinada expresión regular. Para excluir se usa la opción -v.

gzip(1) Es el compresor de uso más frecuente en Linux. Esta muy probado y es muy fiable. Cuando se coloca un compresor como gzip o bzip2 a la salida de 'cpio' o de 'tar' se pierde la posibilidad de hacer copia multivolumen porque el compresor es el que está escribiendo en el dispositivo en lugar de hacerlo 'cpio' o 'tar'. Afortunadamente 'afio' si puede hacerlo.

bzip2(1) Es más eficiente en el sentido de que puede comprimir algo más pero a costa de tardar mucho más.

diff(1) Detecta diferencias de contenido entre dos ficheros. Especialmente adecuado para ficheros de texto.

md5sum(1) Permite asociar un código de comprobación al contenido de un fichero o dispositivo, etc..

dircomp(1) Permite comparar dos directorios analizando su contenido recursivamente.

dirdiff(1) Permite comparar dos directorios analizando su contenido recursivamente. Es más elaborado que el anterior.

mt(1) Es la utilidad que se usa para controlar las cintas magnéticas. Permite operaciones de rebobinado, retension, lectura de estado, etc.

dd(1) Sirve para copiar o leer dispositivos usando el tamaño de bloque que se desee. También permite realizar ciertas conversiones.

Por ejemplo para copiar un disquete:

$ dd if=/dev/fd0 of=fichero
$ dd of=/dev/fd0 if=fichero

touch(1) Sirve para actualizar la ficha de modificación de un fichero creándolo en caso de que no exista y se puede usar para guardar el instante en que se realiza una copia para luego tomar ese momento como referencia en copias incrementales.

Por ejemplo para modificar la fecha de modificación de un fichero ajustándola con la hora y fecha actual haríamos lo siguiente:

$ touch fichero

Para modificar la fecha de modificación de un fichero ajustándola con la fecha de ayer haríamos:

$ touch -t yesterday fichero

Para modificar la fecha de modificación de un fichero ajustándola con la misma fecha que la de un fichero de referencia haríamos:

$ touch -r fich_ref fichero

En todos los casos si el fichero no existe se creará con tamaño igual a cero.

tee(1) Permite bifurcar una salida en dos. De esa forma podemos guardar la lista de ficheros que estamos entregando a 'cpio' o a 'afio' con objeto de poder compararlas luego por ejemplo.

mount(1) Monta un sistema de ficheros.

umount(1) Desmonta un sistema de ficheros.

/ = = = = = = = = = = = = = = = /

Programas para empaquetar ficheros 'tar', 'cpio', y 'afio'
Vamos a ver ahora una serie de programas capaces de empaquetar varios ficheros en uno solo.

tar(1) Es similar a cpio en el sentido de que sirve tanto para salvar como para recuperar ficheros. La salida puede ser a dispositivo, fichero o a un proceso igual que cpio, pero no acepta por su entrada estándar una lista de ficheros. Hay que pasarlos como argumentos.

'tar' admite nombres de ficheros y directorios como argumentos. Los directorios serán tratados recursivamente. salvando y recuperando todo su contenido. En Linux 'tar' tiene opciones para obtener una salida ya comprimida. Para especificar el fichero o el dispositivo donde se guardará la copia se usa -f archivo.

En lugar de archivo se puede especificar un dispositivo (/dev/dispositivo) o también se puede usar entrada salida mediante '-f -'.

Para crear la copia se usa -c, para leer la lista de fichero se usa -t, y para extraer los fichero se usa -x. Se puede usar compresión con la opción -z.

Veamos algunos ejemplos:

$ # Salvar el directorio actual completo en 'fichero.tar'
$ tar -cf fichero.tar .

$ # Lista abreviada (solo nombres de ficheros) del contenido 
$ # de la copia 'fichero.tar'
$ tar -tf fichero.tar

$ # Lista detallada del contenido de la copia 'fichero.tar'
$ tar -tvf fichero.tar

$ # Extracción completa del contenido  de la copia 'fichero.tar'
$ tar -xf fichero.tar

cpio(1) Se puede usar para salvar o recuperar una serie de ficheros. Su salida puede ser enviada a un dispositivo a un fichero o a un compresor. La lista de ficheros de un paquete cpio puede obtenerse con la opción -t. Esta lista de ficheros solo incluye los nombres de los mismos. Guardando esta lista en un fichero, editándolo después de forma que eliminemos todos menos aquellos que queramos recuperar podremos usarlo para recuperar con la opción -i. La opción -t combinada con -v obtiene no solo los nombres sino también permisos, fechas tamaños de ficheros, etc.. Es decir 'cpio -t' actúa como un 'ls' y 'cpio -tv' actúa como 'ls -l'. La opción -d combinada con '-i' permite la creación de directorios'. La opción '-m' conserva la fecha de modificación de los ficheros. La fecha de modificación de los directorios no siempre se conserva pero no suele considerarse importante. Seguramente el propio 'cpio' al copiar ficheros dentro del directorio creado se provoca la alteración de esta fecha y la única forma de respetar la fecha de modificación de los directorios sería hacer una segunda pasada una vez que todos los ficheros estuvieran creados. Puede que alguna utilidad o alguna versión de cpio si lo haga. Si tiene dudas compruebelo. La opción '-p' de cpio permite copiar estructuras enteras desde un lugar a otro. La recuperación de ficheros con cpio admite uso de patrones. Es interesante comprobar que aquí el operador '*' también expandirá caracteres '/' cosa que por ejemplo el bash y otros programas no hacen.

Algunos ejemplos sencillos:

$ #Salvar un fichero
$ echo fichero | cpio -o > fich.cpio

$ #Salvar varios ficheros 
$ cpio -o > fich.cpio < cat lista_ficheros'

$ #Lista detallada de los ficheros contenidos en la copia
$ cpio -itvc < fich.cpio

$ #Recuperacion de los ficheros creando directorios cuando sea
$ #necesario (-d) y conservando la fecha de modificación los ficheros
cpio -ivcdm < fich.cpio

Para usar un dispositivo en lugar de un fichero bastaría con sustituir en el ejemplo 'fich.cpio' por '/dev/dispositivo'.

Para evitar conflictos en sistemas de ficheros con número de inodos elevado se usa la opción (-H newc). Recomendamos que la use siempre.

La opcion -B usará bloques de 5120 bytes en lugar de bloques de 512 bytes.

Vamos a usar esta opción en los siguientes ejemplos y además usaremos entrada salida a cinta con compresión de datos.

$ # Salvar todo el rabol de directorios desde el directorio actual
$ # en formato comprimido.
$ find . | cpio -ovBH newc | gzip > /dev/st0

$ # Listado detallado del contenido de la copia
$ gzip -d < /dev/st0 | cpio -itvBH newc

$ # Guardar listado sencillo (solo nombres de ficheros) en
$ # el fichero 'contenido.txt'
$ gzip -d < /dev/st0 | cpio -itBH newc  > contenido.txt

$ # Suponemos que editamos el fichero anterior 'contenido.txt'
$ # y dejamos solo aquellos ficheros que deseamos recuperar en
$ # el fichero 'selección'. 
$ # Recuperamos de la siguiente forma:
$ gzip -d < /dev/st0 | cpio -ivudmBH newc `cat seleccion`

Con la opcion -p podemos copiar todo el contenido de un directorio a otro directamente sin pasar por una salida intermedia empaquetada en formato 'cpio'. Esto es muy util para trasladar directorios enteros.

$ cd $DIR_ORIGEN
$ find . | cpio -pdm $DIR_DESTINO

afio(1) Es una interesantísima variación de cpio. Tiene entre otras cosas la posibilidad de comprimir los ficheros de uno en uno. Esto le proporciona mayor seguridad, ya que una copia de cpio o de tar comprimida tiene el grave problema de que en caso de un pequeño error en la copia, toda la copia queda inutilizada. Con afio solo quedará dañado el fichero donde ocurra en error. Además con 'afio' es posible hacer copias multivolumen comprimidas. 'afio' reconoce las extensiones de aquellos ficheros que no interesa comprimir por que ya lo están: (.Z .z .gz .bz2 .tgz .arc .zip .rar .lzh .lha .uc2 .tpz .taz .tgz .rpm .zoo .deb .gif .jpeg .jpg .tif .tiff y .png). Una ventaja más de 'afio' es que permite verificar la copia con el original. (Opción -r)

Para hacer pruebas con 'afio' situese en el directorio /tmp. Genere algunos ficheros grandes para poder hacer luego pruebas de copias de seguridad usando disquetes. Por ejemplo para generar un fichero de 2Mbytes de perfecta basura puede usar lo siguiente:

$ cd /tmp
$ mkdir pruebafio
$ cd pruebafio
$ echo 1 > fich1
$ gzip --fast < /dev/zero | head --bytes=2m  > fich2 
$ echo 3 > fich3
$ mkdir dir1
$ echo 4 > dir1/file4
$ cp fich2 fich5.gz
$ ls -lR

.:
total 4116
drwxr-xr-x    2 root     root         4096 abr  8 13:06 dir1
-rw-r--r--    1 root     root            2 abr  8 13:05 fich1
-rw-r--r--    1 root     root      2097152 abr  8 13:05 fich2
-rw-r--r--    1 root     root            2 abr  8 13:06 fich3
-rw-r--r--    1 root     root      2097152 abr  8 13:33 fich5.gz

./dir1:
total 4
-rw-r--r--    1 root     root            2 abr  8 13:06 file4

Bueno con esto tenemos una estructura de ficheros para hacer pruebas. Vamos a hacer pruebas de copias multivolumen comprimidas que son las más interesantes y usaremos disquetes de 1.44Mbytes. Ya hemos dicho que los disquetes no son fiables pero su pequeño tamaño lo hace ideal para hacer pruebas de copias multivolumen. Para usar disquetes conviene usar el parámetro -F.

Entre otras cosas advierta que tenemos dos ficheros idénticos 'fich2' y 'fich5.gz' que admiten una compresión mejor que la realizada con la opción --fast de gzip. Pero uno de ellos será reconocido como fichero comprimido y se guardará tal cual está y el otro será comprimido. (Por cierto de forma espectacular).

Formatee un par de disquetes de 1.44MBytes con 'mformat a:'

Compruebe que se encuentra en /tmp/pruebafio y ejecute los comandos siguientes:


$ # Para salvar a disquete multivolumen comprimido
$ find . | afio -o -v -s 1440k -F -Z /dev/fd0

. -- okay
fich1 -- okay
fich5.gz -- okay
fich3 -- okay
dir1 -- okay
dir1/file4 -- okay
fich2.z -- (00%)
afio: "/dev/fd0" [offset 2m+7k+0]: Next disk needed
afio: Ready for disk 2 on /dev/fd0
afio: "quit" to abort,"f" to format, anything else to proceed. >
afio: "/dev/fd0" [offset 2m+7k+0]: Continuing


$ # Alteramos el original de fich3 en disco
$ echo jjjjj > fich3
$ #
$ # Volver a colocar el primer disquete de la copia
$ # Para comprobar con el original una copia comprimida en varios disquetes 
$ afio -r -v -s 1440k -F -Z /dev/fd0

drwxr-xr-x  1 root     root              Apr  8 13:33:23 2001 .
-rw-r--r--  1 root     root            2 Apr  8 13:05:24 2001 fich1
-rw-r--r--  1 root     root      2097152 Apr  8 13:33:11 2001 fich5.gz
afio: "/dev/fd0" [offset 1m+416k+0]: Input limit reached
afio: Ready for disk 2 on /dev/fd0
afio: "quit" to abort,"f" to format, anything else to proceed. >
afio: "/dev/fd0" [offset 1m+416k+0]: Continuing
-rw-r--r--  1 root     root            2 Apr  8 13:06:00 2001 fich3
afio: "fich3": Corrupt archive data
drwxr-xr-x  1 root     root              Apr  8 13:06:18 2001 dir1
-rw-r--r--  1 root     root            2 Apr  8 13:06:18 2001 dir1/file4
-rw-r--r--  1 root     root         4939 Apr  8 13:05:48 2001 fich2 -- compressed

$ # Volver a colocar el primer disquete de la copia
$ # Para obtener la lista de ficheros de una copia comprimida en disquete 
$ afio -t -v -s 1440k -F -Z /dev/fd0

drwxr-xr-x  1 root     root              Apr  8 13:33:23 2001 .
-rw-r--r--  1 root     root            2 Apr  8 13:05:24 2001 fich1
-rw-r--r--  1 root     root      2097152 Apr  8 13:33:11 2001 fich5.gz
afio: "/dev/fd0" [offset 1m+416k+0]: Input limit reached
afio: Ready for disk 2 on /dev/fd0
afio: "quit" to abort,"f" to format, anything else to proceed. >
afio: "/dev/fd0" [offset 1m+416k+0]: Continuing
-rw-r--r--  1 root     root            2 Apr  8 13:06:00 2001 fich3
drwxr-xr-x  1 root     root              Apr  8 13:06:18 2001 dir1
-rw-r--r--  1 root     root            2 Apr  8 13:06:18 2001 dir1/file4
-rw-r--r--  1 root     root         4939 Apr  8 13:05:48 2001 fich2 -- compressed


$ # Creamos un segundo directorio y nos situamos en el
$ mkdir ../pruebafio2
$ cd ../pruebafio2
$ #
$ # Para recuperar una copia comprimida en disquete
$ # Volver a colocar el primer disquete de la copia
$ afio -i -v -s 1440k -F -Z /dev/fd0

. -- okay
fich1 -- okay
afio: "/dev/fd0" [offset 1m+416k+0]: Input limit reached
afio: Ready for disk 2 on /dev/fd0
afio: "quit" to abort,"f" to format, anything else to proceed. >
afio: "/dev/fd0" [offset 1m+416k+0]: Continuing
fich5.gz -- okay
fich3 -- okay
dir1 -- okay
dir1/file4 -- okay
fich2 -- uncompressed

$ # Vamos a comparar los dos directorios
$ cd ..
$ dircomp pruebafio pruebafio2

< 3241346245 6 ./fich3
> 4164007125 2 ./fich3

$ #
$ # Un análisis más detallado de las diferencias de ambos directorios
$ # Se puede hacer con dirdiff
$ dirdiff pruebafio pruebafio2
2 d d - > =
2 d d - > =  dir1
= r r = = =  dir1/file4
= r r = = =  fich1
= r r = = =  fich2
1 r r X < =  fich3
= r r = = =  fich5.gz
^ ^ ^ ^ ^ ^
| | | | |  \__ POG
| | | |  \____ DAT
| | |  \______ CKS
| |  \________ FI2
|  \__________ FI1
 \____________ FI2


$ # Para comprobar dos ficheros podemos usar md5sum
$ md5sum pruebafio/fich1 pruebafio2/fich1 pruebafio/fich3 pruebafio2/fich3

md5sum pruebafio/fich1 pruebafio2/fich1 pruebafio/fich3 pruebafio2/fich3
b026324c6904b2a9cb4b88d6d61c81d1  pruebafio/fich1
b026324c6904b2a9cb4b88d6d61c81d1  pruebafio2/fich1
75894c2b3d5c3b78372af63694cdc659  pruebafio/fich3
6d7fce9fee471194aa8b5b6e47267f03  pruebafio2/fich3

Las páginas man de 'afio' contienen algunos ejemplos interesantes. Por ejemplo viene como hacer una copia sobre una unidad de cdrom.

find . | afio -o -b 2048 -s325000x -v '!cdrecord .. -'

Sin duda alguna afio es un excelente programa para sus respaldos y le recomendamos que lo ponga a prueba y se familiarice con él.

Resumiendo Conviene conocer tanto 'cpio' como 'tar' porque son dos clásicos de los sistemas operativos tipo Unix y ambos son muy utilizados. Cada uno tiene sus ventajas y sus inconvenientes. Por otra parte 'afio' es mucho más reciente y por lo tanto su uso no es tan amplio, pero eso podría cambiar en un futuro gracias a sus indudables mejoras técnicas respecto a los dos clásicos antes mencionados.

El único motivo que se me ocurre por el cual se podría desaconsejar el uso de 'afio' es por temas de portabilidad entre distintas máquinas, con distintos SO. En ese caso para garantizar que la copia tenga un formato lo más universal posible, lo recomendable sería usar 'tar' sin compresión, pero eso no justifica dejar de usar 'afio' para las copias de seguridad rutinarias renunciando a sus indudables ventajas.

Observe que la salida de información siempre que resulta posible se hace a salida estandar. En caso que se generen dos salida se usa la salida estandar como salida principal. La salida estandar de errores se usará como salida secundaria mezclada con posibles mensajes de error.

Concretamente la opción -t en 'tar' y 'cpio' entregan a salida estandar el resultado pero la opcion -o y la opción -v de 'cpio' juntas hacen que la salida de la copia se dirija a salida estandar y la lista de los ficheros se dirijirá entonces a la salida estandar de errores.

En cualquier caso las posibilidades de cualquiera de estos tres programas son muy variadas. Es imprescindible acudir va las páginas man de cada uno de ellos para tener una visión completa de sus posibilidades. Nosotros nos hemos limitado explicar con ayuda de ejemplos algunas de sus posibilidades.

/ = = = = = = = = = = = = = = = /

Un programa completo kbackup(1)
Es un programa muy completo para hacer backups. Es 100% libre (Licencia Artistic) y está escrito en lenguaje shell-script. La interfaz de usuario a base de un completo sistema de menús está programado haciendo uso de 'dialog'. Permite usar encriptación pgp. Compresión mediante doble buffering para para optimizar la escritura en cintas y como herramienta de empaquetado de ficheros usa 'afio' o 'tar' según convenga.

Es altamente configurable y versátil.

Permite almacenar distintas configuraciones para distintos tipos de copias.

Si no quiere realizar un sistema a su medida, puede usar 'kbackup' para sus copias.

/ = = = = = = = = = = = = = = = /

Recuperación total desde cero
Muchas veces tener un disquete o CDROM de rescate con las herramientas necesarias simplifica mucho las cosas. Realmente todo podría resultar tan sencillo como arrancar con ese sistema de rescate y recuperar la cinta sobre el sistema de ficheros adecuadamente montado.

Si usa programas específicos como 'kbacup' deberá investigar la forma de recuperar una copia de 'kbacup' sin usar 'kbacup'. En su defecto debería tener un disquete o cdrom de rescate (autoarrancable) que contenga 'kbackup'.

Las copias de kbacup pueden ser manejadas por 'afio' o 'tar'. Por ejemplo en caso de perdida de todo el sistema quizás no tengamos forma de hacer funcionar 'kbackup' pero si 'tar' o 'cpio'. En este caso es importante saber que las copias de 'kbacup' escriben en primer lugar un fichero de cabecera que incluye información sobre el formato que se uso para esa copia.

En cualquier caso debe de tener claro cual será la recuperación de una cinta de seguridad de todo el sistema desde cero, y si tiene posibilidades de hacer pruebas sin comprometer datos importantes hagalo. Use por ejemplo un segundo ordenador sin información importante.

/ = = = = = = = = = = = = = = = /

Copia usando dispositivo de cinta scsi.
El uso de todos los dispositivos de cinta SCSI es bastante similar. Lo usaremos como para nuestro ejemplo. Estos dispositivos tienen varios controladores y nos fijaremos ahora en dos de ellos.

/dev/st0 Dispositivo de cinta SCSI Con autorebobinado.
/dev/nst0 Dispositivo de cinta SCSI Sin autorebobinado.

El autorebobinado significa que el cierre del dispositivo provoca el rebobinado automático al principio de la cinta. Nosotros usaremos para la copia de seguridad /dev/st0 (Con auto rebobinado) Solo usaremos /dev/nst0 para rebobinado y retension de la cinta. El retensionado de la cinta es una operación muy necesaria y en principio el programa de ejemplo provocará siempre un retensionado de la cinta. Las cintas que no son retensionadas de vez en cuando puede llegar a romperse o atascarse.

Los controles que vamos a usar sobre la cinta son:

mt -f /dev/nst0 rewind
mt -f /dev/nst0 retension
mt -f /dev/st0 status

Los dos primeros ya han sido mencionados y el último proporciona información sobre el estado de la cinta.

Vamos a proporcionar un script para hacer respaldos basado en el uso de afio. Deberá estudiarlo para adaptarlo a sus necesidades.

Está pensado para usar cintas scsi. Se puede adaptar fácilmente para otros dispositivos o para copia sobre fichero. Si esto no le gusta siempre puede usar un programa completo de backup como 'kbackup' y si le gusta pero lo encuentra incompleto puede encontrar solución a sus necesidades concretas inspeccionando el código de 'kbackup' que está escrito en shell-script.

Un programa de backup más que versátil ha de ser cómodo. Ya lo dijimos antes. El backup es una tarea rutinaria y muy importante. Interesa tener un sistema que permita meter la cinta, dar dos o tres teclazos y dejar que el resto lo haga el ordenador. De esa forma el día que estemos cansados no tendremos excusa para no hacer la copia.

Lo que viene a continuación es un ejemplo y los ejemplos han de ser sencillos, pero estamos seguros que le resultará muy fácil adaptarlo a su necesidades.

En este ejemplo nosotros excluimos /mnt porque es un directorio donde suponemos que hay montados dispositivos que no deben ser respaldados.

Para hacer un respaldo sobre un fichero conviene usar un disco distinto montado en un lugar que quede excluido de la copia. En nuestro ejemplo podríamos situar el fichero de respaldo dentro de /mnt.

Analice el script a conciencia. Acuda al manual on line para cada uno de los comandos que representen alguna duda y si a pesar de eso, algo sale mal insistimos en recordarle que toda la responsabilidad en el uso de esto o de cualquier otro material del curso es solo suya.


#!/bin/bash
#####################################################################
testTape(){
echo "## Inserte la cinta ${DATOS} ##"
echo ".... pulse <Intro> para continuar"
read
echo
mt -f /dev/nst0 rewind
mt -f /dev/st0 status
echo
afio -rvZ -b ${BLOCK} -s ${CAPCINTA} < /dev/st0  | more
}

#####################################################################
preparar(){
REF_INCR=""
if [ "$TIPO" = "I" ]
   then 
      REF_INCR=T_${DATOS}
fi
if [ "$TIPO" = "i" ]
   then 
      REF_INCR=I_${DATOS}
fi


T_DATOS=${TIPO}_${DATOS}
FECHA=`date +%y%b%d`
PREOUT="${BACKUP}/history/${FECHA}${T_DATOS}"
PRELAST="${BACKUP}/last/${T_DATOS}"
T_REF_INCR="${BACKUP}/last/${REF_INCR}.time"
FIFO3=/tmp/FIFO_salva_lst.$$
FIFO3OUT=${PREOUT}.lst

echo
echo '############ ' ${FECHA} ${T_DATOS} ' ############'
echo '--------------------------------------------------------------'
df
echo '--------------------------------------------------------------'
if [ "$TIPO" = "i" ] || [ "$TIPO" = "I" ]
   then 
      echo "Se recuperará información posterior a ..."
      ls -ld $T_REF_INCR | cut -c 42-
fi
echo
echo "desde=$DESDE, incluir=$INCLUIR, excluir=$EXCLUIR, datos=$DATOS"
echo "!! Compruebe que los dispositivos montados coinciden para $DATOS !!"
echo ".... pulse <Intro> para continuar"
read
echo "## Inserte la cinta. Asegurese que está desprotegida ##"
echo "....Espere a que esté lista y pulse <Intro> para continuar"
read
echo
mt -f /dev/nst0 rewind
mt -f /dev/st0 status
echo "Espere. Realizando prueba de escritura ...."
if ! echo "____ Prueba de grabacion OK ____" | blockout > /dev/st0
   then 
     echo  " !!! Imposible escribir !!!"
     exit
   else
     blockout < /dev/st0 
fi
mt -f /dev/nst0 rewind
echo
echo -e '\7\c' sleep 1
echo -e '\7\c' sleep 1
echo -e '\7\c' sleep 1
echo "## Compruebe estado de la cinta ##"
echo ".... pulse <Intro> para continuar"
read
}

#####################################################################
salva(){

RETENS="S"
clear
echo "############ !! Backup en marcha !! ############## $T_DATOS"
COMIENZO=`date` 
if [ "$RETENS" = "S" ]
   then
      echo "Retension de la cinta ............."
      mt -f /dev/nst0 retension
      sleep 5
fi
cd $DESDE
touch ${PRELAST}.time
chmod 400 ${PRELAST}.time
echo "Salidas en ${PREOUT}."

INI=`date "+%d %b %Y %r"`
echo "Grabando en cinta la copia de seguridad ............"

mknod --mode=600 $FIFO3 p
cut -b 3-  < $FIFO3 | egrep -v '^$' | sort  > $FIFO3OUT &
rm ${PRELAST}.lst 2> /dev/null
ln -s $FIFO3OUT ${PRELAST}.lst

### Comienza realmente la copia ##
if [ "$TIPO" = "T" ]
   then
      nice find .  -print | egrep -v $EXCLUIR | egrep $INCLUIR | \
      tee $FIFO3 | afio -ovZ -b ${BLOCK} -s ${CAPCINTA}  /dev/st0
   else
      nice find . -newer $T_REF_INCR -print  | egrep -v $EXCLUIR | \
      egrep $INCLUIR  | tee $FIFO3 | afio -ovZ -b ${BLOCK} \
      -s ${CAPCINTA} /dev/st0
fi
### Fin ###
FIN=`date "+%r"`
echo "$INI ======> $FIN"
mt -f /dev/st0 status
echo "Copia en cinta terminada ......."
echo "Iniciando comprobación ........."
afio -tZ  -b ${BLOCK} -s ${CAPCINTA} /dev/st0 | sort > ${PREOUT}.tape
diff  $FIFO3OUT ${PREOUT}.tape  > ${PREOUT}.diff
echo "******************************************************************"
echo "******************* F I N    B A C K U P *************************"
echo                                                          > ${PREOUT}.log
echo "******* ${PREOUT}.log "                                >> ${PREOUT}.log
echo "******* Comenzó  $COMIENZO"                            >> ${PREOUT}.log
echo "******* Finalizó `date`"                               >> ${PREOUT}.log
echo "******* Diferencias `cat ${PREOUT}.diff | wc -l` "     >> ${PREOUT}.log 
echo "******* DiferenciasHead `head -n 8 ${PREOUT}.diff` "   >> ${PREOUT}.log 
echo " ...."                                                 >> ${PREOUT}.log
echo "******* DiferenciasTail `tail -n 8 ${PREOUT}.diff` "   >> ${PREOUT}.log 
echo "bzip2  $FIFO3OUT ${PREOUT}.tape ${PREOUT}.diff"
      bzip2  $FIFO3OUT ${PREOUT}.tape ${PREOUT}.diff
echo "rm $FIFO3"
      rm $FIFO3 
echo "******************************************************************"
cat ${PREOUT}.log
echo "******************************************************************"
}

##(1)#######################################
salva_tmp(){
DESDE='/tmp'
INCLUIR=$INCLUIR_TODOS
EXCLUIR=$EXCLUIR_NINGUNO
DATOS="tmp"
preparar
salva
}

##(2)#######################################
salva_root(){
DESDE='/'
INCLUIR=$INCLUIR_TODOS
EXCLUIR="\.netscape/cache/|\/core$|^./tmp|^./proc|^./mnt|^./mount"
DATOS="root"
preparar
salva
}

##(3)#######################################
salva_home(){
DESDE='/home'
INCLUIR=$INCLUIR_TODOS
EXCLUIR=$EXCLUIR_NINGUNO
DATOS="home"
preparar
salva
}

########################################################################
################################ MAIN ##################################
########################################################################
CAPCINTA=3700m
BLOCK=10k
INCLUIR_TODOS="^."   
EXCLUIR_NINGUNO="^./tmp|^./proc"
BACKUP="/backup"
mkdir $BACKUP 2> /dev/null
mkdir ${BACKUP}/history 2> /dev/null 
mkdir ${BACKUP}/last 2> /dev/null 
cd ${BACKUP}/history
clear 
echo "################ BACKUP `date` ###############"
echo
ls -rt *.log
echo
sleep 2
RETRY=TRUE
while [ "$RETRY" != "FALSE" ]
do
   echo
   echo '0) Comprobar contenido de una cinta'
   echo '1) salva_tmp (/tmp)  para pruebas)'
   echo '2) salva_root (menos  /mnt y /mount)'
   echo '3) salva_home  (/home)'
   echo
   echo 'Introduzca la opcion deseada.'
   read OPT1
   case "$OPT1" in
     [0123]) RETRY=FALSE 
        ;;
     *) echo "Opcion invalida. Reintentar" 
        ;;
   esac
done

if [ "$OPT1" != "0" ] 
  then
   RETRY=TRUE
   while [ "$RETRY" != "FALSE" ]
   do
      echo 'Introduzca en primer lugar el tipo de copia deseado'
      echo
      echo 'T) TOTAL'
      echo 'I) INCREMENTAL DESDE ULTIMO TOTAL'
      echo
      read TIPO
      case "$TIPO" in
        [TI]) RETRY=FALSE 
         ;;
        *) echo "Opcion invalida. Reintentar"
         ;;
      esac
   done
fi

case "$OPT1" in
   0) testTape ;;
   1) salva_tmp ;;
   2) salva_root ;;
   3) salva_home ;;
esac
echo Copia finalizada.

Los menús de esta aplicación pueden hacerse más vistosos usando dialog(1), también puede intentar opciones para salvar y recuperar configuraciones. Ambas cosas están resueltas el 'kbackup' que está realizado igualmente en shell-script.

/ = = = = = = = = = = = = = = = /

Ejemplos de recuperación de copias
En el ejemplo anterior no hemos incluido ninguna opción de recuperación porque cada caso es distinto dependiendo de lo que se quiera recuperar.

Un error en la recuperación puede suponer perdida de información. Siempre que sea posible conviene recuperar en un lugar distinto al original y solo se deben recuperar los ficheros necesarios.

Generalmente los programas de propósito general permiten la recuperación de todo el contenido o bien sacan una lista de todos los ficheros para señalar aquellos que deseamos recuperar.

Al contrario que el respaldo la recuperación no es una tarea rutinaria. Por esa razón y porque cada recuperación ha de hacerse bajo unos supuestos distintos los programas de propósito general no siempre proporcionan la flexibilidad necesaria.

Conociendo bien las herramientas sencillas tipo 'find', 'cpio', 'tar', 'afio', etc y combinándolas para recuperar solo lo que deseamos lograremos mucha flexibilidad.

Las distintas posibilidades son imposibles de comentar y ya vimos alguna cosa al explicar 'cpio' y en realidad basta con saber como sacar la lista de ficheros de una cinta y como poder usar esa lista para recuperar lo que queramos.

Ahora nos vamos a ver ejemplos concretos centrándonos exclusivamente en la recuperación de copias realizadas con 'afio' en formato comprimido, para no cambiar porque de alguna manera venimos mostrando nuestro favoritismo por 'afio' en toda esta lección.

Se puede confeccionar una lista de los ficheros contenidos en la copia haciendo lo siguiente.

$ afio -tZ /dev/st0 > listafich 

Supongamos que en nuestra lista de ficheros aparecen los siguientes.

./var/lib/postgres/data/pg_variable
./var/log/apache/access.log
./var/log/apache/error.log    
./var/log/auth.log

Si hace pruebas situese en /tmp. Para una recuperación de información real tampoco conviene recuperar directamente sobre el original así que /tmp puede ser igualmente un buen lugar si hay espacio para ello. Recuerde que algunos sistemas limpian /tmp al arrancar o regularmente cada cierto tiempo.

Continuando con nuestro ejemplo, para recuperar por ejemplo 'auth.log' haríamos lo siguiente.

$ afio -iZ -y '*auth.log' /dev/st0

Para recuperar los que ficheros que contengan 'log/apache' pero no 'access' haríamos lo siguiente.

$ afio -iZ -y '*log/apache*' -Y '*access*' /dev/st0

En este caso habríamos recuperado solo './var/log/apache/error.log'.

Para casos más complejos se usará las opciones -w o -W con ficheros que contendrán un nombre de fichero, o un patrón por cada línea, y donde cada una de ellas será considerada como si fuera una opción -y o -Y respectivamente para '-w fichero' o para '-W fichero'.

Si quiere hacernos llegar alguna duda, aclaración,
crítica, o contribución personal, utilice nuestro
formulario de contacto y nosotros le contestaremos
contacto