Guía completa de copias de seguridad con rsnapshot: Linux, recursos compartidos de Windows, NAS y Samba

Partiendo de los comandos básicos de rsnapshot, esta guía explica cómo respaldar directorios Linux locales, extraer datos de sistemas Linux remotos mediante SSH, montar recursos compartidos de Windows, NAS y Samba, crear instantáneas diarias, semanales y mensuales y diagnosticar errores de permisos, montaje y tareas programadas.

rsnapshot es adecuado para guardar “versiones históricas que se pueden explorar directamente” en el servidor de respaldo de Linux. Completa la sincronización con rsync y reutiliza archivos sin cambios a través de enlaces físicos.

Por lo tanto, daily.0, daily.1, weekly.0 parecen copias de seguridad completas, pero los mismos archivos normalmente ocupan solo una copia del espacio de datos. No es necesario importar una base de datos dedicada durante la recuperación, simplemente busque la instantánea correspondiente y copie el archivo.

Este artículo está organizado en cuatro categorías de fuentes:

  1. Directorio nativo de Linux;
  2. Se accede al directorio remoto de Linux a través de SSH;
  3. Compartir Windows o Samba;
  4. NAS que sirve archivos a través de SMB/CIFS o NFS.

El ejemplo escribe la instantánea de manera uniforme:

1
/mnt/backup/rsnapshot/

Antes de la operación formal, reemplace la IP de muestra, el nombre de usuario, el nombre compartido y el directorio con sus propios valores.

Funciones de rsnapshot y comandos básicos

Flujo de datos de rsnapshot

El método de implementación más común es hacer que una máquina Linux actúe como servidor de respaldo:

1
2
3
Linux 本机目录 ───────────────┐
远程 Linux ── SSH + rsync ────┼──> rsnapshot 快照根目录
Windows/NAS ── SMB 或 NFS ────┘

El servidor de respaldo es responsable de leer los datos de origen, escribir instantáneas, ejecutar tareas programadas y guardar registros. Para Linux remoto, rsnapshot se extrae activamente a través de SSH; para Windows o NAS, el directorio compartido generalmente se monta primero en Linux y luego se realiza una copia de seguridad como un directorio local.

rsnapshot no es una herramienta de sincronización en tiempo real ni una estrategia de copia de seguridad externa en sí misma. Puede reducir el costo de la recuperación mediante eliminación accidental, modificación accidental y cuando se necesitan versiones históricas, pero no puede reemplazar las copias fuera de línea, las copias fuera del sitio ni los simulacros de recuperación.

Instalar los paquetes necesarios

Ubuntu o Debian pueden instalar:

1
2
sudo apt update
sudo apt install -y rsnapshot rsync openssh-client cifs-utils nfs-common

Los usos de cada componente son los siguientes:

  • rsnapshot: gestiona la sincronización y la rotación de instantáneas;
  • rsync: Copiar datos modificados;
  • openssh-client: conectarse a Linux remoto;
  • cifs-utils: Monte recursos compartidos SMB para Windows, Samba y NAS comunes;
  • nfs-common: Montar exportación NFS de NAS.

Confirmar ubicación del comando:

1
2
3
command -v rsnapshot
command -v rsync
command -v ssh

Los ejemplos de este artículo utilizan /usr/bin/rsnapshot, /usr/bin/rsync y /usr/bin/ssh. Si la salida del sistema es diferente, la ruta real debería prevalecer.

Comprobar primero el disco de destino

Cree el directorio raíz de la instantánea:

1
2
3
sudo mkdir -p /mnt/backup/rsnapshot
df -Th /mnt/backup/rsnapshot
findmnt -T /mnt/backup/rsnapshot

La raíz de la instantánea debe estar en un sistema de archivos Linux que admita enlaces físicos, como ext4 o XFS. No lo coloque directamente en sistemas de archivos como FAT, exFAT, etc. que no admitan enlaces físicos de Unix.

Si /mnt/backup es un disco duro independiente, confirme también que efectivamente esté montado. De lo contrario, después de que falle el montaje del disco, la tarea puede escribir la copia de seguridad en un directorio vacío con el mismo nombre en el disco del sistema.

