Programa de archivo tar: creación de backups y archivado de ficheros

El programa de archivo tar, acrónimo de Tape Archiver, es un sistema de almacenamiento de unidades de cinta basado en un antiguo método de backups o copias de seguridad que aún hoy sigue convenciendo a sus clientes. Aunque en la actualidad los usuarios particulares apenas recurren a él, tar continúa considerándose la herramienta preferida de archivo en los sistemas UNIX. Además este archivador de ficheros permite crear regularmente backups incrementales de servidores. Aquí no solo aclararemos cómo usar el programa, sino que indicaremos también los comandos necesarios para realizar backups con tar.

¿Cómo funciona tar?

El programa de archivo tar se usa para el archivado de ficheros y carpetas en Linux y otros sistemas relacionados y, aunque pueda resultar extraño, no ofrece función de comprimir en su forma estándar. Aun así, el programa es muy conocido, ya que permite combinar carpetas completas en un archivo único. Esta tecnología va unida a la historia misma del programa, debido a que en un sistema de almacenamiento de unidades de cinta todos los datos se transfieren consecutivamente a una cinta magnética, lo que explica el almacenamiento secuencial y linear del formato tar, en el que los nuevos ficheros se adjuntan a un archivo principal. El archivo resultante de la concatenación de ficheros se conoce también como tarball (bola tar), pues estos están literalmente unidos unos a otros.

Si lo que se persigue es comprimir este tipo de archivo, es necesario combinar tar con gzip. Ambos programas se complementan perfectamente, pues gzip solo puede comprimir archivos únicos. Por este motivo, siempre se emplea primero tar seguido de gzip u otro programa de compresión, de modo que una vez comprimidos se generan archivos .tar.gz o .tzip.

¿Cómo instalar tar?

En Ubuntu, el programa de archivo tar viene predeterminado. Si usas otra distribución de Linux o Unix, puedes instalar el programa con:

sudo apt-get install tar tar-doc

El paquete tar-doc es opcional y contiene documentación sobre el programa de archivo.

¿Cómo utilizar tar?

Es posible utilizar tar siguiendo simplemente la sintaxis:

tar Option fichero

Entre las opciones encontramos:

Opción Descripción Particularidad  
--help Muestra todas las opciones.    
--version Muestra la versión en uso de tar.    
-c Crea un archivo nuevo (create)  
-d Compara los ficheros del el archivo y del sistema de ficheros. (diff)  
-f Escribe un archivo en el fichero especificado o selecciona los datos del archivo dado. (file) Esta opción debes indicarla al final, ya que las entradas que le siguen se interpretan como ficheros.  
-z Comprime o descomprime el archivo directamente con gzip. gzip debe de estar ya instalado.  
-Z Comprime o descomprime el archivo directamente con compress. compress debe estar ya instalado. Se debe prestar atención a la mayúscula.  
-j Comprime o descomprime el archivo directamente con bzip2. bzip2 debe estar ya instalado.  
-J Comprime o descomprime el archivo directamente con xz. xz debe estar ya instalado. Atención con la mayúscula.  
-k Impide que los ficheros sobrescriban otros ficheros existentes al extraerlos del archivo.    
-p Guarda los derechos de acceso en la extracción.    
-r Añade un fichero al archivo existente. (recreate) El fichero se concatena al anterior, lo que funciona solo si el archivo no se ha comprimido.  
-t Muestra el contenido de un archivo. (table)  
-u Solo añade ficheros más recientes que sus versiones actuales en del archivo.    
-v Muestra el proceso de archivo. (verbose)  
-vv Muestra información más detallada sobre el proceso de archivo. (very verbose)  
-w Cada acción debe ser ratificada.    
-x Extrae ficheros del archivo. (extract) Los fichers permanecen en el archivo.  
-A Añade los ficheros que componen un archivo existente a otro. Se debe prestar atención a la mayúscula.  
-C Muestra la ubicación en la que extraer los ficheros. Se debe prestar atención a la mayúscula  
-M Crea, muestra o extrae un archivo múltiple. Se debe prestar atención a la mayúscula  
-L Cambia el medio después de que el fichero tenga un determinado tamaño. El tamaño se mide en kilobytes. Se debe prestar atención a la mayúscula.  
-W Comprueba el archivo después de que se haya escrito. Se debe prestar atención a la mayúscula.  
-P Archiva todos los ficheros del directorio raíz. Se debe prestar atención a la mayúscula.  
--exclude Excluye ficheros o carpetas. Se especifica después del comando de creación con --exclude=<fichero/carpeta>  
-X Lee una lista con archivos excluidos. Requiere una lista creada con anterioridad: -X <Lista>.list. Se debe prestar atención a la mayúscula.  
-g Crea un registro de todas las carpetas incluidas las sumas de verificación.    

