El problema de guardar una copia completa cada día es el espacio: si tenemos 10 GB de
datos y hacemos copias durante 30 días, ocupamos 300 GB aunque los archivos apenas hayan
cambiado. La opción --link-dest de rsync
resuelve esto: crea una copia completa en apariencia pero solo almacena los archivos
que han cambiado; el resto son enlaces físicos al día anterior.
La idea es mantener un directorio por fecha y pasar el del día anterior como referencia:
rsync -a --link-dest=/mnt/backup/2011-10-01 /var/www/ /mnt/backup/2011-10-02/
Los archivos sin cambios en 2011-10-02/ no ocupan espacio extra: son enlaces físicos al
mismo inodo en 2011-10-01/. Solo los archivos nuevos o modificados se copian realmente.
En un script podemos automatizarlo calculando la fecha de hoy y la de ayer:
#!/bin/bash
HOY=$(date +%Y-%m-%d)
AYER=$(date -d "yesterday" +%Y-%m-%d)
DESTINO="/mnt/backup"
rsync -a --link-dest="$DESTINO/$AYER" /var/www/ "$DESTINO/$HOY/"
Si la copia del día anterior no existe (por ejemplo, la primera vez), rsync muestra un
aviso (--link-dest arg does not exist) pero hace una copia completa igualmente.
Para borrar copias antiguas cuando el disco empiece a llenarse podemos usar
du para identificar qué fechas ya no necesitamos
y borrarlas con rm -rf. Aunque borremos un directorio, los archivos compartidos por
enlaces físicos en otras fechas no se eliminan hasta que se borra el último enlace.