rsnapshot es una herramienta de copias de seguridad basada en rsync que guarda instantáneas completas del sistema de archivos, pero solo ocupa espacio por los archivos que cambian: los que no se han modificado se enlazan con enlaces duros a la instantánea anterior. En este tutorial configurarás rsnapshot en Ubuntu 24.04 para copiar directorios locales y un servidor remoto por SSH, programarás instantáneas diarias, semanales y mensuales con cron y aprenderás a restaurar archivos.

Requisitos previos

Para seguir esta guía necesitas:

  • Un servidor con Ubuntu 24.04 LTS que hará de servidor de copias, por ejemplo un VPS de CubePath.
  • Un usuario no root con privilegios sudo.
  • Un disco o volumen dedicado para las copias, montado en /backup (recomendado). Guardar las copias en el mismo disco que los datos no protege frente a un fallo de disco.
  • Opcional: un segundo servidor (el que quieres respaldar) accesible por SSH desde el servidor de copias.

Cómo funciona rsnapshot

rsnapshot mantiene varios niveles de retención, por ejemplo diario, semanal y mensual. Cada nivel tiene un número de copias numeradas (diario.0, diario.1...), donde .0 es la más reciente.

  • Solo el nivel más bajo (diario) ejecuta rsync y copia datos nuevos. Antes de hacerlo, rota las copias existentes y crea diario.0 a partir de la anterior usando enlaces duros.
  • Los niveles superiores no copian nada: semanal toma la copia diario más antigua y la convierte en semanal.0, y así sucesivamente.
  • Cada instantánea es un árbol de directorios normal. Para restaurar basta con copiar archivos con cp o rsync, sin herramientas especiales.

La contrapartida es que las copias no están cifradas ni comprimidas. Si necesitas cifrado o deduplicación a nivel de bloque, BorgBackup o Restic encajan mejor.

Paso 1: Instalar rsnapshot

rsnapshot está en los repositorios oficiales de Ubuntu e instala rsync como dependencia:

sudo apt update
sudo apt install rsnapshot

Comprueba la versión instalada:

rsnapshot -V
rsnapshot 1.4.5

El paquete crea el archivo de configuración /etc/rsnapshot.conf y un archivo de ejemplo de cron en /etc/cron.d/rsnapshot con todas las líneas comentadas.

Paso 2: Preparar el directorio de las copias

Crea el directorio donde se guardarán las instantáneas dentro del volumen de copias:

sudo mkdir -p /backup/rsnapshot
sudo chmod 700 /backup/rsnapshot

Los permisos 700 son importantes: las instantáneas contienen copias de archivos como /etc/shadow o claves privadas, y solo root debe poder leerlas.

Comprueba que /backup está realmente en el disco de copias y no en el disco del sistema:

df -h /backup
Filesystem      Size  Used Avail Use% Mounted on
/dev/vdb1       196G   28K  186G   1% /backup

Paso 3: Configurar rsnapshot

Guarda una copia del archivo original antes de editarlo:

sudo cp /etc/rsnapshot.conf /etc/rsnapshot.conf.orig

Abre el archivo:

sudo nano /etc/rsnapshot.conf

Ajusta las siguientes directivas. Algunas ya existen y otras están comentadas con #; descoméntalas y cambia su valor:

snapshot_root	/backup/rsnapshot/
no_create_root	1

cmd_cp		/bin/cp
cmd_rm		/bin/rm
cmd_rsync	/usr/bin/rsync
cmd_ssh		/usr/bin/ssh
cmd_logger	/usr/bin/logger
cmd_du		/usr/bin/du

retain	diario	7
retain	semanal	4
retain	mensual	6

verbose		2
loglevel	3
logfile		/var/log/rsnapshot.log
lockfile	/var/run/rsnapshot.pid

Qué hace cada bloque:

  • snapshot_root es el destino de las copias. Con no_create_root 1, rsnapshot no crea el directorio si no existe: si el disco de copias no está montado, la copia falla en lugar de llenar el disco del sistema.
  • cmd_ssh es necesario para respaldar servidores remotos. cmd_du habilita el comando rsnapshot du.
  • Las líneas retain sustituyen a las alpha, beta y gamma del archivo original: 7 copias diarias, 4 semanales y 6 mensuales. Los nombres son libres, pero el orden importa: de menor a mayor intervalo. Comenta o elimina las líneas retain originales.