En la creación de los archivos tar también tienes la posibilidad de aplicar caracteres comodín con un asterisco. Al crear un archivo con este programa, en primer lugar, hay que escribir las opciones, seguidas del nombre del archivo que se quiere crear y finalmente los ficheros y carpetas que este debe contener. En el siguiente ejemplo se crea un archivo (-c) con dos ficheros de texto, se comprime con gzip (-z) y se escribe en el archivo archiv.tar.gz (-f):

tar -czf archiv.tar.gz ejemplo_1.txt ejemplo_2.txt

Si quieres agrupar todos los archivos de texto de una carpeta en un archivo tar, utiliza el comodín correspondiente:

tar -cf text_archiv.tar *.txt

También es posible adjuntar carpetas completas y subcarpetas en un archivo tar. En el ejemplo se almacena la /carpeta1 con todas las subcarpetas y los ficheros contenidos en ellas excepto la subcarpeta /carpeta1/subcarpeta_x:

tar -cf archiv.tar --exclude="/carpeta1/subcarpeta_x" /carpeta_1 

En el siguiente ejemplo puedes extraer (-x) el archivo comprimido (-z) creado en el primer ejemplo en otra carpeta (-C):

tar -xzf archiv.tar.gz -C /home/ carpeta1/archiv_carpeta

Para añadir otro fichero a un archivo tar que no debe estar comprimido, añade el siguiente comando:

tar -rf archiv.tar ejemplo_extra.txt

Los backups con tar

Los webmasters se inclinan por usar tar para crear backups por dos motivos. Por un lado, la estructura de carpetas no se modifica y, por otro, el alcance de las funciones del programa permite numerosos ajustes de precisión adicionales, hecho evidente si se tienen en cuenta las numerosas opciones que se han desglosado en el apartado anterior. A continuación, te explicaremos cómo utilizar tar para crear backups completos y copias de seguridad incrementales.

Creación de backups con tar

En toda estrategia de seguridad es convenientes crear un script para copias de seguridad para proteger tu sistema en vez de tener que estar creando archivos de forma manual. Al automatizar el proceso es posible guardar más carpetas, comprimirlas y transferirlas a un sistema de almacenamiento externo. Para ello es importante tener autorización continua para escribir y leer en las carpetas correspondientes. En primer lugar, coloca en el directorio principal una carpeta bin, si es que no la tienes todavía, y crea ahí el script. A continuación se muestra un script de ejemplo que debes adaptar a tus necesidades y a la estructura de tus carpetas: 

#!/bin/bash
DATE=$(date +%Y-%m-%d-%H%M%S)
BACKUP_DIR="/carpetadestino /backup"
SOURCE="$HOME/carpetaorigen"
tar -cvzpf $BACKUP_DIR/backup-$DATE.tar.gz $SOURCE

