Hacer copias de seguridad incrementales con rsnapshot
Vamos a ver la herramienta «rsnapshot», que permite la realización copias de seguridad «backups» incrementales, tanto de forma local como remota.
Una de las medidas básicas de seguridad es la realización de respaldos de los datos. Una buena política de copias de seguridad te servirá, ante un desastre, como pérdida de un disco duro o un ataque ramsonware, para recuperar tus datos y poder seguir trabajando.
Sumario
- Que es rsnapshot
- Instalación de rsnapshot
- Configuración de rsnapshot
- Hacemos una copia de seguridad
- Programar las copias con «cron»
- Utilidades
- Copias de seguridad remotas con ssh
Que es rsnapshot
«rsnapshot» es una herramienta, escrita en Perl sin dependencias de módulos, que permite crear backups incrementales. Esta utilidad realiza instantaneas de los datos aumentando el rendimiento del proceso. Se trata de un backend del versátil comando «rsync» que ofrece automatizar las copias, tanto en máquinas locales, como remotas a través de ssh.
La primera copia será total y en las sucesivas solo respaldará los datos nuevos o los modificados y haciendo uso de enlaces duros, economizará el espacio ocupado en disco.
La configuración de este sistema no es demasiado compleja, permitiendo personalizar el intervalo de realización de las copias. Podremos definir las copias por hora, diaria, semanal, mensual y anualmente. También podremos establecer el número de copias que el sistema debe guardar.
Los ficheros podrán ser restaurados por el usuario root, como es lógico, pero también por otros usuarios con permisos suficientes, sin requerir la intervención de root.
Tienes más información sobre lo que son las copias de seguridad y sus tipos en «Copias de seguridad o respaldo».
También encontrarás un programa para hacer copias de seguridad en «Programa para sincronizar directorios en un servidor remoto» .
Vamos con rsnapsot.
Instalación de rsnapshot
El primer paso es instalar rsync
sudo apt install rsync
Para instalar rsnapshot, según tu sistema linux, tendrás que ejecutar los siguientes comandos.
En distribuciones basadas en Debian, como Ubuntu y derivados:
sudo apt install rsnapshot
En Debian 11 Bullseye, te dirá que no encuentra el paquete a instalar, necesitarás añadir el repositorio «http://ftp.de.debian.org/debian bullseye-backports main» a tu fichero «sources.list».
Edita el fichero con
sudo nano /etc/apt/sources.list
Y añade el repositorio. Encontrarás más información en la página oficial de paquetes de Debian. También lo puedes hacer ejecutando
sudo add-apt-repository deb http://ftp.de.debian.org/debian bullseye-backports main # y sudo apt update

Y lo instalas con el comando anterior.
En RHEL, CentOS, Fedora, Alma Linux y derivados:
sudo yum install rsnapshot # o sudo dnf install rsnapshot
Para Arch Linux, Manjaro y derivados:
sudo pacman -S rsnapshot
En OpenSUSE y derivados:
sudo zypper install rsnapshot

Configuración de rsnapshot
Lo principal a tener en cuenta a la hora de configurar la herramienta es determinar donde se guardarán las copias. En este ejemplo las guardaremos en el mismo disco, en el directorio «/backup» lo que no es muy recomendable, pero para ver como funciona será suficiente. Si lo quieres guardar en otro disco duro, por ejemplo, tienes el sistema en «sda1» y lo quieres guardar en «sdb1», deberas montar «sdb1», en «/mnt/backups» o donde te parezca mejor. Lo vemos luego en el fichero de configuración.
El fichero de configuración lo encontramos en la ruta «/etc/rsnapshot.conf». Lo editamos con nuestro editor favorito.
sudo nano /etc/rsnapshot.conf
La herramienta rsnapshot, no tiene la capacidad de reproducir los espacios en blanco, debes utilizar la tabulación «tecla Tab»
Lo primero que tenemos que configurar es la ubicación donde se guardan los backups. Para ello buscamos la linea siguiente
snapshot_root /var/cache/rsnapshot/
En nuestro ejemplo lo modificamos por «/backup/». Si como hemos dicho antes, lo quieres guardar en otro disco, tendrás que poner la ruta a ese otro disco, por ejemplo «snapshot_root /mnt/backup/». Recuerda que hay que tabular.
snapshot_root /backup/
Veamos los valores más importantes que podemos configurar, además de la ruta que ya hemos comentado.
no_create_root
no_create_root indica si se crea automáticamente el directorio destino especificado en «rsnapshot_root», nos será de utilidad para unidades extraíbles.
cmd_cp /bin/cp
«cmd_cp» establece la ruta al comando «cp». Normalmente no será necesario modificarlo.
cmd_rm /bin/rm
«cmd_rm» establece la ruta al comando «rm». Lo dejamos como está.
cmd_rsync /bin/bin/rsync
«cmd_rsync» establece la ruta al comando «rsync». Lo dejamos como está.
cmd_ssh /usr/bin/ssh
Descomentamos, borrando «#» al inicio de la linea «cmd_ssh» para habilitar las copias de seguridad remotas de rsync a través de ssh.

