Copia de seguridad de datos entre servidores
Esta guía explica cómo copiar y realizar copias de seguridad de datos entre servidores Linux mediante rsync, así como cómo realizar la clonación de discos a bajo nivel con dd.
Antes de comenzar
Los comandos de esta guía se ejecutan en el servidor de origen, es decir, el servidor desde el que se copian los datos. El servidor de destino debe ser accesible mediante SSH, y el usuario especificado en el comando debe tener permisos de lectura sobre la ruta de origen y permisos de escritura sobre la ruta de destino.
Para comprobar el acceso SSH al servidor de destino antes de iniciar una copia de seguridad:
ssh user@destination_host
Sustituya user por el nombre de usuario remoto y destination_host por la dirección IP o el nombre de host del servidor de destino.
Para copias de seguridad automatizadas o programadas, configure la autenticación SSH mediante claves en lugar de utilizar contraseñas.
Copiar un directorio a un servidor remoto
Tenga en cuenta que la barra diagonal final en la ruta de origen afecta al comportamiento de rsync: /source/ copia el contenido del directorio, mientras que /source copia el propio directorio.
Utilice siempre --dry-run antes de ejecutar comandos con --delete para evitar la pérdida accidental de datos. Para previsualizar lo que se transferirá sin realizar ningún cambio:
rsync -a --delete --dry-run -e ssh /path/to/source/ user@destination_host:/path/to/backup/
Una vez que haya comprobado la salida, ejecute el mismo comando sin --dry-run. Añada -P para poder reanudar una transferencia interrumpida y mostrar el progreso:
rsync -a --delete -e ssh -P /path/to/source/ user@destination_host:/path/to/backup/
La opción -a conserva los permisos, las marcas de tiempo y los enlaces simbólicos. La opción --delete garantiza que el destino sea un espejo exacto del origen eliminando los archivos que no existen en el origen. Añada -v para mostrar información detallada.
La opción --delete eliminará del destino los archivos que no estén presentes en el origen. No la utilice si el destino contiene archivos que deban conservarse de forma independiente.
Copiar la mayoría de los archivos del sistema
Para copiar la mayor parte del sistema de archivos excluyendo los directorios virtuales y temporales:
rsync -aAXv --delete --one-file-system --numeric-ids \ --exclude={/dev/,/proc/,/sys/,/tmp/,/run/,/mnt/,/media/,/lost+found,/swapfi le} \ / user@destination_host:/path/to/backup/
Las opciones utilizadas son: -a conserva permisos, marcas de tiempo, enlaces simbólicos y realiza la copia recursiva; -A conserva las ACL; -X conserva los atributos extendidos; -v muestra información detallada. La opción -H para enlaces duros se omite intencionadamente: los enlaces duros del sistema no necesitan replicarse en una copia de seguridad remota y conservarlos aumenta el tiempo y la complejidad de la transferencia. La opción --one-file-system impide que rsync atraviese otros sistemas de archivos montados. La opción --numeric-ids conserva los valores UID y GID sin asignarlos a nombres de usuario, lo cual es importante cuando los servidores de origen y destino tienen configuraciones de usuarios diferentes.
La mayoría de las rutas excluidas utilizan una barra diagonal final para excluir el contenido del directorio manteniendo el propio directorio. /lost+found no tiene una barra diagonal final porque se debe excluir el directorio completo y no solo su contenido. La misma regla se aplica a la ruta de origen: /source/ copia el contenido del directorio, mientras que /source copia el propio directorio.
Este método no crea una imagen del sistema arrancable y no debe utilizarse como sustituto de una copia de seguridad completa del sistema. Para realizar copias de seguridad coherentes de sistemas activos, considere detener los servicios críticos o utilizar instantáneas del sistema de archivos, como las instantáneas LVM, antes de ejecutar el comando.
Clonación completa de un directorio con rsync
Para realizar un clon completo de un árbol de directorios conservando enlaces duros, ACL y atributos extendidos:
rsync -aAHXv /source/dir/ user@destination_host:/destination/dir/
Las opciones utilizadas aquí son: -a conserva permisos, marcas de tiempo, enlaces simbólicos y realiza la copia recursiva; -A conserva las ACL; -H conserva los enlaces duros, lo cual es importante para un clon exacto del directorio; -X conserva los atributos extendidos; -v muestra información detallada.
Clonar un disco con dd
Para clonar un disco completo en otro disco del mismo servidor:
dd if=/dev/sdX of=/dev/sdY bs=1M conv=noerror,sync status=progress
Sustituya sdX por el disco de origen y sdY por el disco de destino. Las opciones conv=noerror,sync permiten continuar la copia después de errores de lectura rellenando los bloques dañados con ceros. Si la integridad de los datos es crítica, omita estas opciones para que dd se detenga ante el primer error en lugar de sustituir silenciosamente los bloques defectuosos por ceros.
Para clonar un disco en un servidor remoto mediante SSH:
dd if=/dev/sdX bs=1M status=progress | ssh user@destination_host 'dd of=/dev/sdY bs=1M'
El destino también puede ser una ruta de archivo en lugar de un dispositivo de bloques.
dd escribe directamente en el dispositivo o archivo de destino sin solicitar confirmación. Compruebe cuidadosamente el origen y el destino antes de ejecutar el comando. En sistemas activos, desmonte todas las particiones del disco de origen si es posible o vuelva a montarlas en modo de solo lectura. Para realizar copias de seguridad coherentes de sistemas de archivos montados, utilice instantáneas LVM o arranque desde un entorno de rescate.
Verificar la copia de seguridad
Después de la transferencia, conéctese al servidor de destino y compruebe el tamaño de la copia de seguridad y su estructura básica:
ssh user@destination_host du -sh /path/to/backup/ ls /path/to/backup/
Para realizar una comprobación exhaustiva de la integridad, ejecute rsync con --checksum y --dry-run. Esto compara el contenido de los archivos en lugar de las marcas de tiempo e indicará cualquier diferencia:
rsync -av --checksum --dry-run /path/to/source/ user@destination_host:/path/to/backup/
Tenga en cuenta que este proceso puede tardar considerablemente más que una ejecución normal de rsync en conjuntos de datos grandes.