Para que puedas entender perfectamente el efecto de este script, te lo explicamos línea por línea:

  1. La primera línea es la llamada shebang, encargada de compartir con el sistema operativo el intérprete que ha de usarse. En este caso concreto, se usa bash.

  2. Cada copia de seguridad creada con tar contiene un cronosellador, necesario para que las copias de seguridad se puedan distinguir unas de otras. Las variables muestran, por ejemplo, el formato año-mes-día-horaminutosegundo: 2017-09-07-152833.

  3. A continuación determina en qué carpeta vas a crear la copia de seguridad y coloca “/” tras la última subcarpeta.

  4. En esta línea se indica qué carpeta o carpetas quieres insertar en el archivo, puesto que puede estar formado por más de una, siempre y cuando se separen con un espacio SOURCE="$HOME/ carpetaorigen1 $HOME/ carpetaorigen2 ". Como se puede observar, aquí no se incluye “/” al final de la carpeta, aunque sí hay que añadir un espacio antes de la comilla de cierre.

  5. La última línea del script contiene el comando tar:
    1. -cvzpf crea un archivo tar (-c), muestra el proceso de archivo (-v), se comprime con gzip (-z), guarda los derechos de acceso (-p) y todo se envía al siguiente archivo (-f). Especialmente -v y –p son opcionales, esto es, puedes elegir entre otras opciones para crear tu copia de seguridad.

    2. $BACKUP_DIR/backup-$DATE.tar.gz da nombre a la carpeta ($BACKUP_DIR) y al fichero en el que ha de guardarse la copia de seguridad. En nuestro ejemplo sigue la estructura que aparece a continuación: en primer lugar, el nombre de la carpeta, seguido del nombre del archivo backup. Tras estos el cronosellador actual y del formato. No olvides que, si optas por otro método de comprimir distinto, debes cambiar el formato del archivo y la opción del comando.

    3. Finalmente comunica a tar con la varibale $SOURCE qué es lo que se debe archivar. Ten en cuenta que con --exclude o –X puedes excluir aquellos archivos o carpetas que no quieres guardar en la copia de seguridad.
Consejo

En principio, en Linux y Unix no sirve de nada la extensión dada al archivo script, ya que los sistemas leen el tipo de archivo, comparando la estructura de este con un archivo mágico (magic file), esto es, una base de datos que se encuentran normalmente en /etc/magic. A pesar de todo, se ha generalizado indicar la extensión, pues le facilita al usuario una visión general.

Ahora guarda el archivo backup en la carpeta bin y añade su ruta a la variable PATH:

PATH=$PATH:$HOME/bin

El script de backup que acaba de ser creado todavía debe convertirse en ejecutable:

chmod u+x $HOME/bin/backup

Para ello, puedes establecer que solo tú puedas ejecutar el archivo (u), aunque también es posible traspasar estos derechos a un grupo (g), a otros (o) o a todos (a). Es en este momento cuando finaliza el proceso de creación y se puede proceder a ejecutar el script:

sudo backup

Si lo que quieres es volver a crear la copia de seguridad, esto es, extraer el archivo tar, solo debes escribir el siguiente comando:

tar -xzf backup.tar.gz -C /

El script crea una copia de seguridad completa, aunque hay que apuntar que esta elección no siempre es la más adecuada si se quiere proceder al almacenamiento de un servidor completo. Quizás es mejor plantearse si un backup incremental con tar no se adecuaría mejor a tus intereses.

Nota

Cuando se crea un archivo con una ruta de archivos absoluta, tar muestra el siguiente aviso: “tar: elimina el carácter guía “/” del nombre de los elementos”. Esto no es un aviso de error, sino una indicación de seguridad en el rebobinado, pues tar convierte /home/subcarpeta en home/subcarpeta. Si al extraer el archivo no estás en la carpeta raíz, tar crea una nueva estructura de carpetas, por ejemplo, /home/ subcarpeta /home/ subcarpeta, reduciendo la posibilidad de que sobrescribas un sistema completo por error. Ten en cuenta que Unix no pregunta si se ha de sobrescribir. Si de verdad hay contenido que quieres sustituir, debes navegar primero en la carpeta raíz con la opción –P.