cmd_du /usr/bin/du
La linea «cmd_du» la descomentamos, lo que nos permitirá saber el espacio que las copias ocupan en el disco.
cmd_rsnapshot_diff /usr/bin/rsnapshot-diff
Con la linea anterior descomentada, podremos ver las diferencias entre varias copias.

En la sección «BACKUP LEVELS/INTERVALS», indicaremos la política de copias a realizar, por defecto viene «alfa 6» que hará una copia cada dia, manteniendo las 6 de los últimos dias, «beta 7» ejecutará una cada semana, manteniendo las últimas 7, «gamma 4» una cada mes, manteniendo las 4 últimas y «delta 3» realizará una copia cada año, manteniendo las últimas 5 copias.
Como ves la correspondencia entre los nombres es:
- retain alpha: Diarias.
- retain beta: Semanales.
- retain gamma: Mensuales.
- retain delta: Anuales (por defecto viene deshabilitado).

En función de tus necesidades tendrás que variar estos valores. Unos más lógicos pueden ser:
- retain alpha 4
- retain beta 3
- retain gamma 1
- retain delta 3
Mi fichero de configuración queda como sigue.
################################################# # rsnapshot.conf - rsnapshot configuration file # ################################################# # # # PLEASE BE AWARE OF THE FOLLOWING RULE: # # # # This file requires tabs between elements # # # ################################################# ####################### # CONFIG FILE VERSION # ####################### config_version 1.2 ########################### # SNAPSHOT ROOT DIRECTORY # ########################### # All snapshots will be stored under this root directory. # snapshot_root /backup/ <---------Cambiar por el destino que quieras # If no_create_root is enabled, rsnapshot will not automatically create the # snapshot_root directory. This is particularly useful if you are backing # up to removable media, such as a FireWire or USB drive. # #no_create_root 1 ################################# # EXTERNAL PROGRAM DEPENDENCIES # ################################# # LINUX USERS: Be sure to uncomment "cmd_cp". This gives you extra features. # EVERYONE ELSE: Leave "cmd_cp" commented out for compatibility. # # See the README file or the man page for more details. # cmd_cp /bin/cp # uncomment this to use the rm program instead of the built-in perl routine. # cmd_rm /bin/rm # rsync must be enabled for anything to work. This is the only command that # must be enabled. # cmd_rsync /usr/bin/rsync # Uncomment this to enable remote ssh backups over rsync. # cmd_ssh /usr/bin/ssh <---------Descomentar para copias remotas # Comment this out to disable syslog support. # cmd_logger /usr/bin/logger # Uncomment this to specify the path to "du" for disk usage checks. # If you have an older version of "du", you may also want to check the # "du_args" parameter below. # cmd_du /usr/bin/du <---------Descomentar # Uncomment this to specify the path to rsnapshot-diff. # cmd_rsnapshot_diff /usr/bin/rsnapshot-diff <---------Descomentar # Specify the path to a script (and any optional arguments) to run right # before rsnapshot syncs files # #cmd_preexec /path/to/preexec/script # Specify the path to a script (and any optional arguments) to run right # after rsnapshot syncs files # #cmd_postexec /path/to/postexec/script # Paths to lvcreate, lvremove, mount and umount commands, for use with # Linux LVMs. # #linux_lvm_cmd_lvcreate /sbin/lvcreate #linux_lvm_cmd_lvremove /sbin/lvremove #linux_lvm_cmd_mount /bin/mount #linux_lvm_cmd_umount /bin/umount ######################################### # BACKUP LEVELS / INTERVALS # # Must be unique and in ascending order # # e.g. alpha, beta, gamma, etc. # ######################################### retain alpha 4 <---------Establece los valores que necesites retain beta 3 retain gamma 1 #retain delta 3 ############################################ # GLOBAL OPTIONS # # All are optional, with sensible defaults # ############################################ # Verbose level, 1 through 5. # 1 Quiet Print fatal errors only # 2 Default Print errors and warnings only # 3 Verbose Show equivalent shell commands being executed # 4 Extra Verbose Show extra verbose information # 5 Debug mode Everything # verbose 2 # Same as "verbose" above, but controls the amount of data sent to the # logfile, if one is being used. The default is 3. # If you want the rsync output, you have to set it to 4 # loglevel 3 # 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.log # If enabled, rsnapshot will write a lockfile to prevent two instances # from running simultaneously (and messing up the snapshot_root). # If you enable this, make sure the lockfile directory is not world # writable. Otherwise anyone can prevent the program from running. # lockfile /var/run/rsnapshot.pid # By default, rsnapshot check lockfile, check if PID is running # and if not, consider lockfile as stale, then start # Enabling this stop rsnapshot if PID in lockfile is not running # #stop_on_stale_lockfile 0 # Default rsync args. All rsync commands have at least these options set. # #rsync_short_args -a #rsync_long_args --delete --numeric-ids --relative --delete-excluded # ssh has no args passed by default, but you can specify some here. # #ssh_args -p 22 # Default arguments for the "du" program (for disk space reporting). # The GNU version of "du" is preferred. See the man page for more details. # If your version of "du" doesn't support the -h flag, try -k flag instead. # #du_args -csh # If this is enabled, rsync won't span filesystem partitions within a # backup point. This essentially passes the -x option to rsync. # The default is 0 (off). # #one_fs 0 # 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 ??? # The include_file and exclude_file parameters, if enabled, simply get # passed directly to rsync. Please look up the --include-from and # --exclude-from options in the rsync man page for more details. # #include_file /path/to/include/file #exclude_file /path/to/exclude/file # If your version of rsync supports --link-dest, consider enabling this. # This is the best way to support special files (FIFOs, etc) cross-platform. # The default is 0 (off). # #link_dest 0 # When sync_first is enabled, it changes the default behaviour of rsnapshot. # Normally, when rsnapshot is called with its lowest interval # (i.e.: "rsnapshot alpha"), it will sync files AND rotate the lowest # intervals. With sync_first enabled, "rsnapshot sync" handles the file sync, # and all interval calls simply rotate files. See the man page for more # details. The default is 0 (off). # #sync_first 0 # If enabled, rsnapshot will move the oldest directory for each interval # to [interval_name].delete, then it will remove the lockfile and delete # that directory just before it exits. The default is 0 (off). # #use_lazy_deletes 0 # Number of rsync re-tries. If you experience any network problems or # network card issues that tend to cause ssh to fail with errors like # "Corrupted MAC on input", for example, set this to a non-zero value # to have the rsync operation re-tried. # #rsync_numtries 0 # LVM parameters. Used to backup with creating lvm snapshot before backup # and removing it after. This should ensure consistency of data in some special # cases # # LVM snapshot(s) size (lvcreate --size option). # #linux_lvm_snapshotsize 100M # Name to be used when creating the LVM logical volume snapshot(s). # #linux_lvm_snapshotname rsnapshot # Path to the LVM Volume Groups. # #linux_lvm_vgpath /dev # Mount point to use to temporarily mount the snapshot(s). # #linux_lvm_mountpath /path/to/mount/lvm/snapshot/during/backup ############################### ### BACKUP POINTS / SCRIPTS ### ############################### # LOCALHOST backup /home/ localhost/ backup /etc/ localhost/ backup /usr/local/ localhost/ #backup /var/log/rsnapshot localhost/ #backup /etc/passwd localhost/ #backup /home/foo/My Documents/ localhost/ #backup /foo/bar/ localhost/ one_fs=1,rsync_short_args=-urltvpog #backup_script /usr/local/bin/backup_pgsql.sh localhost/postgres/ # You must set linux_lvm_* parameters below before using lvm snapshots #backup lvm://vg0/xen-home/ lvm-vg0/xen-home/ # EXAMPLE.COM #backup_exec /bin/date "+ backup of example.com started at %c" #backup root@example.com:/home/ example.com/ +rsync_long_args=--bwlimit=16,exclude=core #backup root@example.com:/etc/ example.com/ exclude=mtab,exclude=core #backup_exec ssh root@example.com "mysqldump -A > /var/db/dump/mysql.sql" #backup root@example.com:/var/db/dump/ example.com/ #backup_exec /bin/date "+ backup of example.com ended at %c" # CVS.SOURCEFORGE.NET #backup_script /usr/local/bin/backup_rsnapshot_cvsroot.sh rsnapshot.cvs.sourceforge.net/ # RSYNC.SAMBA.ORG #backup rsync://rsync.samba.org/rsyncftp/ rsync.samba.org/rsyncftp/
Ten en cuenta que no debes incluir los comentarios que he añadido tras «<———Comentario».
En cada directiva tienes explicación suficiente para configurarlo a tu gusto.
Otras directivas importantes las encontramos en la linea
logfile /var/log/rsnapshot.log
Que nos muestra la ubicación del fichero de log. Y en la seccion «BACKUP POINT/SCRIPTS», puedes establecer los directorios de los que quieres hacer copias de seguridad y la ubicación donde los guardará. Si ponemos «localhost/» lo guardará en el directorio indicado en «snapshot_root» (/backup) y si ponemos, por ejemplo «datos/» nos lo guardaría en «/backup/datos/»
Los parámetros de inclusión y exclusión, si están habilitados, simplemente se pasan directamente a rsync. Si tienes varios patrones de inclusión/exclusión, coloca cada uno en una línea separada.

