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:
- Directorio nativo de Linux;
- Se accede al directorio remoto de Linux a través de SSH;
- Compartir Windows o Samba;
- NAS que sirve archivos a través de SMB/CIFS o NFS.
El ejemplo escribe la instantánea de manera uniforme:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
Los resultados normales deben contener:
|
|
Obtenga una vista previa del comando sin realizar una copia de seguridad:
|
|
Para realizar una sincronización diaria:
|
|
Ver ocupación instantánea:
|
|
Utilice un archivo de configuración personalizado:
|
|
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:
|
|
Copiar directorios de Linux
Copiar directorios locales
Supongamos que se realiza una copia de seguridad de los siguientes directorios:
|
|
Agregue /etc/rsnapshot.conf:
|
|
Cuando rsync_long_args global contiene --relative, la jerarquía del directorio de origen se conserva y el resultado suele ser similar a:
|
|
Ejecutar primero:
|
|
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:
|
|
Copiar sistemas Linux remotos mediante SSH
El entorno hipotético es el siguiente:
|
|
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:
|
|
Si rsnapshot se ejecuta mediante el cron del root, configure las claves SSH para el root:
|
|
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:
|
|
Configurar el punto de respaldo:
|
|
Luego verifique en secuencia:
|
|
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:
|
|
El resultado de la copia de seguridad estará más cerca de:
|
|
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:
|
|
Pruebe manualmente primero:
|
|
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:
|
|
La configuración correspondiente es:
|
|
Copiar varios hosts Linux
Utilice nombres de destino separados para cada fuente:
|
|
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:
|
|
Mantenga únicamente los directorios que terminan en .git en el directorio raíz y todo su contenido:
|
|
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:
|
|
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:
|
|
El contenido es:
|
|
Si no utiliza el dominio, elimine la línea domain. Confirme los permisos nuevamente:
|
|
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:
|
|
Verifique el montaje y lea:
|
|
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:
|
|
No reinicie directamente durante la prueba:
|
|
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:
|
|
Luego verifique:
|
|
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:
|
|
Correspondiente al ejemplo de /etc/fstab:
|
|
configuración de instantánea:
|
|
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:
|
|
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:
|
|
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:
|
|
Crontab de raíz editable:
|
|
Escribe:
|
|
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:
|
|
-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:
|
|
También asegúrese de que la raíz utilizada por cron pueda conectarse a cada Linux remoto sin interacción:
|
|
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:
|
|
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:
|
|
Restaurar archivos a un directorio temporal:
|
|
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:
|
|
El tabulador suele mostrarse como \t. Corrija el archivo y vuelva a ejecutar la prueba:
|
|
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:
|
|
Verifique los siguientes elementos:
- Si la clave pública se agrega a
~/.ssh/authorized_keysde la cuenta remota; - Si la clave privada local pertenece a la cuenta que ejecuta rsnapshot;
- Si los permisos remotos
.sshyauthorized_keysson 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:
|
|
Si rsync está instalado en una ubicación no estándar, añada la opción al punto de copia correspondiente:
|
|
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:
|
|
Luego omita rsnapshot y pruebe rsync directamente:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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”:
|
|
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:
|
|
cron no se ejecuta
Confirmar el contenido de crontab:
|
|
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:
|
|
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:
- Seleccione una instantánea de diaria, semanal o mensual;
- Copie varios tipos diferentes de archivos en directorios temporales separados;
- Verifique el tamaño y la suma de comprobación, y confirme que los archivos se pueden abrir;
- Ejecute comprobaciones de coherencia en repositorios Git bare;
- Documentar los tiempos de recuperación y los problemas encontrados.
El almacén desnudo de Git se puede verificar aleatoriamente:
|
|
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:
|
|
El pedido en línea debe fijarse como:
|
|
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
.gitincluyen 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.