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) ejecutarsyncy copia datos nuevos. Antes de hacerlo, rota las copias existentes y creadiario.0a partir de la anterior usando enlaces duros. - Los niveles superiores no copian nada:
semanaltoma la copiadiariomás antigua y la convierte ensemanal.0, y así sucesivamente. - Cada instantánea es un árbol de directorios normal. Para restaurar basta con copiar archivos con
cporsync, 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
Importanteen
/etc/rsnapshot.conflos campos se separan con tabuladores, no con espacios. Una línea con espacios provoca un error de sintaxis. Los directorios deben terminar en/.
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_rootes el destino de las copias. Conno_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_sshes necesario para respaldar servidores remotos.cmd_duhabilita el comandorsnapshot du.- Las líneas
retainsustituyen a lasalpha,betaygammadel 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íneasretainoriginales.
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
Consejosi el servidor remoto tiene bases de datos, no copies sus archivos de datos en caliente con rsync: el resultado puede ser inconsistente. Genera antes un volcado con
mysqldumpopg_dumpen un directorio que rsnapshot sí copie.
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 lamensual. - 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/
Advertenciano modifiques ni borres archivos dentro de las instantáneas. Como están enlazados con enlaces duros, editar un archivo en
diario.0lo cambia también en todas las instantáneas que comparten ese inodo.
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.