Primero puedes hacer una prueba de enlace físico:

1
2
3
4
sudo sh -c 'echo test > /mnt/backup/rsnapshot/.link-test'
sudo ln /mnt/backup/rsnapshot/.link-test /mnt/backup/rsnapshot/.link-test-2
ls -li /mnt/backup/rsnapshot/.link-test*
sudo rm /mnt/backup/rsnapshot/.link-test /mnt/backup/rsnapshot/.link-test-2

El número de inodo de ambos archivos de prueba debe ser el mismo.

Estructura básica del archivo de configuración

La configuración principal suele ser /etc/rsnapshot.conf:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
config_version	1.2

snapshot_root	/mnt/backup/rsnapshot/

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

retain	daily	7
retain	weekly	4
retain	monthly	6

El carácter de tabulación debe usarse entre los elementos y parámetros de configuración. El ancho de visualización del bloque de código puede diferir del editor, los caracteres reales deben verificarse después de pegarlos y no se debe usar una cadena de espacios comunes en lugar de Tab.

Este conjunto de políticas de retención representa:

  • Guarde 7 instantáneas diarias;
  • Guarde 4 instantáneas semanales;
  • Guarde 6 instantáneas mensuales.

En el modo predeterminado, daily, el más frecuente de la lista, realiza la sincronización rsync real y rota las instantáneas diarias; weekly y monthly principalmente rotan instantáneas más antiguas desde niveles inferiores hacia arriba. Si sync_first 1 está habilitado, el comportamiento cambiará y el método de sincronización de este artículo ya no se podrá copiar.

Comandos esenciales

Verifique la sintaxis de configuración:

1
sudo rsnapshot configtest

Los resultados normales deben contener:

1
Syntax OK

Obtenga una vista previa del comando sin realizar una copia de seguridad:

1
sudo rsnapshot -t daily

Para realizar una sincronización diaria:

1
sudo rsnapshot daily

Ver ocupación instantánea:

1
2
sudo rsnapshot du
df -h /mnt/backup/rsnapshot

Utilice un archivo de configuración personalizado:

1
2
3
sudo rsnapshot -c /home/test/rsnapshot.conf configtest
sudo rsnapshot -c /home/test/rsnapshot.conf -t daily
sudo rsnapshot -c /home/test/rsnapshot.conf daily

Si la tarea la ejecuta el usuario normal test, entonces las comprobaciones, las claves SSH y los permisos del directorio deben pertenecer al mismo usuario:

1
2
3
sudo -u test -H rsnapshot -c /home/test/rsnapshot.conf configtest
sudo -u test -H rsnapshot -c /home/test/rsnapshot.conf -t daily
sudo -u test -H rsnapshot -c /home/test/rsnapshot.conf daily

Copiar directorios de Linux

Copiar directorios locales

Supongamos que se realiza una copia de seguridad de los siguientes directorios:

1
2
3
/etc/
/home/
/srv/www/

Agregue /etc/rsnapshot.conf:

1
2
3
backup	/etc/	localhost/
backup	/home/	localhost/
backup	/srv/www/	localhost/

Cuando rsync_long_args global contiene --relative, la jerarquía del directorio de origen se conserva y el resultado suele ser similar a:

1
2
3
/mnt/backup/rsnapshot/daily.0/localhost/etc/
/mnt/backup/rsnapshot/daily.0/localhost/home/
/mnt/backup/rsnapshot/daily.0/localhost/srv/www/

Ejecutar primero:

1
2
sudo rsnapshot configtest
sudo rsnapshot -t daily

Verifique cuidadosamente la ruta de origen y la ruta de destino en la salida del simulacro para confirmar que no se haya escrito la ubicación incorrecta antes de la ejecución oficial:

1
2
sudo rsnapshot daily
sudo find /mnt/backup/rsnapshot/daily.0/localhost -maxdepth 3 -type d | head -50

Copiar sistemas Linux remotos mediante SSH

El entorno hipotético es el siguiente:

1
2
3
4
备份服务器:当前安装 rsnapshot 的 Ubuntu
远程服务器:192.168.1.50
远程用户:backupuser
远程目录:/data/files/