En la sección «BACKUP POINTS / SCRIPTS», veremos,
- backup /home/ localhost/
- backup /etc/ localhost/
- backup /usr/local/ localhost/
Además tienes opciones para ejecutar un script previo o gestionar un sistema LVM entre otras directivas.
Terminada la configuración guardamos el fichero y cerramos el editor.
Para verificar que la configuración es correcta.
rsnapshot configtest

Si nos dice «Syntax OK», perfecto, la configuración es correcta.
Hacemos una copia de seguridad
Y hacemos la prueba definitiva ejecutando una copia diaria.
rsnapshot -t alpha

Podemos ver que se creado el directorio «/backup» y dentro de este «/alpha.0», con la copia realizada.
Programar las copias con «cron»
Finalmente solo nos quedará programar las tares de ejecución de la herramienta con «cron». El fichero de configuración lo encontramos en la ruta «/etc/cron.d/rsnapshot», por ejemplo mi fichero es el siguiente:
# 0 */4 * * * root /usr/bin/rsnapshot alpha # 30 3 * * * root /usr/bin/rsnapshot beta # 0 3 * * 1 root /usr/bin/rsnapshot gamma # 30 2 1 * * root /usr/bin/rsnapshot delta

Si quieres ejecutar la copia de seguridad todos los días a las 00:00 horas, añade la siguiente linea al fichero.
0 0 * * * /usr/bin/rsnapshot alpha
Utilidades
Vamos a ver para qué hemos descomentado algunas lineas en el fichero de configuración. Eso nos permite ejecutar algunos comandos. Por ejemplo, para comprobar el espacio ocupado en disco.
sudo rsnapshot du
Y para ver las diferencias entre distintas copias
sudo rsnapshot-diff -vsHi /backup/daily.0 /backup/daily.1
Tienes la información de este comando ejecutando
rsnapshot-diff -h
Copias de seguridad remotas con ssh
Ya hemos configurado rsnapshot para utilizar ssh. Pero deberemos instalar el servicio ssh en los dos equipos, el origen de la copia (cliente) y el destino (servidor). En los sistemas Debian el cliente ssh viene instalado por defecto, por lo tanto no necesitamos instalar nada en el equipo cliente origen de la copia.
En el servidor ejecuta
sudo apt install openssh-server
Ahora generamos las claves en el servidor que recibirá las copias.
ssh-keygen
Pulsamos «enter» en todas las preguntas. Es recomendable no poner «passphrase» para que despues no pida la clave en cada conexión.
El comando crea dos claves
- Clave Privada en: /home/user/.ssh/id_rsa
- Clave Pública en: /home/user/.ssh/id_rsa.pub
El siguiente paso será copiar la clave publica «id_rsa.pub» en equipo origen de la copia (cliente).
ssh-copy-id -i /home/user-servidor/.ssh/id_rsa.pub user_cliente@Ip_equipo_cliente
Nos pide el password de user_cliente en equipo_cliente.
Comprobamos que nos podemos loguear automaticamente creando una conexión ssh desde el equipo origen (cliente)
ssh user_servidor@Ip_servidor
Si se establece la conexión sin pedir la clave todo estará correcto.
Configuración de rsnapshot en el servidor_destino para la copia de seguridad remota.
Todas las configuraciones se realizan en el equipo_cliente (origen de los datos) exactamente igual que hemos hecho antes, solo cambiaremos la sección «backup».
Editamos el fichero de configuración
sudo nano /etc/cron.d/rsnapshot
Y cambiamos en la sección «backup» donde pondremos la siguientes lineas.
backup user_destino@Ip_destino:/home/ servidor_backup/ backup user_destino@Ip_destino:/etc/ servidor_backup/ backup user_destino@Ip_destino:/usr/local/ servidor_backup/
Para comprobar la correcta configuración de rsnapshot ejecutamos la siguiente orden
sudo rsnapshot configtest
Comprobamos que funciona realizando la primera copia de seguridad con el comando,
sudo rsnapshot daily
Nota: Las denominaciones «alpha, beta , gamma y delta», las puedes modificar en el fichero de configuración y sustituirlas por «dia, semana, mes y año».
Si tienes algún comentario que hacer sobre este artículo, al pie del post tienes un formulario para hacerlo.
Si quieres contactar conmigo por cualquier otro asunto relacionado con el sitio, en la página de contacto, tienes un formulario más adecuado.
Y para suscribirte y recibir las novedades publicadas, tienes un enlace en pie de la página o desde aquí mismo.