Aunque muchos clones de Unix ofrecen sus propias herramientas para realizar copias de seguridad de todo tipo (por ejemplo, tenemos
mksysb y
savevg/restvg en AIX,
fbackup y
frecover en HP-UX,
bru en IRIX,
fsphoto en SCO Unix,
ufsdump/ufsrestore en Solaris...), casi todas estas herramientas suelen presentar un grave problema a la hora de recuperar archivos: se trata de
software propietario, por lo que si queremos restaurar total o parcialmente archivos almacenados con este tipo de programas, necesitamos el propio programa para hacerlo. En determinadas situaciones, esto no es posible o es muy difícil: imaginemos un departamento que dispone de sólo una estación Silicon Graphics corriendo IRIX y pierde todos los datos de un disco, incluida la utilidad
bru; si ha utilizado esta herramienta para realizar
backups, necesitará otra estación con el mismo operativo para poder restaurar estas copias, lo que obviamente puede ser problemático.
Por este motivo, muchos administradores utilizan herramientas estándar para realizar las copias de seguridad de sus máquinas; estas herramientas suelen ser tan simples como un
shellscript que se planifica para que automáticamente haga
backups utilizando órdenes como
tar o
cpio, programas habituales en cualquier clon de Unix y que no presentan problemas de interoperabilidad entre diferentes operativos. De esta forma, si en la estación Silicon Graphics del ejemplo anterior se hubiera utilizado
tar para realizar las copias de seguridad, éstas se podrían restaurar sin problemas desde una máquina SPARC corriendo Solaris, y transferir los ficheros de nuevo a la Silicon.
La herramienta clásica para realizar
backups en entornos Unix es desde hace años
dump, que vuelca sistemas de ficheros completos (una partición o una partición virtual en los sistemas que las soportan, como Solaris);
restore se utiliza para recuperar archivos de esas copias. Se trata de una utilidad disponible en la mayoría de clones del sistema operativo
8.1∞, potente (no diremos `sencilla') y lo más importante: las copias son completamente compatibles entre Unices, de forma que por ejemplo podemos restaurar un
backup realizado en IRIX en un sistema HP-UX. Además, como veremos luego, la mayor parte de las versiones de
dump permiten realizar copias de seguridad sobre máquinas remotas directamente desde línea de órdenes (en el caso que la variante de nuestro sistema no lo permita, podemos utilizar
rdump/
rrestore) sin más que indicar el nombre de máquina precediendo al dispositivo donde se ha de realizar la copia.
La sintaxis general de la orden
dump es
dump opciones argumentos fs
donde
`opciones' son las opciones de la copia de seguridad,
`argumentos' son los argumentos de dichas opciones, y
`fs' es el sistema de ficheros a salvaguardar. Se trata de una sintaxis algo peculiar: mientras que lo habitual en Unix es especificar cada argumento a continuación de la opción adecuada (por ejemplo,
`find . -perm 700 -type f' indica un argumento
`700' para la opción
`perm' y uno
`f' para
`type'), en la orden
dump primero especificamos toda la lista de opciones y a continuación todos sus argumentos; no todas las opciones necesitan un argumento, y además la lista de argumentos tiene que corresponderse exactamente, en orden y número, con las opciones que los necesitan (por ejemplo, si
`find' tuviera una sintaxis similar, la orden anterior se habría tecleado como
`find . -perm -type 700 f'). AIX y Linux son los únicos Unices donde la sintaxis de
dump (recordemos que en el primero se denomina
backup) es la habitual.
Las opciones de
`dump' más utilizadas son las que se muestran en la tabla
7.2∞; en las páginas
man de cada clon de Unix se suelen incluir recomendaciones sobre parámetros específicos para modelos de cintas determinados, por lo que como siempre es más que recomendable su consulta. Fijándonos en la tabla, podemos ver que la opción
`u' actualiza el archivo
/etc/dumpdates tras realizar una copia de seguridad con éxito; es conveniente que este archivo exista antes de utilizar
dump por primera vez (podemos crearlo con la orden
touch), ya que si no existe no se almacenará información sobre las copias de seguridad de cada sistema de ficheros (información necesaria, por ejemplo, para poder realizar
backups progresivos). En este archivo
dump - la propia orden lo hace, el administrador no necesita modificar el archivo a mano...y no debe hacerlo - registra información de las copias de cada sistema de archivos, su nivel, y la fecha de realización, de forma que su aspecto puede ser similar al siguiente:
anita:~# cat /etc/dumpdates
/dev/dsk/c0d0s6 0 Thu Jun 22 05:34:20 CEST 2000
/dev/dsk/c0d0s7 2 Wed Jun 21 02:53:03 CEST 2000
anita:~#
Tabla 7.2: Opciones de la orden
dump|| || Opción || Acción realizada || Argumento || || 0-9 || Nivel de la copia de seguridad || NO || || u || Actualiza
/etc/dumpdates al finalizar el
backup || NO || || f || Indica una cinta diferente de la usada por defecto || SÍ || || b || Tamaño de bloque || SÍ || || c || Indica que la cinta destino es un cartucho || NO || || W || Ignora todas las opciones excepto el nivel del
backup || NO || ||
El uso de
dump puede ser excesivamente complejo, especialmente en sistemas antiguos donde es incluso necesario especificar la densidad de la cinta en
bytes por pulgada o su longitud en pies; no obstante, hoy en día la forma más habitual de invocar a esta orden es
`dump [1-9]ucf cinta fs', es decir, una copia de seguridad del sistema de ficheros recibido como argumento, de un determinado nivel y sobre la unidad de cinta especificada. Por ejemplo para realizar una copia de seguridad completa sobre la unidad de cinta
/dev/rmt de la partición lógica
/dev/dsk/c0d0s7, en Solaris podemos utilizar la orden siguiente (podemos ver que nos muestra mucha información sobre el progreso de nuestra copia de seguridad en cada momento):
anita:~# ufsdump 0cuf /dev/rmt /dev/dsk/c0d0s7
DUMP: Date of this level 0 dump: Thu Jun 22 10:03:28 2000
DUMP: Date of last level 0 dump: the epoch
DUMP: Dumping /dev/dsk/c0d0s7 (/export/home) to /dev/rmt
DUMP: mapping (Pass I) [regular files]
DUMP: mapping (Pass II) [directories]
DUMP: estimated 24523 blocks (118796KB)
DUMP: Writing 63 Kilobyte records
DUMP: dumping (Pass III) [directories]
DUMP: dumping (Pass IV) [regular files]
DUMP: level 0 dump on Thu Jun 22 10:05:31 CEST 2000
DUMP: 24550 blocks (118927KB) on 1 volume
DUMP: DUMP IS DONE
anita:~#
Para realizar copias remotas, como hemos dicho antes, no tenemos más que anteponer el nombre del sistema donde deseemos realizar el volcado al nombre del dispositivo donde se va a almacenar, separado de éste por el carácter
`:'; opcionalmente se puede indicar el nombre de usuario en el sistema remoto, separándolo del nombre de máquina por
`@':
anita:~# ufsdump 0cuf toni@luisa:/dev/st0 /dev/dsk/c0d0s7
Si estamos utilizando
rdump, hemos de tener definido un nombre de máquina denominado
`dumphost' en nuestro archivo
/etc/hosts, que será el sistema donde se almacene la copia remota. De cualquier forma (usemos
dump,
ufsdump o
rdump), el
host remoto ha de considerarnos como una máquina de confianza (a través de
/etc/hosts.equiv o
.rhosts), con las consideraciones de seguridad que esto implica.
>Cómo restaurar los
backups realizados con
dump? Para esta tarea se utiliza la utilidad
restore (
ufsrestore en Solaris), capaz de extraer ficheros individuales, directorios o sistemas de archivos completos. La sintaxis de esta orden es
restore opciones argumentos archivos
donde
`opciones' y
`argumentos' tienen una forma similar a
`dump' (es decir, toda la lista de opciones seguida de toda la lista de argumentos de las mismas, excepto en AIX y Linux, donde la notación es la habitual), y
`archivos' evidentemente representa una lista de directorios y ficheros para restaurar. En la tabla
7.3∞ se muestra un resumen de las opciones más utilizadas.
Tabla 7.3: Opciones de la orden
restore|| || Opción || Acción realizada || Argumento || || r || Restaura la cinta completa || NO || || f || Indica el dispositivo o archivo donde está el
backup || SÍ || || i || Modo interactivo || NO || || x || Extrae los archivos y directorios desde el directorio actual || NO || || t || Imprime los nombres de los archivos de la cinta || NO || ||
Por ejemplo, imaginemos que deseamos restaurar varios archivos de un
backup guardado en el fichero
`backup'; en primer lugar podemos consultar el contenido de la cinta con una orden como la siguiente (en Linux):
luisa:~# restore -t -f backup>contenido
Level 0 dump of /home on luisa:/dev/hda3
Label: none
luisa:~# cat contenido|more
Dump date: Fri Jun 23 06:01:26 2000
Dumped from: the epoch
2 .
11 ./lost+found
30761 ./lost+found/#30761
30762 ./lost+found/#30762
30763 ./lost+found/#30763
30764 ./lost+found/#30764
30765 ./lost+found/#30765
30766 ./lost+found/#30766
30767 ./lost+found/#30767
4097 ./ftp
8193 ./ftp/bin
8194 ./ftp/bin/compress
8195 ./ftp/bin/cpio
8196 ./ftp/bin/gzip
8197 ./ftp/bin/ls
8198 ./ftp/bin/sh
8199 ./ftp/bin/tar
8200 ./ftp/bin/zcat
12289 ./ftp/etc
12290 ./ftp/etc/group
Broken pipe
luisa:~#
Una vez que conocemos el contenido de la copia de seguridad - y por tanto el nombre del archivo o archivos a restaurar - podemos extraer el fichero que nos interese con una orden como
luisa:~# restore -x -f backup ./ftp/bin/tar
You have not read any tapes yet.
Unless you know which volume your file(s) are on you should start
with the last volume and work towards the first.
Specify next volume #: 1
set owner/mode for '.'? [yn] n
luisa:~# ls -l ftp/bin/tar
x--x--x 1 root root 110668 Mar 21 1999 ftp/bin/tar
luisa:~#
Como podemos ver, la extracción se ha realizado a partir del directorio de trabajo actual; si quisiéramos extraer archivos en su ubicación original deberíamos hacerlo desde el directorio adecuado, o, en algunas versiones de
restore, especificar dicho directorio en la línea de órdenes.
Una opción muy interesante ofrecida por
restore es la posibilidad de trabajar en modo interactivo, mediante la opción
`i'; en este modo, al usuario se le ofrece un
prompt desde el cual puede, por ejemplo, listar el contenido de una cinta, cambiar de directorio de trabajo o extraer archivos. El siguiente ejemplo (también sobre Linux) ilustra esta opción:
luisa:~# restore -i -f backup
restore > help
Available commands are:
ls [arg] - list directory
cd arg - change directory
pwd - print current directory
add [arg] - add `arg' to list of files to be extracted
delete [arg] - delete `arg' from list of files to be extracted
extract - extract requested files
setmodes - set modes of requested directories
quit - immediately exit program
what - list dump header information
verbose - toggle verbose flag (useful with ``ls
)
help or `?' - print this list
If no `arg' is supplied, the current directory is used
restore > ls
.:
ftp/ httpd/ httpsd/ lost+found/ samba/ toni/
restore > add httpd
restore > extract
You have not read any tapes yet.
Unless you know which volume your file(s) are on you should start
with the last volume and work towards the first.
Specify next volume #: 1
set owner/mode for '.'? [yn] n
restore > quit
luisa:~#
Como podemos ver, hemos consultado el contenido de la copia de seguridad, añadido el directorio httpd/ a la lista de ficheros a extraer (inicialmente vacia), y extraído dicho directorio a partir del actual. Este uso de restore proporciona una gran comodidad y facilidad de uso, ya que las órdenes en modo interactivo son muy sencillas.
La utilidad tar (Tape Archiver) es una herramienta de fácil manejo disponible en todas las versiones de Unix que permite volcar ficheros individuales o directorios completos en un único fichero; inicialmente fué diseñada para crear archivos de cinta (esto es, para transferir archivos de un disco a una cinta magnética y viceversa), aunque en la actualidad casi todas sus versiones pueden utilizarse para copiar a cualquier dipositivo o fichero, denominado `contenedor'. Su principal desventaja es que, bajo ciertas condiciones, si falla una porción del medio (por ejemplo, una cinta) se puede perder toda la copia de seguridad; además, tar no es capaz de realizar por sí mismo más que copias de seguridad completas, por lo que hace falta un poco de programación shellscripts para realizar copias progresivas o diferenciales.
En la tabla 7.4∞ se muestran las opciones de tar más habituales; algunas de ellas no están disponibles en todas las versiones de tar, por lo que es recomendable consultar la página del manual de esta orden antes de utilizarla. Si la implementación de tar que existe en nuestro sistema no se ajusta a nuestras necesidades, siempre podemos utilizar la versión de GNU (http://www.gnu.org/##)∞, quizás la más completa hoy en día.
Tabla 7.4: Opciones de la orden tar|| || Opción || Acción realizada || || c || Crea un contenedor || || x || Extrae archivos de un contenedor || || t || Testea los archivos almacenados en un contenedor || || r || Añade archivos al final de un contenedor || || v || Modo verbose || || f || Especifica el nombre del contenedor || || Z || Comprime o descomprime mediante compress/uncompress || || z || Comprime o descomprime mediante gzip || || p || Conserva los permisos de los ficheros || ||
En primer lugar debemos saber cómo crear contenedores con los archivos deseados; por ejemplo, imaginemos que deseamos volcar todo el directorio /export/home/ a la unidad de cinta /dev/rmt/0. Esto lo conseguimos con la siguiente orden:
anita:~# tar cvf /dev/rmt/0 /export/home/
Como podemos ver, estamos especificando juntas las diferentes opciones necesarias para hacer la copia de seguridad de los directorios de usuario; la opción `v' no sería necesaria, pero es útil para ver un listado de lo que estamos almacenando en la cinta. En muchas situaciones también resulta útil comprimir la información guardada (tar no comprime, sólo empaqueta); esto lo conseguiríamos con las opciones `cvzf'.
Si en lugar de (o aparte de) un único directorio con todos sus ficheros y subdirectorios quisiéramos especificar múltiples archivos (o directorios), podemos indicárselos uno a uno a tar en la línea de comandos; así mismo, podemos indicar un nombre de archivo contenedor en lugar de un dispositivo. Por ejemplo, la siguiente orden creará el fichero /tmp/backup.tar, que contendrá /etc/passwd y /etc/hosts*:
anita:~# tar cvf /tmp/backup.tar /etc/passwd /etc/hosts*
tar: Removing leading `/' from absolute path names in the archive
etc/passwd
etc/hosts
etc/hosts.allow
etc/hosts.deny
etc/hosts.equiv
anita:~#
Una vez creado el contenedor podemos testear su contenido con la opción `t' para comprobar la integridad del archivo, y también para ver qué ficheros se encuentran en su interior:
anita:~# tar tvf /tmp/backup.tar
-rw-r--r-- root/other 965 2000-03-11 03:41 etc/passwd
-rw-r--r-- root/other 704 2000-03-14 00:56 etc/hosts
-rw-r--r-- root/other 449 2000-02-17 01:48 etc/hosts.allow
-rw-r--r-- root/other 305 1998-04-18 07:05 etc/hosts.deny
-rw-r--r-- root/other 313 1994-03-16 03:30 etc/hosts.equiv
-rw-r--r-- root/other 345 1999-10-13 03:31 etc/hosts.lpd
anita:~#
Si lo que queremos es recuperar ficheros guardados en un contenedor utilizaremos las opciones `xvf' (o `xvzf' si hemos utilizado compresión con gzip a la hora de crearlo). Podemos indicar el archivo o archivos que queremos extraer; si no lo hacemos, se extraerán todos:
anita:~# tar xvf /tmp/backup.tar etc/passwd
etc/passwd
anita:~# tar xvf /tmp/backup.tar
etc/passwd
etc/hosts
etc/hosts.allow
etc/hosts.deny
etc/hosts.equiv
etc/hosts.lpd
anita:~#
La restauración se habrá realizado desde el directorio de trabajo, creando en él un subdirectorio etc con los ficheros correspondientes en su interior. Si queremos que los ficheros del contenedor sobreescriban a los que ya existen en el sistema hemos de desempaquetarlo en el directorio adecuado, en este caso el raíz.
cpio (Copy In/Out) es una utilidad que permite copiar archivos a o desde un contenedor cpio, que no es más que un fichero que almacena otros archivos e información sobre ellos (permisos, nombres, propietario...). Este contenedor puede ser un disco, otro archivo, una cinta o incluso una tubería, mientras que los ficheros a copiar pueden ser archivos normales, pero también dispositivos o sistemas de ficheros completos.
En la tabla 7.5∞ se muestran las opciones de cpio más utilizadas; la sintaxis de esta orden es bastante más confusa que la de tar debido a la interpretación de lo que cpio entiende por `dentro' y `fuera': copiar `fuera' es generar un contenedor en salida estándar (que con toda probabilidad desearemos redireccionar), mientras que copiar `dentro' es lo contrario, es decir, extraer archivos de la entrada estándar (también es seguro que deberemos redireccionarla).
Tabla 7.5: Opciones de la orden cpio.|| || Opción || Acción realizada || || o || Copiar `fuera' (out) || || i || Copiar `dentro' (in) || || m || Conserva fecha y hora de los ficheros || || t || Crea tabla de contenidos || || A || Añade ficheros a un contenedor existente || || v || Modo verbose || ||
Por ejemplo, si deseamos copiar los archivos de /export/home/ en el fichero contenedor
/tmp/backup.cpio podemos utilizar la siguiente sintaxis:
anita:~# find /export/home/ |cpio -o > /tmp/backup.cpio
Como podemos ver, cpio lee la entrada estándar esperando los nombres de ficheros a guardar, por lo que es conveniente utilizarlo tras una tubería pasándole esos nombres de archivo. Además, hemos de redirigir su salida al nombre que queramos asignarle al contenedor, ya que de lo contrario se mostraría el resultado en salida estándar (lo que evidentemente no es muy utilizado para realizar backups). Podemos fijarnos también en que estamos usando la orden `find' en lugar de un simple `ls': esto es debido a que `ls' mostraría sólo el nombre de cada fichero (por ejemplo, `passwd') en lugar de su ruta completa (`/etc/passwd'), por lo que cpio buscaría dichos ficheros a partir del directorio actual.
Una vez creado el fichero contenedor quizás resulte interesante chequear su contenido, con la opción `t'. Por ejemplo, la siguiente orden mostrará en pantalla el contenido de /tmp/backup.cpio:
anita:~# cpio -t < /tmp/backup.cpio
Igual que para almacenar ficheros en un contenedor hemos de pasarle a cpio la ruta de los mismos, para extraerlos hemos de hacer lo mismo; si no indicamos lo contrario, cpio -i extraerá todos los archivos de un contenedor, pero si sólo nos interesan algunos de ellos podemos especificar su nombre de la siguiente forma:
anita:~# echo "/export/home/toni/hola.tex" |cpio -i </tmp/backup.cpio
Para conocer más profundamente el funcionamiento de cpio, así como opciones propias de cada implementación, es indispensable consultar la página del manual de esta orden en cada clon de Unix donde vayamos a utilizarla.
Backups sobre CD-ROM Como antes hemos dicho, cada vez es más común que se realicen copias de seguridad sobre discos compactos; en estos casos no se suelen utilizar las aplicaciones vistas hasta ahora (tar o cpio), sino que se necesita un software dedicado: aquí vamos a comentar las nociones más básicas para poder crear backups sobre este medio. Para poder grabar una copia de seguridad en un CD-ROM necesitamos en primer lugar que el núcleo del sistema operativo reconozca nuestra grabadora como tal; si se trata de una IDE, y dependiendo del clon de Unix utilizado, quizás sea necesario modificar el kernel, ya que el acceso que los diferentes programas realizan al dispositivo se efectua a través de un interfaz SCSI del núcleo. Es necesario consultar la documentación y la lista de compatibilidad hardware para cada Unix particular.
Si asumimos que el reconocimiento del dispositivo es correcto, lo que necesitamos a continuación es software capaz de grabar un CD-ROM. Por un lado es necesario un programa para crear imágenes ISO, el `molde' de lo que será el futuro CD-ROM; el más conocido es sin duda mkisofs. Además necesitaremos un programa para realizar lo que es la grabación en sí, como cdrecord. De esta forma lo primero que generaremos es una imagen de los ficheros a grabar, imagen que a continuación pasaremos al CD-ROM; por ejemplo, si queremos hacer un backup de /export/home/, en primer lugar utilizaremos mkisofs para crear una imagen con todos los ficheros y subdirectorios de los usuarios:
anita:~# mkisofs -a -R -l -o /mnt/imagen.iso /export/home/
Con esta orden hemos creado una imagen ISO denominada /mnt/imagen.iso y que contiene toda la estructura de directorios por debajo de /export/home/; con las diferentes opciones hemos indicado que se almacenen todos los ficheros, que se sigan los enlaces simbólicos y que se registre además información sobre los permisos de cada archivo. Una vez que tenemos esta imagen (que en los Unices con soporte para sistemas de ficheros loop podremos montar como si se tratara de una partición, para añadir, borrar, modificar...ficheros antes de la grabación) hemos de pasarla a un CD-ROM, por ejemplo mediante cdrecord:
anita:~# cdrecord dev=0,1,0 fs=16m /mnt/imagen.iso
Con esta orden le hemos indicado al sistema la ubicación de nuestra grabadora, así como un buffer de grabación de 16MB y también la ubicación de la imagen ISO.
Algo muy interesante es la posibilidad de grabar sin necesidad de crear primero imágenes con los ficheros que queremos meter en un CD-ROM; esto nos ahorrará tiempo (y sobre todo, espacio en disco) a la hora de realizar copias de seguridad, además de permitir una mayor automatización del proceso. Para ello, debemos calcular con mkisofs el espacio que ocupan los ficheros a grabar (con la opción `-print-size'), y posteriormente pasarle este valor a cdrecord; podemos hacerlo de forma automática, por ejemplo tal y como muestra el siguiente programa:
anita:~# cat `which graba-cd`
#!/bin/sh
# Vuelca el directorio pasado como parametro, y todos sus descendientes,
# en un CD-ROM
MKISOFS=/usr/local/bin/mkisofs
CDRECORD=/usr/local/bin/cdrecord
if (test $# -lt 1); then
echo "Usage: $0 /files"
exit
fi
size=`$MKISOFS -r -J -l -print-size -f $1 2>&1|tail -1|awk '{print $8}'`
nice --20 $MKISOFS -r -J -l -f $1 | nice --20 $CDRECORD dev=0,1,0 fs=16m\
tsize=$size*2048 -eject -
anita:~#
Como vemos, se asigna el tamaño de los datos a grabar a la variable `size', y después se pasa este número a cdrecord; de esta forma, para realizar una copia de seguridad de un directorio como /export/home/toni/, no tenemos más que ejecutar el shellscript pasándole el nombre de este directorio como parámetro.