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). |
![]() |
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.
|
Porque dedicamos un capítulo completo a esto.
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.
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.
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
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
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.
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:
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:
Para modificar la fecha de modificación de un fichero
ajustándola con la fecha de ayer haríamos:
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:
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'
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:
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:
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.
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.
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:
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:
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 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
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.
/dev/st0 Dispositivo de cinta SCSI Con 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
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.
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
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.
Supongamos que en nuestra lista de ficheros aparecen los siguientes.
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.
Para recuperar los que ficheros que contengan 'log/apache' pero no 'access'
haríamos lo siguiente.
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'.
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.
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.
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.
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.
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 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.
$ dd if=/dev/fd0 of=fichero
$ dd of=/dev/fd0 if=fichero
$ touch fichero
$ touch -t yesterday fichero
$ touch -r fich_ref fichero
Vamos a ver ahora una serie de programas capaces de empaquetar
varios ficheros en uno solo.
$ # 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
$ #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
$ # 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`
$ cd $DIR_ORIGEN
$ find . | cpio -pdm $DIR_DESTINO
$ 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
$ # 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
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.
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.
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/nst0 Dispositivo de cinta SCSI Sin autorebobinado.
mt -f /dev/nst0 retension
mt -f /dev/st0 status
#!/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.
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.
$ afio -tZ /dev/st0 > listafich
./var/lib/postgres/data/pg_variable
./var/log/apache/access.log
./var/log/apache/error.log
./var/log/auth.log
$ afio -iZ -y '*auth.log' /dev/st0
$ afio -iZ -y '*log/apache*' -Y '*access*' /dev/st0
Si quiere hacernos llegar alguna duda, aclaración,
crítica, o contribución personal, utilice nuestro
formulario de contacto y nosotros le contestaremos