La forma más sencilla y directa que he encontrado para realizar este tipo de tareas, es mediante el uso de rsnapshot. A pesar de que podemos utilizar rsync + tar en la manera tradicional, la restauración se hace un poco engorrosa, y no siempre se obtiene una imagen exacta, suele ser necesario reinstalar software y tocar algo los symlinks.

Instalación de rsnapshot

pkg install rsnapshot
cp /usr/local/etc/rsnapshot.conf.default /usr/local/etc/rsnapshot.conf

Configuración

Necesitamos editar y adaptar a nuestras necesidades el fichero anteriormente mencionado, y que contiene la configuración de rsnapshot

Directorio de destino de las copias

###########################
# SNAPSHOT ROOT DIRECTORY #
###########################

# All snapshots will be stored under this root directory.
#
snapshot_root   /.snapshots/

Retención

En este caso haremos que la política de retención sea de 7 copias. Esto va a depender de cuán a menudo las programemos.

#########################################
#     BACKUP LEVELS / INTERVALS         #
# Must be unique and in ascending order #
# e.g. alpha, beta, gamma, etc.         #
#########################################

#retain alpha   6
retain  beta    7
#retain gamma   4
#retain delta   3

Registro

Quitamos el comentario a la línea de forma que podamos auditar el proceso de cada copia.

# If you enable this, data will be written to the file you specify. The
# amount of data written is controlled by the "loglevel" parameter.
#
logfile        /var/log/rsnapshot

Argumentos

Dado que rsnapshot se basa en rsync , hay ciertos argumentos a los que debemos establecer su uso para hacer que la copia sea lo más parecida al sistema original.

# Default rsync args. All rsync commands have at least these options set.
#
rsync_short_args        -aAHX
rsync_long_args --delete --numeric-ids --relative --delete-excluded --no-D --fileflags

Qué se copia y qué se excluye

Estas secciones se dedican a incluir o excluir de la copia ciertos directorios o ficheros. En este caso eliminaremos los directorios dinámicos, ya que no tiene sentidp por ejemplo, hacer copia de los PID de los procesos en ejecución. Entre otras cosas.

# The include and exclude parameters, if enabled, simply get passed directly
# to rsync. If you have multiple include/exclude patterns, put each one on a
# separate line. Please look up the --include and --exclude options in the
# rsync man page for more details on how to specify file name patterns.
#
#include        ???
#include        ???
#exclude        ???
#exclude        ???
exclude /dev/
exclude /mnt/
exclude /proc/
exclude /tmp/
exclude /usr/ports/
exclude /usr/src/
exclude /var/empty/
exclude /var/run/
exclude /var/tmp/
exclude /.snapshots/

Y por último indicamos que el punto de inicio de la copia sea la raíz del sistema de ficheros.

###############################
### BACKUP POINTS / SCRIPTS ###
###############################

# LOCALHOST
backup  /               localhost/

Comprobación

Antes de lanzarnos a utilizar esta nueva configuración, comprobamos que no tiene errores. El fichero de configuración de rsnapshot , sólo acepta TAB como separador, con lo que es muy sencillo meter la pata.

rsnapshot -t beta
root@freebsd:~ # rsnapshot -t beta
echo 1756 > /var/run/rsnapshot.pid 
mv /.snapshots/beta.1/ /.snapshots/beta.2/ 
mv /.snapshots/beta.0/ /.snapshots/beta.1/ 
/usr/local/bin/rsync -aAHX --delete --numeric-ids --relative \
    --delete-excluded --no-D --fileflags --exclude=/dev/ --exclude=/mnt/ \
    --exclude=/proc/ --exclude=/tmp/ --exclude=/usr/ports/ \
    --exclude=/usr/src/ --exclude=/var/empty/ --exclude=/var/run/ \
    --exclude=/var/tmp/ --exclude=/.snapshots/ --filter=-/_/.snapshots \
    --link-dest=/.snapshots/beta.1/localhost/ / \
    /.snapshots/beta.0/localhost/ 
touch /.snapshots/beta.0/ 

Esta salida corresponde a un sistema que ya tiene copias programadas, por eso ya existe el destino beta.1.

Flags

Debido a que utilizamos --fileflags para preservarlas en el destino de copia y restaurarlas en caso necesario en el sistema a recuperar, hemos de resetear las mismas en el directorio de destino de las copias, para evitar que rsnapshot rote el propio directorio de destino.

chflags -R 0 /.snapshots/

Programación

A continuación programamos la copia para que se realice automáticamente con la periodicidad que necesitemos. Recordemos que la periodicidad y la retención trbajan juntas para mantener copias durante un cierto período de tiempo.

Es decir, con una retención de 7 y una copia programada cada 12 horas, dispondremos tan sólo de 3 días y medio de copias de seguridad. Atención a este detalle.

root@freebsd:~ # crontab -l
0 10 * * * chflags -R 0 /.snapshots/; rsnapshot beta; tar acf /.snapshots/`date + "%m%d%y"`.backup.tar.bz2 -C /.snapshots/beta.0/localhost .

En este caso concreto dispondríamos de 1 semana de copias diarias completas. Además cada copia se empaqueta marcando la fecha en la que se realiza. De esta forma es más sencillo trasladarla si, como en este ejemplo, estamos copiando en el mismo sistema. Esto no se recomienda y sólo se realiza con propósito educativo.

Restauración

El proceso de restauración es tan sencillo como extraer y sobreescribir los ficheros que necesitemos de la fecha de copia adecuada en el mismo sistema. O si bien hemos de restaurar el sistema desde cero, tras la instalación del mismo:

tar -xf 111322.backup.tar.bz2 -C / --clear-nochange-fflags