--- title: "Copias incrementales con rsnapshot en Ubuntu 24.04" description: "Configura rsnapshot en Ubuntu 24.04 para hacer copias incrementales con enlaces duros, locales y remotas por SSH, programarlas con cron y restaurar archivos." category: "Recuperación de copias" language: es source: https://cubepath.com/es/docs/recuperación-de-copias/respaldo-incremental-con-rsnapshot updated: 2026-09-25 --- # Copias incrementales con rsnapshot en Ubuntu 24.04 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: ```bash sudo apt update sudo apt install rsnapshot ``` Comprueba la versión instalada: ```bash rsnapshot -V ``` ```output 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: ```bash 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: ```bash df -h /backup ``` ```output 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: ```bash sudo cp /etc/rsnapshot.conf /etc/rsnapshot.conf.orig ``` > Importante: en `/etc/rsnapshot.conf` los 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: ```bash sudo nano /etc/rsnapshot.conf ``` Ajusta las siguientes directivas. Algunas ya existen y otras están comentadas con `#`; descoméntalas y cambia su valor: ```ini 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: ```ini 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`: ```ini exclude *.tmp exclude .cache/ exclude node_modules/ ``` Guarda el archivo y comprueba la sintaxis: ```bash sudo rsnapshot configtest ``` ```output 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: ```bash sudo rsnapshot -t diario ``` ```output 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: ```bash sudo rsnapshot diario ``` Comprueba el resultado: ```bash sudo ls /backup/rsnapshot/ /backup/rsnapshot/diario.0/localhost/ ``` ```output /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: ```bash 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: ```bash sudo stat -c '%h enlaces, inodo %i: %n' /backup/rsnapshot/diario.{0,1}/localhost/etc/hostname ``` ```output 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ó: ```bash sudo rsnapshot du ``` ```output 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): ```bash sudo ssh-keygen -t ed25519 -f /root/.ssh/rsnapshot_ed25519 -N '' -C 'rsnapshot' ``` Muestra la clave pública: ```bash 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: ```bash sudo nano /root/.ssh/authorized_keys ``` ```text 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: ```bash sudo ssh -i /root/.ssh/rsnapshot_ed25519 root@your_server_ip hostname ``` ```output web01 ``` Ahora indica a rsnapshot que use esa clave y añade las líneas `backup` del remoto en `/etc/rsnapshot.conf`: ```bash sudo nano /etc/rsnapshot.conf ``` ```ini 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: ```bash sudo rsnapshot configtest sudo rsnapshot diario sudo ls /backup/rsnapshot/diario.0/ ``` ```output localhost web01 ``` > Consejo: si 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 `mysqldump` o `pg_dump` en 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: ```bash sudo nano /etc/cron.d/rsnapshot ``` ```text # 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ó: ```bash sudo tail -n 3 /var/log/rsnapshot.log ``` ```output [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: ```bash 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: ```bash 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: ```bash sudo rsync -av -e "ssh -i /root/.ssh/rsnapshot_ed25519" /backup/rsnapshot/diario.0/web01/var/www/ root@your_server_ip:/var/www/ ``` > Advertencia: no modifiques ni borres archivos dentro de las instantáneas. Como están enlazados con enlaces duros, editar un archivo en `diario.0` lo 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.