Definir qué se copia

Al final del archivo están las líneas backup. El formato es backup, origen y un subdirectorio de destino dentro de cada instantánea, separados por tabuladores. Sustituye los ejemplos por los directorios que quieres proteger:

backup	/etc/		localhost/
backup	/home/		localhost/
backup	/var/www/	localhost/
backup	/usr/local/	localhost/

Excluir archivos

Para no copiar cachés ni archivos temporales, añade exclusiones globales con la directiva exclude. Usan la sintaxis de patrones de rsync:

exclude	*.tmp
exclude	.cache/
exclude	node_modules/

Guarda el archivo y comprueba la sintaxis:

sudo rsnapshot configtest
Syntax OK

Si ves un error, casi siempre se debe a espacios en lugar de tabuladores en la línea indicada, o a un directorio sin / final.

Paso 4: Ejecutar la primera copia

Antes de copiar nada, ejecuta rsnapshot en modo de prueba con -t. Muestra los comandos que ejecutaría sin hacer cambios:

sudo rsnapshot -t diario
echo 12345 > /var/run/rsnapshot.pid
mkdir -m 0755 -p /backup/rsnapshot/diario.0/
/usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded \
    --exclude=*.tmp --exclude=.cache/ --exclude=node_modules/ /etc \
    /backup/rsnapshot/diario.0/localhost/
...

Si los comandos son correctos, lanza la primera copia real. Puede tardar un rato, porque copia todos los datos desde cero:

sudo rsnapshot diario

Comprueba el resultado:

sudo ls /backup/rsnapshot/ /backup/rsnapshot/diario.0/localhost/
/backup/rsnapshot/:
diario.0

/backup/rsnapshot/diario.0/localhost/:
etc  home  usr  var

Las rutas se conservan completas gracias a la opción --relative de rsync: /etc/nginx/nginx.conf queda en diario.0/localhost/etc/nginx/nginx.conf.

Paso 5: Comprobar que las copias son incrementales

Ejecuta una segunda copia:

sudo rsnapshot diario

Ahora existen diario.0 y diario.1. Los archivos que no han cambiado son el mismo archivo en disco (mismo inodo) con dos nombres. Compruébalo con stat, que muestra el número de enlaces y el inodo:

sudo stat -c '%h enlaces, inodo %i: %n' /backup/rsnapshot/diario.{0,1}/localhost/etc/hostname
2 enlaces, inodo 1835021: /backup/rsnapshot/diario.0/localhost/etc/hostname
2 enlaces, inodo 1835021: /backup/rsnapshot/diario.1/localhost/etc/hostname

Para ver cuánto espacio real ocupa cada instantánea, usa rsnapshot du. La primera muestra el tamaño total y las siguientes solo lo que cambió:

sudo rsnapshot du
2.1G	/backup/rsnapshot/diario.0/
4.0M	/backup/rsnapshot/diario.1/
2.1G	total

Paso 6: Añadir un servidor remoto por SSH

rsnapshot puede traer datos de otros servidores en modo "pull": el servidor de copias se conecta por SSH y ejecuta rsync contra el remoto. Así el servidor respaldado no tiene acceso a las copias, lo que las protege si ese servidor queda comprometido.

Para leer todos los archivos del remoto, la conexión se hace como root. En el servidor de copias, crea una clave SSH para root sin frase de paso (la necesita cron para ejecutarse sin intervención):

sudo ssh-keygen -t ed25519 -f /root/.ssh/rsnapshot_ed25519 -N '' -C 'rsnapshot'

Muestra la clave pública:

sudo cat /root/.ssh/rsnapshot_ed25519.pub

En el servidor remoto, añádela a /root/.ssh/authorized_keys limitando el origen a la IP del servidor de copias con la opción from. Sustituye backup_server_ip por esa IP y pega la clave completa:

sudo nano /root/.ssh/authorized_keys
from="backup_server_ip",no-agent-forwarding,no-port-forwarding,no-pty,no-X11-forwarding ssh-ed25519 AAAAC3Nza... rsnapshot

Ubuntu permite por defecto el acceso de root solo con clave (PermitRootLogin prohibit-password), así que no hace falta cambiar la configuración de SSH.

Desde el servidor de copias, prueba la conexión. La primera vez acepta la huella del host para que quede en known_hosts de root:

