5.4.1.2.1. tar

Ya se discutió cómo usar tar en el epígrafe dedicado al empaquetado, pero la intención entonces fue la de explicar cómo usar la herramienta para poco más que hacer copias puntuales del contenido de algún directorio. tar puede dar algo más de juego, aunque debemos ser conscientes de sus limitaciones:

  • El formato surgió para almacenar las copias en cintas magnéticas, cuyo acceso es secuencial. En consecuencia, no hay acceso directo a un contenido determinado, y es forzoso recorrer el paquete hasta llegar a él.

  • La compresión de las copias no es consustancial a la herramienta, sino que se comprime el paquete. En consecuencia, la extracción de un contenido determinado, exige la descompresión del paquete y recorrerlo hasta llegar a él.

  • La selección de los archivos a empaquetar es muy limitada, aunque para paliarlo podemos usar la técnica de generar la lista de archivos con find.`

Hay, además de lo ya expuesto, dos opciones muy pertinentes en la creación de copias de seguridad:

-u1

La opción permite actualizar (update) el paquete añadiendo al final nuevos ficheros o ficheros modificados. Es importante entender que no se sustituye la versión antigua del fichero, sino que se añade al final. Además, sólo pueden actualizarse achivos no comprimidos:

$ mkdir /tmp/KK
$ cd /tmp/KK
$ echo 1 > numero
$ echo a > letra
$ tar -cf ../prueba.tar .
$ tar -tf ../prueba.tar
./
./letra
./numero
$ echo 2 > numero
$ tar -uvf ../prueba.tar .
./numero
$ tar -tf ../prueba.tar
./
./letra
./numero
./numero

Ahora bien, los archivos se recuperan en el modo en que se añadieron al paquete2, por lo que en una extracción normal, la nueva versión machacará a la antigua y al final del proceso, sólo habremos recuperado la versión más reciente:

$ mkdir /tmp/KK2
$ tar -C /tmp/KK2 ../prueba.tar
$ cat /tmp/KK2/letra
a
$ cat /tmp/KK2/numero
2

Si nuestra intención, es recuperar una versión antigua, tendremos entonces que usar la opción --occurrence a la que se puede adjuntar con un número la versión del archivo que se quiere rescatar. Si se usa, pero sin número, se entiende que es la primera versión:

$ tar -C /tmp --occurence=1 -xf ../prueba.tar ./numero
$ cat /tmp/numero
1

Nota

occurrence requiere que se especifique una lista de ficheros a extraer.

-g <SNAP>

Puede servirnos para hacer tanto copias incrementales como copias diferenciales. La opción introduce el nombre del fichero que almacenará la metainformación necesaria para ello.

Copias incrementales

Como en las copias incrementales se guardan los cambios respecto a la última copia, el fichero snap debe actualizarse con cada copia. Por ejemplo:

$ mkdir /tmp/KK
$ echo 1 > /tmp/KK/numero.txt

Hacemos una copia completa de los datos:

$ tar -C /tmp/KK -acvf cc_$(date -I).tar.xz -g info.snap .

Tiempo después podemos hacer añadir un fichero y hacer una copia incremental:

$ echo a > /tmp/KK/letra.txt
$ tar -C /tmp/KK -acvf ci1_$(date -I).tar.xz -g info.snap .

La copia incremental sólo contendrá letra.txt. El fichero snap, además, cambiará también. Más adelante podríamos modificar el número y eliminar el fichero letra.txt:

$ echo 2 > /tmp/KK/numero.txt
$ rm /tmp/KK/letra.txt
$ tar -C /tmp/KK -acvf ci2_$(date -I).tar.xz -g info.snap .

En esta ocasión el efecto de la copia incremental debería ser modificar numero.txt y borrar letra.txt. Para recuperar las copias debemos ir, cronológicamente, recuperando todas las copias, aunque añadiendo la opción -G para se tenga en cuenta que las copias han sido incrementales y, en consecuencia, acabe por desaparecer letra.txt:

$ mkdir /tmp/KK2
$ tar -C /tmp/KK2 -axGvf cc_*.tar.xz
$ tar -C /tmp/KK2 -axGvf ci1_*.tar.xz
$ tar -C /tmp/KK2 -axGvf ci2_*.tar.xz
Copias diferenciales

En ellas se almacenan todas las modificaciones desde la última copia completa. En consecuencia, el fichero snap generado al hacer la copia completa no debe cambiar al hacerse las copias diferenciales. La solución es hacer una copia antes de usarlo:

$ mkdir /tmp/KK
$ echo 1 > /tmp/KK/numero.txt
$ tar -C /tmp/KK -acvf cc_$(date -I).tar.xz -g info.snap .
$ echo a > /tmp/KK/letra.txt
$ cp info.snap tmp.snap
$ tar -C /tmp/KK -acvf cd1_$(date -I).tar.xz -g tmp.snap .
$ echo 2 > /tmp/KK/numero.txt
$ rm /tmp/KK/letra.txt
$ cp info.snap tmp.snap
$ tar -C /tmp/KK -acvf cd2_$(date -I).tar.xz -g tmp.snap .

Obviamente, para restaurar sólo hay que usar la copia completa y la última copia diferencial:

$ mkdir /tmp/KK2
$ tar -C /tmp/KK2 -axGvf cc_*.tar.xz
$ tar -C /tmp/KK2 -axGvf cd2_*.tar.xz

Notas al pue

1

Existe también la opción -r que añade indiscriminadamente más archivos al final del paquete. Existiendo la opción -u que excluirá aquellos archivos ya existentes que no han cambiado, -r queda sin utilidad.

2

Obvio, porque recordemos que el acceso es secuencial.