Por lo general, la máquina remota no necesita tener instalado rsnapshot, pero debe tener un servicio SSH en ejecución y rsync en el entorno remoto.

Primero confirme en la máquina remota:

1
command -v rsync

Si rsnapshot se ejecuta mediante el cron del root, configure las claves SSH para el root:

1
2
3
sudo ssh-keygen -t ed25519
sudo ssh-copy-id [email protected]
sudo ssh [email protected]

El último comando debe permitir el inicio de sesión directo y no puede requerir una contraseña o confirmación de clave de host.

Si la tarea la ejecuta el usuario test:

1
2
3
sudo -u test -H ssh-keygen -t ed25519
sudo -u test -H ssh-copy-id [email protected]
sudo -u test -H ssh [email protected]

Configurar el punto de respaldo:

1
backup	[email protected]:/data/files/	remote-linux/

Luego verifique en secuencia:

1
2
3
4
sudo rsnapshot configtest
sudo rsnapshot -t daily
sudo rsnapshot daily
ls -lah /mnt/backup/rsnapshot/daily.0/remote-linux/

Si se utiliza --relative, la capa data/files puede conservarse en la instantánea. Esta no es una copia de seguridad duplicada, sino el comportamiento de ruta relativa de rsync.

Controlar la jerarquía del directorio remoto en las instantáneas

Si desea que el contenido de /data/files/ aparezca directamente debajo de remote-linux/, puede usar /./ para marcar el punto de inicio de la ruta relativa:

1
backup	[email protected]:/data/files/./	remote-linux/

El resultado de la copia de seguridad estará más cerca de:

1
2
/mnt/backup/rsnapshot/daily.0/remote-linux/项目A/
/mnt/backup/rsnapshot/daily.0/remote-linux/项目B/

La semántica de la ruta se ve afectada fácilmente por las barras diagonales y --relative, así que no confíe únicamente en las expectativas. rsnapshot -t daily debe ejecutarse primero y luego ejecutar rsync en seco directamente si es necesario.

Usar un puerto SSH no estándar

Cuando el puerto SSH remoto es 2222, puede escribir en la configuración global:

1
2
cmd_ssh	/usr/bin/ssh
ssh_args	-p 2222

Pruebe manualmente primero:

1
ssh -p 2222 [email protected]

Si solo un servidor usa un puerto especial, se recomienda usar ~/.ssh/config en su lugar para evitar que ssh_args global afecte otros puntos de respaldo:

1
2
3
4
5
Host server50-backup
    HostName 192.168.1.50
    User backupuser
    Port 2222
    IdentityFile ~/.ssh/id_ed25519

La configuración correspondiente es:

1
backup	server50-backup:/data/files/	remote-linux/

Copiar varios hosts Linux

Utilice nombres de destino separados para cada fuente:

1
2
3
backup	[email protected]:/data/files/	server50-files/
backup	[email protected]:/home/	server50-home/
backup	[email protected]:/srv/www/	server60-www/

De esta manera, puede ver inmediatamente de qué máquina provienen los datos durante la recuperación y también puede evitar que diferentes fuentes escriban en el mismo directorio.

Copiar solo repositorios bare .git situados en la raíz

Supongamos que el directorio del NAS es:

1
2
3
4
5
6
7
/volume1/homes/git/
├── vuepress_sites.git/
├── zcb.git/
├── zyys_book_v2.git/
├── website/
├── test/
└── README.txt

Mantenga únicamente los directorios que terminan en .git en el directorio raíz y todo su contenido:

1
backup	[email protected]:/volume1/homes/git/./	git/	+rsync_long_args=--rsync-path=/usr/bin/rsync --include=/*.git/*** --exclude=*

Utilice tabulaciones para los primeros tres separadores y utilice espacios normales para los parámetros rsync en la cuarta columna. +rsync_long_args= significa agregar parámetros globales en lugar de reemplazarlos en su totalidad.

El orden de las reglas de filtrado no se puede invertir. rsync determina si se incluye el objeto según la primera regla coincidente, por lo que --include=/*.git/*** debe estar delante de --exclude=*.

Primera prueba rsync directamente:

1
2
3
4
5
6
7
/usr/bin/rsync -avhn \
  --relative \
  --rsync-path=/usr/bin/rsync \
  '--include=/*.git/***' \
  '--exclude=*' \
  [email protected]:/volume1/homes/git/./ \
  /tmp/git-backup-test/

El directorio .git y su contenido deberían aparecer en el resultado; website/, test/ o README.txt no deberían aparecer.

Si la regla se cambia posteriormente de “Hacer copia de seguridad de todo” a “Solo hacer copia de seguridad .git”, el resto del contenido de la instantánea anterior no desaparecerá de la instantánea histórica. Para que el nuevo daily.0 limpie los objetos excluidos, es necesario comprender y probar el impacto del --delete-excluded; puede eliminar datos en el objetivo que ya no coinciden con las reglas de filtrado y no se pueden habilitar directamente sin una verificación de ensayo.

Copiar recursos de Windows, NAS y directorios Samba

Elegir entre SMB, NFS y SSH

Puede elegir según las capacidades de la fuente:

  • Uso compartido de archivos de Windows: normalmente utiliza SMB/CIFS;
  • Servidor Samba: normalmente utiliza SMB/CIFS, o directamente mediante SSH + rsync;
  • NAS como Synology y QNAP: puede utilizar SMB/CIFS, NFS o SSH + rsync en un entorno controlado;
  • Windows remoto con OpenSSH y WSL rsync configurados: es posible realizar extracción a través de SSH, pero la implementación y el manejo de rutas son más complejos.

Para los recursos compartidos normales de Windows, la forma más fácil de mantener es montarlos primero como de solo lectura en Linux y luego dejar que rsnapshot haga una copia de seguridad del punto de montaje.

Crear un archivo de credenciales SMB

No escriba la contraseña directamente en /etc/fstab o en el historial de comandos. Cree un archivo de credenciales legible por root:

1
2
sudo install -m 600 /dev/null /root/.smb-backup-credentials
sudo nano /root/.smb-backup-credentials

El contenido es:

1
2
3
username=backupuser
password=替换为真实密码
domain=WORKGROUP

Si no utiliza el dominio, elimine la línea domain. Confirme los permisos nuevamente:

1
sudo stat -c '%a %U:%G %n' /root/.smb-backup-credentials

Los permisos esperados son 600 root:root.

Montar manualmente un recurso de Windows o Samba

Supongamos que la dirección compartida es //192.168.8.100/files:

1
2
3
sudo mkdir -p /mnt/source/windows-files
sudo mount -t cifs //192.168.8.100/files /mnt/source/windows-files \
  -o ro,credentials=/root/.smb-backup-credentials,vers=3.0

Verifique el montaje y lea:

1
2
findmnt -T /mnt/source/windows-files
sudo ls -lah /mnt/source/windows-files | head

Primero confirme que el recurso compartido se pueda leer de manera estable antes de escribir la configuración de rsnapshot. Si falla el montaje manual, rsnapshot no resolverá los problemas de autenticación, protocolo o red.

Configurar el montaje automático al arrancar

Agregue una línea a /etc/fstab:

1
//192.168.8.100/files /mnt/source/windows-files cifs ro,credentials=/root/.smb-backup-credentials,vers=3.0,_netdev,nofail 0 0

No reinicie directamente durante la prueba:

1
2
3
sudo umount /mnt/source/windows-files
sudo mount -a
findmnt -T /mnt/source/windows-files

Entre ellos:

  • ro: Montar en modo de solo lectura para reducir el riesgo de que la máquina de respaldo cambie accidentalmente los datos de origen;
  • credentials=: Leer la contraseña de la cuenta desde un archivo independiente;
  • vers=3.0: Pruebe explícitamente SMB 3.0;
  • _netdev: marque esto como un montaje dependiente de la red;
  • nofail: No impide que el sistema continúe iniciándose cuando falla el montaje.

nofail solo afecta el comportamiento de inicio y no significa que las tareas de respaldo deban ignorar los errores de montaje. El estado del montaje aún debe verificarse antes de programar la copia de seguridad.

Añadir el punto de montaje SMB a rsnapshot

Configuración:

1
backup	/mnt/source/windows-files/	windows-files/

Luego verifique:

1
2
3
4
sudo rsnapshot configtest
sudo rsnapshot -t daily
sudo rsnapshot daily
ls -lah /mnt/backup/rsnapshot/daily.0/windows-files/

No se limite a comprobar si el directorio existe. Incluso si el montaje de SMB está inactivo, es posible que el directorio del punto de montaje local aún exista, pero esté vacío.

Montar una exportación NFS del NAS

Supongamos que el NAS exporta 192.168.8.200:/volume1/files:

1
2
3
4
sudo mkdir -p /mnt/source/nas-files
sudo mount -t nfs -o ro 192.168.8.200:/volume1/files /mnt/source/nas-files
findmnt -T /mnt/source/nas-files
sudo ls -lah /mnt/source/nas-files | head

Correspondiente al ejemplo de /etc/fstab:

1
192.168.8.200:/volume1/files /mnt/source/nas-files nfs ro,_netdev,nofail 0 0

configuración de instantánea:

1
backup	/mnt/source/nas-files/	nas-files/

NFS tiene un modelo de permisos y asignación de usuarios diferente al de SMB. Poder montar no significa poder leer todos los archivos. Debe utilizar la cuenta que realmente ejecuta rsnapshot para comprobar el directorio de forma recursiva.

Evitar instantáneas vacías cuando se desconecta un recurso

La protección cron más simple es verificar primero todos los puntos de montaje necesarios:

1
2
3
/usr/bin/mountpoint -q /mnt/source/windows-files && \
/usr/bin/mountpoint -q /mnt/source/nas-files && \
/usr/bin/rsnapshot daily

Si no existe ningún punto de montaje, rsnapshot no se ejecutará.

También puede buscar un archivo centinela que solo exista en el recurso compartido:

1
2
3
test -r /mnt/source/windows-files/.backup-source-ok && \
test -r /mnt/source/nas-files/.backup-source-ok && \
/usr/bin/rsnapshot daily

El archivo centinela puede detectar problemas como “el punto de montaje existe pero está montado el recurso compartido incorrecto”. El archivo debe ser creado por el administrador de origen y debe ser legible por la cuenta de respaldo.

Programar copias y rotar instantáneas

Orden recomendado de cron

Supongamos que la configuración es:

1
2
3
retain	daily	7
retain	weekly	4
retain	monthly	6

Crontab de raíz editable:

1
sudo crontab -e

Escribe:

1
2
3
4
5
6
7
8
# 每月 1 日 03:00
0 3 1 * * /usr/bin/rsnapshot monthly >> /var/log/rsnapshot.log 2>&1

# 每周日 03:30
30 3 * * 0 /usr/bin/rsnapshot weekly >> /var/log/rsnapshot.log 2>&1

# 每天 04:00
0 4 * * * /usr/bin/rsnapshot daily >> /var/log/rsnapshot.log 2>&1

Cuando escriba en el crontab, no agregue una barra invertida antes del asterisco.

La rotación de alto nivel se programa antes de la sincronización diaria para que monthly y weekly reciban primero las instantáneas que están a punto de eliminarse gradualmente de los niveles inferiores. Cuando el día 1 de cada mes resulta ser domingo, la secuencia de ejecución es monthly, weekly, daily.

Usar el mismo bloqueo para todos los niveles

Cuando el disco es lento, hay muchos archivos o la red es inestable, es posible que se ejecute un diario hasta la hora semanal programada. Utilice flock para evitar superposiciones:

1
2
3
0 3 1 * * /usr/bin/flock -n /run/lock/rsnapshot.lock /usr/bin/rsnapshot monthly >> /var/log/rsnapshot.log 2>&1
30 3 * * 0 /usr/bin/flock -n /run/lock/rsnapshot.lock /usr/bin/rsnapshot weekly >> /var/log/rsnapshot.log 2>&1
0 4 * * * /usr/bin/flock -n /run/lock/rsnapshot.lock /usr/bin/rsnapshot daily >> /var/log/rsnapshot.log 2>&1

-n significa salir inmediatamente si no se puede obtener el bloqueo. Esto no iniciará dos rsnapshots al mismo tiempo, pero debe combinarse con la supervisión de registros para evitar que se omitan tareas debido a conflictos de bloqueo a largo plazo.

Si los montajes SMB y NFS deben verificarse antes de cada día, se recomienda escribir un script contenedor que sea propiedad de root y que los usuarios normales no puedan modificar, y luego lo llame mediante cron. No apile comandos compuestos largos en crontab.

Validar la configuración antes de activar las tareas programadas

Completa en orden:

1
2
3
4
5
sudo rsnapshot configtest
sudo rsnapshot -t daily
sudo rsnapshot daily
sudo find /mnt/backup/rsnapshot/daily.0 -maxdepth 3 -type d | head -100
sudo tail -100 /var/log/rsnapshot.log

También asegúrese de que la raíz utilizada por cron pueda conectarse a cada Linux remoto sin interacción:

1
2
sudo ssh [email protected] true
sudo ssh [email protected] true

El comando debería devolver el éxito directamente y no debería esperar la contraseña o la primera confirmación de la conexión.

Comprobar que los enlaces físicos funcionan

Después de tomar dos instantáneas consecutivas, seleccione un archivo sin cambios:

1
2
ls -li /mnt/backup/rsnapshot/daily.0/localhost/etc/hosts
ls -li /mnt/backup/rsnapshot/daily.1/localhost/etc/hosts

Si los inodos son iguales y el recuento de enlaces físicos es mayor que 1, significa que las dos instantáneas comparten los mismos datos de archivo.

No utilice la simple suma de du -sh daily.0 daily.1 para estimar el espacio adicional real. Los enlaces físicos harán que las estadísticas por directorio aparezcan como si cada instantánea ocupara su capacidad total.

Restaurar archivos

Explore instantáneas históricas antes de restaurar:

1
2
ls -lah /mnt/backup/rsnapshot/daily.1/remote-linux/
ls -lah /mnt/backup/rsnapshot/weekly.0/windows-files/

Restaurar archivos a un directorio temporal:

1
2
3
mkdir -p /tmp/rsnapshot-restore
cp -a /mnt/backup/rsnapshot/daily.1/remote-linux/data/files/report.pdf \
  /tmp/rsnapshot-restore/

Revise primero los archivos recuperados antes de sobrescribir el directorio de producción. Para restaurar en un servidor remoto, sincronice antes con una ubicación temporal y pida al administrador o propietario de los datos que confirme los permisos, el propietario y el contenido.

Problemas frecuentes y solución de errores

configtest muestra un error o un número de campos incorrecto

La causa más habitual es que los tabuladores se hayan sustituido por espacios. Muestre los caracteres invisibles:

1
sed -n '1,120l' /etc/rsnapshot.conf

El tabulador suele mostrarse como \t. Corrija el archivo y vuelva a ejecutar la prueba:

1
sudo rsnapshot configtest

También verifique que la ruta del comando realmente exista y que snapshot_root sea legible y escribible.

Permission denied (publickey)

Esto significa que la cuenta local que ejecuta la tarea no puede iniciar sesión mediante claves SSH. Prueba con la misma cuenta:

1
sudo -u test -H ssh -vv [email protected] true

Verifique los siguientes elementos:

  • Si la clave pública se agrega a ~/.ssh/authorized_keys de la cuenta remota;
  • Si la clave privada local pertenece a la cuenta que ejecuta rsnapshot;
  • Si los permisos remotos .ssh y authorized_keys son demasiado amplios;
  • si cron realmente se ejecuta como root en lugar de test;
  • Si la clave de host ha sido confirmada por la misma cuenta.

SSH funciona, pero rsync muestra command not found

Confirme la ruta remota:

1
ssh [email protected] 'command -v rsync'

Si rsync está instalado en una ubicación no estándar, añada la opción al punto de copia correspondiente:

1
+rsync_long_args=--rsync-path=/usr/local/bin/rsync

No adivine la ruta, confírmela primero en la máquina remota.

El directorio remoto no se puede leer

Pruebe primero con la cuenta remota de copia:

1
2
sudo -u test -H ssh [email protected] \
  'ls -lah /data/files/'

Luego omita rsnapshot y pruebe rsync directamente:

1
2
3
sudo -u test -H rsync -avhn \
  [email protected]:/data/files/ \
  /tmp/remote-backup-test/

Si Permission denied aún ocurre, el problema está en el recorrido del directorio de la cuenta remota o en los permisos de lectura de archivos, no en rsnapshot. Se puede comprobar de forma remota:

1
2
namei -l /data/files/
sudo -u backupuser find /data/files/ -maxdepth 2 -type f -readable | head

Prefiere la autorización a través de cuentas dedicadas de solo lectura, permisos de grupo o ACL. No cambie todo el directorio fuente para que todos puedan leerlo y escribirlo solo para evitar problemas.

El montaje SMB muestra Permission denied

Primero verifique el registro del kernel y los errores de montaje:

1
2
3
sudo mount -v -t cifs //192.168.8.100/files /mnt/source/windows-files \
  -o ro,credentials=/root/.smb-backup-credentials,vers=3.0
sudo dmesg | tail -50

Verifique el nombre del recurso compartido, el nombre de usuario, el dominio, los permisos del archivo de credenciales y si el NAS permite el acceso a la cuenta. Pruebe solo con otro vers= si el servidor es realmente más antiguo; no considere cambiar a un protocolo más antiguo como solución predeterminada.

rsnapshot termina correctamente, pero la instantánea de Windows o NAS está vacía

Verifique el montaje de origen ahora:

1
2
3
findmnt -T /mnt/source/windows-files
mountpoint /mnt/source/windows-files
ls -lah /mnt/source/windows-files | head

Si el recurso no está montado, detenga las rotaciones posteriores, recupere primero el montaje y después ejecute daily. No siga ejecutando la tarea sobre un punto de montaje vacío: las instantáneas siguientes también registrarían un origen vacío.

rsnapshot -t parece correcto, pero la ejecución real falla

-t muestra principalmente el comando que se ejecutará y no verifica completamente los permisos, la capacidad, la estabilidad de la red y todos los nombres de archivos durante la transferencia. Piense en el ensayo como una primera comprobación, no como una garantía de éxito.

Verifique el registro:

1
2
sudo tail -200 /var/log/rsnapshot.log
sudo journalctl --since today | grep -E 'rsnapshot|rsync|cifs|nfs'

Copie el comando rsync en el registro y ejecútelo por separado para confirmar si se trata de un problema de red, permiso, nombre de archivo o disco.

El uso del disco aumenta de forma inesperada

Primero distinga entre “muchos cambios de archivos” y “fallo del enlace físico”:

1
2
3
4
df -h /mnt/backup/rsnapshot
df -i /mnt/backup/rsnapshot
sudo du -xsh /mnt/backup/rsnapshot
sudo rsnapshot du

Una gran cantidad de archivos pequeños agotarán primero los inodos; Los archivos de bases de datos, imágenes de máquinas virtuales y archivos grandes que continúan cambiando pueden ocupar un nuevo espacio de archivo completo en nuevas instantáneas, incluso si solo se cambia una pequeña parte.

La reutilización del espacio también fallará si el directorio raíz de la instantánea se mueve a un sistema de archivos que no admite enlaces físicos o si diferentes instantáneas abarcan sistemas de archivos. Vuelva a comprobar:

1
2
3
findmnt -T /mnt/backup/rsnapshot
ls -li /mnt/backup/rsnapshot/daily.0/某文件
ls -li /mnt/backup/rsnapshot/daily.1/某文件

cron no se ejecuta

Confirmar el contenido de crontab:

1
2
3
sudo crontab -l
systemctl status cron --no-pager
sudo journalctl -u cron --since today

cron dispone de menos variables de entorno que un shell interactivo, por lo que las tareas deben usar rutas absolutas para los comandos. No dependa de un PATH temporal, del agente SSH ni del estado de un montaje manual.

Si el comando funciona manualmente pero falla desde cron, compare la cuenta de ejecución, HOME, la clave SSH, el archivo known_hosts y la visibilidad de los montajes en ambos entornos.

Las tareas se solapan o no terminan

Comprueba el progreso:

1
2
pgrep -af 'rsnapshot|rsync'
sudo lsof /run/lock/rsnapshot.lock

No elimine el archivo de bloqueo sin saber en qué fase está el proceso. Revise primero el registro y el estado del proceso, confirme que no hay ningún proceso rsnapshot activo y solo entonces gestione un bloqueo residual.

Si la ventana de programación se cruza con frecuencia, debe ajustar el tiempo de ejecución, reducir el alcance del escaneo, arreglar la red lenta o usar un bloqueo flock unificado en lugar de permitir que múltiples tareas lean y escriban simultáneamente el mismo directorio raíz de instantáneas.

Por qué los archivos borrados siguen en instantáneas anteriores

Es el comportamiento esperado. El nuevo daily.0 puede reflejar el borrado en el origen, mientras que daily.1 y weekly.0 siguen siendo versiones históricas hasta que superan sus límites de retención configurados.

No acceda manualmente a instantáneas antiguas ni elimine archivos uno por uno para “estado de sincronización”. Esto anula el propósito de la retención histórica y puede eliminar accidentalmente entradas de datos que aún se comparten a través de enlaces físicos.

Cómo comprobar que una copia se puede restaurar

Realice al menos una restauración de muestra cada mes:

  1. Seleccione una instantánea de diaria, semanal o mensual;
  2. Copie varios tipos diferentes de archivos en directorios temporales separados;
  3. Verifique el tamaño y la suma de comprobación, y confirme que los archivos se pueden abrir;
  4. Ejecute comprobaciones de coherencia en repositorios Git bare;
  5. Documentar los tiempos de recuperación y los problemas encontrados.

El almacén desnudo de Git se puede verificar aleatoriamente:

1
git --git-dir=/tmp/rsnapshot-restore/project.git fsck --full

Sólo el registro de éxito de la tarea programada no es suficiente. El verdadero criterio de aceptación es la capacidad de recuperar datos correctos y utilizables desde un punto histórico específico.

Ejemplo práctico de configuración combinada

El siguiente ejemplo realiza una copia de seguridad simultánea de la máquina local, Linux remota, el repositorio básico de Git, el recurso compartido de Windows y NAS NFS. Confirme que las columnas del bloque de código sean Tab:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
config_version	1.2

snapshot_root	/mnt/backup/rsnapshot/

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

rsync_long_args	--delete --numeric-ids --relative

retain	daily	7
retain	weekly	4
retain	monthly	6

backup	/etc/	localhost/
backup	/home/	localhost/
backup	[email protected]:/data/files/	server50-files/
backup	[email protected]:/volume1/homes/git/./	git/	+rsync_long_args=--rsync-path=/usr/bin/rsync --include=/*.git/*** --exclude=*
backup	/mnt/source/windows-files/	windows-files/
backup	/mnt/source/nas-files/	nas-files/

El pedido en línea debe fijarse como:

1
2
3
4
sudo rsnapshot configtest
sudo rsnapshot -t daily
sudo rsnapshot daily
sudo find /mnt/backup/rsnapshot/daily.0 -maxdepth 3 -type d | head -100

Confirmar artículo por artículo:

  • El directorio raíz de la instantánea se encuentra en el disco de respaldo correcto;
  • SMB y NFS comparten montajes reales y son legibles;
  • Las conexiones SSH no requieren interacción;
  • el ensayo no tiene fuentes ni objetivos inesperados;
  • Los resultados del filtro .git incluyen solo los directorios esperados;
  • Todos los archivos clave se pueden encontrar en daily.0;
  • Utilice enlaces físicos para archivos sin cambios en la segunda instantánea;
  • La prueba de recuperación pudo abrir el archivo con éxito.

Finalmente habilite cron. De esta manera, cuando ocurre un problema, puede distinguir claramente entre la sintaxis de configuración, SSH, montajes compartidos, permisos de origen, capacidad del disco y entorno de sincronización, sin atribuir todos los errores a rsnapshot.

Referencias