Backup incremental con tar

Es común que los websmasters creen copias de seguridad periódicamente para evitar la pérdida de datos. Si el sistema actual rechazara su servicio, lo pusiera en peligro o lo borrara, se puede recurrir a una versión funcional de la copia de seguridad. Cuanto mayor sea la regularidad con se establecen los puntos de guardado, menor será la cantidad de datos perdidos si algo le ocurre al sistema. No obstante, si para ello realizas cada vez una copia de seguridad completa, esto es, archivas todos los datos del sistema, no solo será necesario mucho tiempo, sino también mucho espacio en la memoria. En su lugar es posible crear backups incrementales con tar.

Todo backup incremental requiere un almacenamiento completo. Por ello, en primer lugar hay que archivar el sistema completo o la parte de él que se quiera guardar para después ir añadiendo con la copia de seguridad incremental únicamente los archivos tar nuevos o modificados. De modo que, cuando se vuelva a ejecutar el backup, se requerirá la última copia completa junto con cada copia de seguridad incremental añadida tras esta, lo que conlleva un volumen de datos mucho menor, aunque exige un mayor coste en la restauración. Si uno de los archivos se ha perdido, hoy en día mucho más improbable que en los tiempos de la cinta magnética, el backup estará incompleto.

Creación de un backup incremental con tar

Con tar es posible crear copias de seguridad incrementales de forma regular. También para ello hay que crear un script para backups propio con el que puedes establecer, por ejemplo, que una vez al mes se haga una copia de seguridad completa y cada día una copia de seguridad incremental. Además, este script permite trasladar los backups antiguos regularmente a carpetas clasificadas por fechas. Para ello se usa tar y también cron, un daemon o programa que actúa en segundo plano y permite ejecuciones basadas en el tiempo de otros procesos. Este programa está por defecto en Ubuntu. A continuación abre un procesador de textos y crea el script:

#!/bin/bash
BACKUP_DIR="/ carpetadestino /backup"
ROTATE_DIR="/ carpetadestino /backup/rotate"
TIMESTAMP="timestamp.dat"
SOURCE="$HOME/ carpetaorigen "
DATE=$(date +%Y-%m-%d-%H%M%S)

EXCLUDE="--exclude=/mnt/* --exclude=/proc/* --exclude=/sys/* --exclude=/tmp/*"

cd /

mkdir -p ${BACKUP_DIR}