sudo ssh -i /root/.ssh/rsnapshot_ed25519 root@your_server_ip hostname
web01

Ahora indica a rsnapshot que use esa clave y añade las líneas backup del remoto en /etc/rsnapshot.conf:

sudo nano /etc/rsnapshot.conf
ssh_args	-i /root/.ssh/rsnapshot_ed25519

backup	root@your_server_ip:/etc/	web01/
backup	root@your_server_ip:/var/www/	web01/
backup	root@your_server_ip:/home/	web01/

Asegúrate de que rsync está instalado también en el servidor remoto (sudo apt install rsync). Verifica la sintaxis y ejecuta una copia:

sudo rsnapshot configtest
sudo rsnapshot diario
sudo ls /backup/rsnapshot/diario.0/
localhost  web01

Paso 7: Programar las copias con cron

El paquete incluye /etc/cron.d/rsnapshot, pero con otros nombres de nivel. Sustituye su contenido:

sudo nano /etc/cron.d/rsnapshot
# m  h  dom mon dow  usuario  comando
30 2  1   *   *    root     /usr/bin/rsnapshot mensual
0  3  *   *   0    root     /usr/bin/rsnapshot semanal
30 3  *   *   *    root     /usr/bin/rsnapshot diario

Con esta programación:

  • Cada día a las 03:30 se hace la copia diario.
  • Los domingos a las 03:00 se ejecuta la rotación semanal, y el día 1 de cada mes a las 02:30 la mensual.
  • Los niveles superiores se programan antes que el diario porque solo mueven directorios y terminan en segundos. Si coincidieran a la vez, el archivo de bloqueo haría que uno de ellos fallara.

Los archivos de /etc/cron.d no necesitan recargar cron. Al día siguiente, comprueba en el registro que la copia terminó:

sudo tail -n 3 /var/log/rsnapshot.log
[2026-09-26T03:30:01] /usr/bin/rsnapshot diario: started
[2026-09-26T03:30:01] echo 41233 > /var/run/rsnapshot.pid
[2026-09-26T03:41:17] /usr/bin/rsnapshot diario: completed successfully

Ten en cuenta que la primera copia semanal solo aparece cuando ya existe diario.6, es decir, tras siete copias diarias. Lo mismo ocurre con la mensual respecto a semanal.3.

Paso 8: Restaurar archivos

Como las instantáneas son directorios normales, restaurar es copiar. Para ver qué versiones de un archivo tienes:

sudo ls -l /backup/rsnapshot/*/localhost/etc/nginx/nginx.conf

Para recuperar un directorio completo tal como estaba hace dos días, usa rsync desde la instantánea correspondiente. Primero en modo prueba con --dry-run para ver qué cambiaría:

sudo rsync -av --dry-run /backup/rsnapshot/diario.2/localhost/etc/nginx/ /etc/nginx/

Si la lista es la esperada, repite el comando sin --dry-run. Para restaurar en un servidor remoto, copia desde el servidor de copias hacia el remoto:

sudo rsync -av -e "ssh -i /root/.ssh/rsnapshot_ed25519" /backup/rsnapshot/diario.0/web01/var/www/ root@your_server_ip:/var/www/

Solución de problemas

rsnapshot configtest falla en una línea concreta. Revisa que los campos estén separados por tabuladores. En nano puedes ver los tabuladores con Alt+P.

La copia falla con snapshot_root ... does not exist. Es el efecto de no_create_root 1: el disco de copias no está montado. Comprueba df -h /backup y la entrada en /etc/fstab.

Aviso de rsync con código 24. Significa que algunos archivos desaparecieron durante la copia (temporales, sockets). rsnapshot lo registra como aviso y la instantánea es válida. Si se repite con los mismos archivos, exclúyelos.

La copia remota pide contraseña o falla con Permission denied (publickey). Revisa que ssh_args apunte a la clave correcta y que la IP del servidor de copias coincida con la opción from de authorized_keys.

Conclusión

Tienes rsnapshot haciendo copias incrementales diarias, semanales y mensuales de directorios locales y de un servidor remoto, con instantáneas que se restauran con un simple rsync. Como siguientes pasos, automatiza el volcado de tus bases de datos antes de cada copia, replica /backup/rsnapshot a una segunda ubicación para cumplir la regla 3-2-1, y haz una restauración de prueba periódica para confirmar que las copias sirven.