5.5.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:

-u[1]

La opción permite actualizar (update) el paquete añadiendo al final nuevos archivos o archivos modificados. Es importante entender que no se sustituye la versión antigua del archivo, sino que se añade al final. Además, sólo pueden actualizarse archivos 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 paquete[2], 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 archivos a extraer.

-g <SNAP>

Puede servirnos para hacer tanto copias incrementales como copias diferenciales. La opción introduce el nombre del archivo snap que se toma como referencia al hacer una nueva copia de seguridad.

Copias incrementales

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

$ mkdir /tmp/KK
$ echo 1 > /tmp/KK/version

Hacemos una copia completa de los datos:

$ tar -C /tmp/KK -acvf copia1c.tar.xz -g info.snap .

Tiempo después podemos hacer añadir un archivo y hacer una copia incremental para lo cual debemos tomar como referencia (con -g) el snap de la copia anterior:

$ echo a > /tmp/KK/letra.txt
$ echo 2 > /tmp/KK/version
$ tar -C /tmp/KK -acvf copia1c1i.tar.xz -g info.snap .

La copia incremental contendrá letra.txt y version ya que ha cambiado de contenido. El archivo snap, además, cambia también y registra el estado en que quedamos al completar la copia incremental. Más adelante podríamos modificar la versión y eliminar el archivo letra.txt:

$ echo 3 > /tmp/KK/version
$ rm /tmp/KK/letra.txt
$ tar -C /tmp/KK -acvf copia1c2i.tar.xz -g info.snap .

En esta ocasión el efecto de la copia incremental debería ser modificar version 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:

$ mkdir /tmp/KK2
$ tar -C /tmp/KK2 -axGvf copia1c.tar.xz
$ tar -C /tmp/KK2 -axGvf copia1c1i.tar.xz
$ tar -C /tmp/KK2 -axGvf copia1c2i.tar.xz

Nota

El archivo snap no se inspecciona al restaurar, así que es absolutamente irrelevante.

Copias diferenciales

En ellas se almacenan todas las modificaciones desde la última copia completa. En consecuencia, la referencia para hacer las copias diferenciales siempre tiene que ser el archivo snap generado al hacer la copia completa. Para lograrlo, basta con hacer copiar y usar esta copia como referencia:

$ mkdir /tmp/KK
$ echo 1 > /tmp/KK/version
$ tar -C /tmp/KK -acvf copia1c.tar.gz -g info.snap .
$ echo a > /tmp/KK/letra.txt
$ echo 2 > /tmp/KK/version
$ cp info.snap temp.snap
$ tar -C /tmp/KK -acvf copia1c1d.tar.xz -g temp.snap .
$ echo 2 > /tmp/KK/numero.txt
$ rm /tmp/KK/letra.txt
$ cp info.snap temp.snap
$ tar -C /tmp/KK -acvf copia1c2d.tar.xz -g temp.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 copia1c.tar.xz
$ tar -C /tmp/KK2 -axGvf copia1c2d.tar.xz

Notas al pue