Copia de seguridad y restauración en FreeBSD
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