set -- ${BACKUP_DIR}/backup-??.tar.gz
lastname=${!#}
backupnr=${lastname##*backup-}
backupnr=${backupnr%%.*}
backupnr=${backupnr//\?/0}
backupnr=$[10#${backupnr}]

if [ "$[backupnr++]" -ge 30 ]; then
mkdir -p ${ROTATE_DIR}/${DATE}
mv ${BACKUP_DIR}/b* ${ROTATE_DIR}/${DATE}
mv ${BACKUP_DIR}/t* ${ROTATE_DIR}/${DATE}
backupnr=1
fi

backupnr=0${backupnr}
backupnr=${backupnr: -2}
filename=backup-${backupnr}.tar.gz

tar -cpzf ${BACKUP_DIR}/${filename} -g ${BACKUP_DIR}/${TIMESTAMP} -X $EXCLUDE ${SOURCE]

A continuación te explicamos este script para backups paso a paso:

  • En primer lugar debes volver a definir al intérprete.
  • A continuación establece las variables. Aquí hay que añadir, además, una carpeta para la rotación de los backups con tar, esto es, un tipo de archivo de copias de seguridad, así como un archivo para el timestamp o cronosellador.
  • En nuestro ejemplo mostramos que no siempre hay por qué añadir todas las carpetas en el archivo tar. De hecho, hemos escogido el contenido de las carpetas mnt, proc, sys y tmp y no las carpetas en sí mismas, de ahí que se use “*”, debido a que los datos en estas carpetas son temporales o deben de ser creados en cada sistema.
  • Para que la ruta lo interprete todo correctamente, el script cambia a la carpeta raíz con cd /.
  • Con mkdir se crea la carpeta de la copia de seguridad si es que no se ha creado aún.
  • Es ahora cuando se leen todas las variables. Como se pretende numerar los backups correlativamente, el code block averigua el número del último, lo que ocurre cuando el script elimina los otros componentes del nombre del archivo.
  • Almacena solo 30 copias de seguridad al mismo tiempo y, una vez superada esta cantidad, el script las traslada a la carpeta de rotación. Esta se crea primero para después trasladar a ellas con mv todos los archivos que empiecen por b o t, limitación que se explica al tener en cuenta que solo se introducen aquellos archivos marcados, estos son backup y timestamp. Finalmente, el script vuelve a establecer el número del backup en 1, aunque si el script comprueba que todavía no se han creado 30 copias de seguridad, el número de archivo aumenta a 1 (++).
  • Ahora el script casi vuelve a deshacer lo que al principio había llevado a cabo, aunque el comando se ocupa de que el nombre del archivo vuelva a estar completo con el nuevo orden de números. 
  • Finalmente, el script ejecuta el comando tar. Al contrario que con el comando de una copia de seguridad completa, aquí se suma también la opción –g, que habilita el backup incremental. Además, tar lee el timestamp de cada archivo, lo compara con los datos guardados hasta el momento en timestamp.dat para así determinar los cambios que se han originado tras la última copia de seguridad, los cuales formarán parte del nuevo archivo.
Nota

Todas las copias de seguridad llevadas a cabo a diario son trasladadas por el script cada mes a una nueva carpeta y de este modo se consigue que en la carpeta de backup original se encuentren únicamente los archivos más actuales. No obstante, no se incorpora ninguna función que limite el número de carpetas de archivo, por los que hay que borrarlas manualmente.

Tras todo lo expuesto, el script para la creación de una copia incremental con tar debe estar ya preparado. Guarda los archivos como backup en la carpeta bin. También aquí hay que exportar la ruta y convertir el script en ejecutable.

PATH=$PATH:$HOME/bin
chmod u+x $HOME/bin/backup

En teoría ya debe ser posible iniciar el script para backups con sudo backup. La idea en la que se basan las copias de seguridad incrementales es que estas permiten crear backups a diario en un proceso automatizado, lo que se consigue con cron mediante la llamada crontab, una tabla dividida en siete campos:

Minutos Horas Días Mes Día de la semana Orden  
(0-59) (0-23) (1-31) (1-12) (0-7)    

En este campo se pueden introducir bien cifras según el marco de valores correspondiente indicados en los paréntesis, o bien un asterisco que indique que se establecen todos los valores posibles. Además, la casilla de los días de la semana presenta una particularidad, pues permite establecer si una orden ha de llevarse a cabo, por ejemplo, solo el lunes (1) o durante los días laborables (1-5). El domingo tiene dos valores diferentes, 0 o 7, ya que hay personas que empiezan la semana en este día y otras que la terminan aquí.

En la consola de línea de comandos abre el modo editor de cron con:

sudo crontab –e

Añade la siguiente línea:

30 7 * * * /home/bin/backup

Con esto hemos establecido que se debe llevar a cabo un backup todos los días a las 7:30 a.m. y una vez al mes. Al guardar los cambios, el backup incremental está listo para usarse.

Nota

Cron, al igual que los servidores web, solo funciona cuando el sistema está en marcha. Al instalar el script en tu ordenador o portátil para realizar la copia de seguridad, debes asegurarte de que este dispositivo estará en funcionamiento todos los días establecidos a la hora estimada. Si no es así, no se creará la copia de seguridad a menos que utilices el programa anacron, encargado de trasladar una tarea planeada para un momento en el que el sistema no esté funcionando a otro en el que el dispositivo sí esté conectado.

Restaurar un sistema con un backup

Aunque no se le desea a nadie, puede ocurrir que tengas que restaurar el sistema. Por suerte, este proceso se lleva a cabo con relativa facilidad gracias a tar y para ello no se requiere un script adicional. No obstante, se necesita algo más que los comandos simples usados con los backups completos, pues va unido a la naturaleza misma de las copias de seguridad incrementales que haya que extraer muchos archivos. Añade en la consola el siguiente comando:

BACKUP_DIR=/carpetadestino/backup
cd /
for archiv in ${BACKUP_DIR}/backup-*.tar.gz; do
tar -xpzf $archiv -C /
done
Nota

En la restauración de un sistema con una copia de seguridad todas las carpetas y con ellas todos los ficheros importantes se sobrescriben.

Para que no tengas que extraer cada archivo tar de forma individual, usa un ciclo for:

  1. En primer lugar establece la carpeta en la que se encuentra el backup.
  2. Con cd /cambia a la carpeta raíz para asegurarte de que el archivo se extrae del lugar correcto.
  3. Inicia ahora un ciclo for. Este comando repite todas las acciones que se encuentran entre do y done hasta que hayan pasado todas las posibilidades. Para la especificación del comando establece la ruta de tu copia de seguridad con un asterisco a modo de comodín, ya que deseas extraer todos los ficheros de archivo de la carpeta. 
  4. El comando tar se indica de la siguiente forma: extrae (-x) manteniendo los derechos de acceso (-p) y descomprime (-z) el archivo (-f $archiv) en la carpeta raíz (-C /).
  5. Con done establece el punto final del ciclo for.

Como al crear el archivo tar los backups se han enumerado correlativamente, también se ejecutarán uno detrás de otro, empezando por el más antiguo. Para ello hay que tener en cuenta que en los archivos creados tras una copia de seguridad completa se encuentran versiones nuevas de los ficheros contenidos en ella. De modo que en el ciclo for primero se extraen las versiones antiguas para más tarde ser sobrescritas por las nuevas, permitiendo que el sistema completo sobrescrito con el backup contenga la última versión archivada de cada fichero.

La razón principal por la que se crean copias de seguridad incrementales es para permitir la completa restauración del sistema, aunque con un pequeño rodeo también es posible rescatar solo algunos de los ficheros, así como recuperar una versión anterior a la última creada:

BACKUP_DIR=/carpetadestino/backup
ls -l ${BACKUP_DIR}
for archiv in ${BACKUP_DIR}/backup-*tar.gz; do
tar -tzf $archiv | grep fichero-buscado;
done

También en los primeros casos se vuelve a recurrir al ciclo for, aunque este se usará principalmente para la búsqueda y no para la extracción:

  1. Vuelve a definir la carpeta de la copia de seguridad.
  2. Con el comando ls se muestran todos los ficheros y carpetas contenidos en la carpeta de la copia de seguridad. La opción –l proporciona información detallada.
  3. Abre un el ciclo for como ocurría al restaurar el archivo completamente.
  4. Las diferencias con respecto al proceso anterior residen en las opciones del comando tar. En vez de crear (c) o extraer (x) un archivo, se solicita que se muestre el contenido del archivo tar (t) y se reenvía la salida con una barra vertical al comando grep, pues no se pretende buscar los ficheros personalmente. El comando busca en la salida o contenido del archivo los ficheros específicos buscados.
  5. Finaliza el ciclo for.

Ahora, el terminal muestra los ficheros buscados y probablemente algunos más, si has trabajado con ellos regularmente y aparecen en cada copia de seguridad incremental. Recuerda la ruta del fichero y crea un nuevo ciclo que se encargue de restaurar la última versión guardada.

for archiv in ${BACKUP_DIR}/backup-*.tar.gz; do
tar –xzf $archiv -C / carpetadestino/backup/archivo-buscado
done

Es en este momento cuando los ficheros se restauran en su lugar original, sobrescribiendo además las versiones posteriores, en caso de que las hubiera.