Sincronizar incrementalmente dos directorios grandes con rsync: reanudación y verificación

Aprende a copiar incrementalmente dos directorios grandes con rsync, previsualizar los cambios, reanudar transferencias, registrar el proceso y verificar archivos, sumas de comprobación, permisos, ACL y atributos extendidos.

Cuando se utiliza rsync para copiar dos directorios grandes, la forma más segura no es escribir las dos rutas de origen en un comando, sino aclarar primero a qué directorio de destino corresponde cada directorio de origen y luego ejecutarlo grupo por grupo:

1
2
/mnt/disk1/photos/   → /mnt/disk2/photos/
/mnt/disk1/archive/  → /mnt/disk2/archive/

Primero se previsualiza cada par de directorios con --dry-run. Durante la copia real, rsync conserva los archivos parciales y escribe registros. Al terminar, se realiza una comparación de solo lectura.

Si no hay resultados de la comparación estándar, significa que rsync no encuentra ninguna diferencia basada en el tamaño del archivo, el tiempo de modificación y los atributos relacionados; Si desea confirmar que el contenido del archivo es coherente, agregue --checksum para una verificación de lectura completa.

Procedimiento seguro para sincronizar los dos pares

Lo siguiente supone que tanto el disco de origen como el de destino están montados correctamente:

1
2
3
4
SRC1=/mnt/disk1/photos
DST1=/mnt/disk2/photos
SRC2=/mnt/disk1/archive
DST2=/mnt/disk2/archive

Primero cree el directorio de destino:

1
sudo mkdir -p "$DST1" "$DST2"

Obtenga una vista previa de la sincronización de los dos grupos por separado:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
sudo rsync -aHAXn \
  --numeric-ids \
  --itemize-changes \
  "$SRC1/" \
  "$DST1/"

sudo rsync -aHAXn \
  --numeric-ids \
  --itemize-changes \
  "$SRC2/" \
  "$DST2/"

Después de confirmar las rutas de origen y destino y las listas de cambios, quite -n y ejecute las dos sincronizaciones reales de forma secuencial:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
sudo rsync -aHAX \
  --numeric-ids \
  --partial \
  --partial-dir=.rsync-partial \
  --info=progress2,stats2 \
  --log-file=/var/log/rsync-photos.log \
  "$SRC1/" \
  "$DST1/"

sudo rsync -aHAX \
  --numeric-ids \
  --partial \
  --partial-dir=.rsync-partial \
  --info=progress2,stats2 \
  --log-file=/var/log/rsync-archive.log \
  "$SRC2/" \
  "$DST2/"

Se recomienda no agregar --delete durante la primera migración.

De esta manera, incluso si hay archivos adicionales en el directorio de destino, rsync no los eliminará. Una vez confirmados la estructura del directorio y los resultados de la verificación, decida si necesita hacer que el destino sea un espejo completo del origen.

Por qué conviene ejecutar cada par por separado

El último opción posicional de rsync es el directorio de destino y los opciones anteriores se consideran fuentes.

Esta forma de escribir:

1
rsync -a /source/a/ /source/b/ /target/

Significa que ambas fuentes se importan al mismo /target/, pero no significa que /source/a/ corresponda a /target/a/ y /source/b/ corresponda a /target/b/.

Cuando cada directorio de origen tiene un destino distinto, se debe ejecutar rsync dos veces o utilizar un script que defina claramente ambas correspondencias.

Existen varios beneficios prácticos al ejecutar operaciones separadas:

  • Cada directorio tiene registros independientes y estados de salida;
  • Cuando un grupo fracasa, los resultados del otro grupo no quedan oscurecidos;
  • Las diferencias se pueden localizar grupo por grupo durante la verificación;
  • Permite que el disco duro mecánico lea y escriba secuencialmente para evitar que dos tareas compitan por el cabezal magnético;
  • Se pueden establecer diferentes reglas de exclusión para diferentes directorios.

Si dos fuentes realmente quieren importar el mismo destino, primero confirme si contienen rutas relativas con el mismo nombre.

Por ejemplo, dos fuentes tienen 2026/report.pdf y la fuente ejecutada más tarde puede sobrescribir el archivo con el mismo nombre ejecutado primero. Es más seguro mantener subdirectorios separados para ellos en este momento.

Verificar los puntos de montaje antes de copiar

Uno de los errores más peligrosos en la migración de directorios grandes es que el disco de destino no se monta correctamente, pero la ruta de destino aún existe.

En este momento, rsync escribirá los datos en el directorio normal del sistema de archivos raíz hasta que el disco del sistema esté lleno.

Verifique los dispositivos de bloque, los sistemas de archivos y los puntos de montaje antes de comenzar:

1
2
3
4
5
6
lsblk -o NAME,SIZE,FSTYPE,UUID,MOUNTPOINTS
findmnt -T /mnt/disk1/photos
findmnt -T /mnt/disk2/photos
findmnt -T /mnt/disk1/archive
findmnt -T /mnt/disk2/archive
df -hT /mnt/disk1 /mnt/disk2

Puntos clave para confirmar:

  1. /mnt/disk1 y /mnt/disk2 corresponden a los dispositivos esperados;
  2. El disco de destino tiene suficiente espacio libre;
  3. El montaje de destino no está en estado de solo lectura;
  4. Las dos rutas no apuntan accidentalmente a la misma ubicación del sistema de archivos;
  5. La ruta de destino no es un subdirectorio dentro de la ruta de origen.

Puede utilizar el siguiente comando para ver la ruta real analizada:

1
2
3
4
readlink -f "$SRC1"
readlink -f "$DST1"
readlink -f "$SRC2"
readlink -f "$DST2"

Haz otra pequeña prueba de escritura:

1
2
3
4
5
sudo touch "$DST1/.rsync-write-test"
sudo rm "$DST1/.rsync-write-test"

sudo touch "$DST2/.rsync-write-test"
sudo rm "$DST2/.rsync-write-test"

Aquí solo elimine los archivos de prueba que acaba de crear explícitamente, no utilice comodines para limpiar el directorio de destino.

Cómo cambia la estructura una barra diagonal final

Los resultados de estos dos comandos son diferentes:

1
2
rsync -a /source/ /target/
rsync -a /source  /target/

La primera copia del contenido en /source/:

1
2
/target/file1
/target/subdir/file2

La segunda copia copia el directorio source:

1
2
/target/source/file1
/target/source/subdir/file2

Al sincronizar dos directorios correspondientes que se han establecido, / generalmente se escribe después de la ruta de origen y la ruta de destino:

1
rsync -a "$SRC1/" "$DST1/"

No se limite a adivinar el resultado basándose en el nombre del directorio. Antes de ejecutar por primera vez, use --dry-run --itemize-changes para verificar la ruta relativa que se creará.

Para qué sirve cada opción recomendada

La combinación de opciones básica es:

1
-aHAX

en:

opción efecto Cosas a tener en cuenta
-a Modo de archivo, recursivo y conserva propiedades comunes. No significa conservar automáticamente todos los enlaces físicos, ACL y atributos extendidos.
-H Preservar las relaciones de vínculo físico Una gran cantidad de enlaces físicos aumenta el consumo de memoria
-A Preservar las ACL POSIX El sistema de archivos de destino debe admitir ACL
-X Mantener atributos extendidos El sistema de archivos de destino debe admitir xattr
--numeric-ids Conservar directamente los valores UID y GID Adecuado para migración de discos de Linux y copia de datos del sistema
--partial Mantener archivos sin terminar después de una interrupción La siguiente ejecución seguirá verificando y continuando la transferencia.
--partial-dir=.rsync-partial Coloque los archivos sin terminar en un directorio dedicado No elimine el directorio manualmente antes de que se complete la verificación.
--info=progress2 Muestra el progreso general de toda la tarea. El número total de estadísticas variará según cómo se genere la lista de archivos.
--info=stats2 Mostrar estadísticas de transferencia al final No sustituye a la verificación independiente después de la copia.
--log-file Escribir registros detallados en el registro. El directorio de registro debe poder escribirse

Si está copiando documentos, fotografías y vídeos normales y el directorio de origen no tiene enlaces físicos, ACL ni atributos extendidos, puede reducir los opciones según sea necesario.

No piense mecánicamente que cuantos más opciones, más seguro será.

Por ejemplo, cuando el destino es FAT, exFAT o algunos sistemas de archivos de red, es posible que los permisos, los propietarios, las ACL y xattr no se guarden por completo, y -A, -X o la configuración del propietario pueden informar errores.

Primero verifique los tipos de sistemas de archivos en ambos extremos:

1
2
findmnt -no FSTYPE -T "$SRC1"
findmnt -no FSTYPE -T "$DST1"

Si las capacidades de los dos extremos son diferentes, primero debe aclarar si es necesario conservar el contenido del archivo o los metadatos completos de Linux.

Qué copia rsync durante una sincronización incremental

De forma predeterminada, rsync determina principalmente si un archivo necesita actualizarse en función del tamaño del archivo y el tiempo de modificación.

Al ejecutar el mismo comando nuevamente:

  • Se copiarán los archivos nuevos;
  • Los archivos que cambien de tamaño o de hora de modificación se actualizarán;
  • Se omitirán los archivos que no hayan cambiado;
  • Se conservan los archivos exclusivos de destino;
  • Los archivos interrumpidos se vuelven a verificar según su estado actual y el procesamiento continúa.

Es por eso que la sincronización incremental es adecuada para migraciones de directorios grandes.

Pero no es una instantánea del sistema de archivos.

Si el directorio de origen continúa cambiando durante el proceso de copia, el destino final puede contener el estado del archivo en diferentes momentos. Las fototecas o directorios de archivos comunes pueden ejecutar un complemento incremental después de la primera copia; Las bases de datos, imágenes de máquinas virtuales y datos de aplicaciones que se escriben primero deben detener los servicios, congelar la escritura o utilizar instantáneas del sistema de archivos.

Cómo interpretar la lista de cambios de dry-run

El comando de vista previa recomendado es:

1
2
3
4
5
sudo rsync -aHAXn \
  --numeric-ids \
  --itemize-changes \
  "$SRC1/" \
  "$DST1/"

-n es la forma abreviada de --dry-run. Solo calcula el plan y no lo escribe en el archivo.

--itemize-changes mostrará cada elemento de cambio y el motivo. Los formularios de salida comunes incluyen:

1
2
3
4
>f+++++++++ new-file.iso
>f..t...... changed-time.log
.d...p..... existing-directory/
*deleting   old-file.tmp

Se puede entender aproximadamente así:

  • >f+++++++++: El archivo no existe en el destino y se creará;
  • Comenzando con >f y seguido de una etiqueta de atributo: se actualizarán el contenido o los atributos del archivo;
  • .d: Es necesario ajustar las propiedades del directorio;
  • *deleting: cuando se combina con --delete, se eliminará el contenido único del destino.

Si aparece un nombre de directorio de nivel superior inesperado en la vista previa, generalmente se debe a que / está escrito incorrectamente al final de la ruta de origen.

Si parece que casi todos los archivos grandes se retransmiten, debe verificar la hora en ambos extremos, la precisión de la hora del sistema de archivos, los opciones de montaje y si la aplicación reescribe el archivo continuamente.

Script para sincronizar ambos pares de forma secuencial

Cuando necesite ejecutarlo repetidamente, puede guardarlo como /usr/local/sbin/sync-two-dirs.sh:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/env bash
set -Eeuo pipefail

sync_one() {
  local name=$1
  local source=$2
  local target=$3
  local log_file="/var/log/rsync-${name}.log"

  printf '开始同步 %s: %s -> %s\n' "$name" "$source" "$target"

  rsync -aHAX \
    --numeric-ids \
    --partial \
    --partial-dir=.rsync-partial \
    --info=progress2,stats2 \
    --log-file="$log_file" \
    "$source/" \
    "$target/"

  printf '完成同步 %s\n' "$name"
}

sync_one photos /mnt/disk1/photos /mnt/disk2/photos
sync_one archive /mnt/disk1/archive /mnt/disk2/archive

Dar permisos de ejecución y ejecutar:

1
2
sudo chmod 750 /usr/local/sbin/sync-two-dirs.sh
sudo /usr/local/sbin/sync-two-dirs.sh

El script utiliza set -Eeuo pipefail.

Si el primer conjunto de rsync devuelve un estado distinto de cero, el script se detendrá y la tarea general no se informará falsamente como exitosa. Simplemente vuelva a ejecutarlo después de solucionar el error. Se omitirán los archivos que ya sean consistentes.

Ejecutar transferencias largas dentro de tmux

Esto puede llevar horas o incluso días para varios terabytes de datos. Se recomienda ejecutar en tmux en lugar de depender de una ventana SSH que esté siempre abierta:

1
tmux new -s rsync-copy

Después de ingresar a la sesión ejecute:

1
sudo /usr/local/sbin/sync-two-dirs.sh

Presione Ctrl+b, luego d para continuar la sesión en segundo plano.

Reconectar:

1
tmux attach -t rsync-copy

Al mismo tiempo, puedes observar los logs desde otro terminal:

1
2
sudo tail -f /var/log/rsync-photos.log
sudo tail -f /var/log/rsync-archive.log

Comprueba el progreso:

1
pgrep -af rsync

No inicie varios scripts idénticos al mismo tiempo. Cuando dos tareas escriben en el mismo disco duro mecánico, la copia paralela normalmente sólo aumenta los tiempos de búsqueda y espera aleatorias.

Comprobar el estado de salida y los registros de rsync

Una vez finalizado el comando, primero verifique el estado de salida:

1
echo $?

0 significa que no se detectaron errores en esta ejecución, pero no puede probar de forma independiente que el contenido de cada archivo se haya verificado por completo.

Los estados comunes distintos de cero incluyen:

código de estado Significados comunes dirección de procesamiento
11 Error de E/S de archivo Ver el registro del kernel, el estado del disco y del sistema de archivos
12 error de flujo de datos del protocolo rsync Verifique la conexión remota, la versión y los registros
23 Algunos archivos no fueron transferidos Permisos de búsqueda, archivos faltantes, xattr y errores de E/S
24 El archivo fuente desaparece durante la transferencia Determinar si un programa está moviendo o eliminando archivos
30 Tiempo de espera de transferencia de datos Verifique los opciones de red, SSH y tiempo de espera

Mire el final del registro:

1
2
sudo tail -n 100 /var/log/rsync-photos.log
sudo tail -n 100 /var/log/rsync-archive.log

No te fijes sólo en el “Total Bytes” que aparece al final de la terminal. Si IO error, Permission denied, failed o vanished file existen en el registro, aún es necesario determinar si afecta la verificación final.

Nivel de verificación 1: repetir el dry-run

Después de la copia real, ejecute los dos conjuntos de directorios siguientes:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
sudo rsync -aHAXn \
  --numeric-ids \
  --delete \
  --itemize-changes \
  "$SRC1/" \
  "$DST1/"

sudo rsync -aHAXn \
  --numeric-ids \
  --delete \
  --itemize-changes \
  "$SRC2/" \
  "$DST2/"

Aquí también se utiliza -n, por lo que --delete solo informará el exceso de contenido en el lado de destino y en realidad no lo eliminará.

Sin salida normalmente significa:

  • rsync no encontró archivos que deban agregarse o actualizarse;
  • No hay rutas adicionales en el destino que no existan en el origen;
  • Esta vez no hay diferencias en los atributos comunes que deben conservarse.

Si el resultado es solo .rsync-partial/, primero confirme que no haya tareas sin terminar. Una vez completada toda la sincronización y verificación, decida si desea limpiar el directorio temporal.

Si la salida contiene *deleting, hay archivos en el destino que no están en el directorio de origen. Primero verifique si estos archivos deben conservarse y no eliminar -n inmediatamente.

Nivel de verificación 2: comparar el contenido mediante checksums

El dry-run ordinario se basa principalmente en el tamaño y el tiempo de modificación, y no puede excluir la rara situación de “el mismo tamaño y tiempo pero contenido diferente”.

Se puede utilizar una verificación estricta:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
sudo rsync -aHAXnc \
  --numeric-ids \
  --delete \
  --itemize-changes \
  "$SRC1/" \
  "$DST1/"

sudo rsync -aHAXnc \
  --numeric-ids \
  --delete \
  --itemize-changes \
  "$SRC2/" \
  "$DST2/"

Donde -c es equivalente a --checksum.

Lee el contenido del archivo desde ambos lados y calcula una suma de comprobación en lugar de simplemente comparar el tamaño y el tiempo de modificación. Debido a que también contiene -n, cuando se encuentren diferencias, solo se informarán, no se corregirán y los archivos no se eliminarán.

La ejecución de -c en terabytes de datos puede llevar mucho tiempo y crear una carga de lectura completa en los discos de origen y de destino.

Los escenarios adecuados para una verificación estricta incluyen:

  • Se produjo un error de lectura excesiva en el disco original o el disco se cayó;
  • Migrar a través de redes inestables;
  • El contenido del archivo es muy importante y no existe otro mecanismo de verificación;
  • La verificación final final debe completarse antes de desconectar el disco de origen;
  • Se sospecha que el sistema de archivos o la memoria de destino están provocando una corrupción silenciosa.

Si el estado del disco no es bueno, verifique primero los registros SMART y del kernel y no lea el disco defectuoso repetidamente para fines de verificación.

Nivel de verificación 3: comparar archivos y bytes lógicos

Cuente el número de archivos ordinarios:

1
2
3
4
5
find "$SRC1" -xdev -type f -printf '.' | wc -c
find "$DST1" -xdev -type f -printf '.' | wc -c

find "$SRC2" -xdev -type f -printf '.' | wc -c
find "$DST2" -xdev -type f -printf '.' | wc -c

Estadísticas del tamaño lógico total de archivos ordinarios:

1
2
3
4
5
find "$SRC1" -xdev -type f -printf '%s\n' | awk '{sum += $1} END {printf "%.0f\n", sum}'
find "$DST1" -xdev -type f -printf '%s\n' | awk '{sum += $1} END {printf "%.0f\n", sum}'

find "$SRC2" -xdev -type f -printf '%s\n' | awk '{sum += $1} END {printf "%.0f\n", sum}'
find "$DST2" -xdev -type f -printf '%s\n' | awk '{sum += $1} END {printf "%.0f\n", sum}'

-xdev significa no ingresar otros sistemas de archivos montados en el directorio.

Si el directorio de origen contiene originalmente puntos de montaje anidados y estos contenidos también deben copiarse, no puede usar -xdev directamente y debe confirmar que la política de procesamiento de puntos de montaje de rsync cumple con las expectativas.

La cantidad igual de archivos y la cantidad de bytes lógicos solo se pueden utilizar como evidencia auxiliar, pero no pueden probar que la ruta y el contenido sean consistentes uno por uno.

du -sh no se puede utilizar como única base para la verificación final, porque los archivos dispersos, la compresión, la deduplicación, el tamaño del bloque, los enlaces físicos y los metadatos del sistema de archivos afectarán el espacio real ocupado.

Generar manifiestos SHA-256 para una verificación independiente

Si desea mantener una lista de contenido auditable, puede calcular SHA-256 en rutas relativas dentro de cada directorio:

1
2
3
4
5
6
7
cd "$SRC1"
find . -type f -print0 | sort -z | xargs -0 -r sha256sum > /tmp/photos-source.sha256

cd "$DST1"
find . -type f -print0 | sort -z | xargs -0 -r sha256sum > /tmp/photos-target.sha256

diff -u /tmp/photos-source.sha256 /tmp/photos-target.sha256

El segundo conjunto de directorios se procesa de manera similar:

1
2
3
4
5
6
7
cd "$SRC2"
find . -type f -print0 | sort -z | xargs -0 -r sha256sum > /tmp/archive-source.sha256

cd "$DST2"
find . -type f -print0 | sort -z | xargs -0 -r sha256sum > /tmp/archive-target.sha256

diff -u /tmp/archive-source.sha256 /tmp/archive-target.sha256

diff no tiene salida y el estado de salida es 0, lo que indica que las dos listas son consistentes.

Esto todavía solo verifica el contenido normal del archivo y las rutas relativas, no los permisos de directorio, las ACL, los propietarios, las relaciones de vínculo físico o los atributos extendidos. Se debe ver una migración de datos de Linux completa junto con los resultados de rsync -aHAXnc.

Verificar permisos, ACL, atributos extendidos y enlaces físicos

Verifique aleatoriamente los atributos básicos de los archivos clave:

1
2
stat "$SRC1/关键文件"
stat "$DST1/关键文件"

Verifique la ACL:

1
2
getfacl -p "$SRC1/关键目录"
getfacl -p "$DST1/关键目录"

Verificar atributos extendidos:

1
2
getfattr -d -m- "$SRC1/关键文件"
getfattr -d -m- "$DST1/关键文件"

Verifique el número de inodo y enlace de los archivos vinculados:

1
2
ls -li "$SRC1/路径/文件1" "$SRC1/路径/文件2"
ls -li "$DST1/路径/文件1" "$DST1/路径/文件2"

No es necesario que los números de inodo en el origen y el destino sean los mismos, pero los archivos dentro del mismo extremo que originalmente pertenecían a un conjunto de enlaces físicos deben compartir inodos y conservar el número correcto de enlaces.

Cuándo activar –delete

--delete permite que el destino mantenga eventualmente una relación de duplicación con el origen: las rutas que existen en el destino pero no en el origen se eliminarán.

Primero haga una vista previa de solo lectura:

1
2
3
4
5
6
sudo rsync -aHAXn \
  --numeric-ids \
  --delete-delay \
  --itemize-changes \
  "$SRC1/" \
  "$DST1/"

Nota: --delete-delay también habilita la semántica de eliminación, pero pospone la eliminación real hasta el final de la transferencia.

Antes de la duplicación oficial, al menos confirme:

  1. El origen y el destino no se invierten;
  2. De hecho, el punto de montaje del destino está en línea;
  3. Cada *deleting en el dry-run funciona como se esperaba;
  4. No hay archivos en el destino que deban conservarse de forma independiente;
  5. Hay otra copia de seguridad restaurable.

Si aún desea poder revisar la eliminación, puede usar primero el directorio de respaldo:

1
2
3
4
5
6
7
8
sudo rsync -aHAX \
  --numeric-ids \
  --delete-delay \
  --backup \
  --backup-dir="/mnt/disk2/rsync-deleted-$(date +%F)" \
  --itemize-changes \
  "$SRC1/" \
  "$DST1/"

El directorio de respaldo debe ubicarse en una ubicación con suficiente espacio y no debe caber en el árbol del directorio de origen que se sincronizará nuevamente.

Excluir papeleras y directorios temporales

Hay algunos directorios de caché comunes en discos NAS o de escritorio que no es necesario migrar. Solo agregue reglas de exclusión después de confirmar que efectivamente son descartables:

1
2
3
4
5
6
7
8
9
sudo rsync -aHAX \
  --numeric-ids \
  --partial \
  --info=progress2,stats2 \
  --exclude='#recycle/' \
  --exclude='@eaDir/' \
  --exclude='.Trash-*/' \
  "$SRC1/" \
  "$DST1/"

'#recycle/' debe estar entre comillas; de lo contrario, Shell puede considerar el contenido después de # como un comentario.

El comando real y el comando de verificación deben utilizar las mismas reglas de exclusión; de lo contrario, el contenido ignorado intencionalmente se informará como faltante durante la verificación.

Cuando haya muchas reglas de exclusión, guárdelas en un archivo:

1
2
3
#recycle/
@eaDir/
.Trash-*/

Luego usa:

1
2
3
4
5
rsync -aHAXn \
  --exclude-from=/etc/rsync-large-dirs.exclude \
  --itemize-changes \
  "$SRC1/" \
  "$DST1/"

Controlar la carga del disco y de la red

Al migrar directorios grandes en un servidor de producción, puede reducir la CPU y la prioridad de E/S del proceso:

1
2
3
4
5
6
7
sudo nice -n 10 ionice -c2 -n7 \
  rsync -aHAX \
  --numeric-ids \
  --partial \
  --info=progress2,stats2 \
  "$SRC1/" \
  "$DST1/"

Las transmisiones entre redes también pueden tener una velocidad limitada. Se recomienda que el destino remoto escriba la ruta absoluta directamente para evitar confundir variables locales y rutas remotas:

1
2
3
4
5
6
rsync -aHAX \
  --partial \
  --info=progress2,stats2 \
  --bwlimit=80M \
  "$SRC1/" \
  user@backup-host:/mnt/disk2/photos/

De disco local a disco local generalmente no requiere compresión -z. Las fotos, los vídeos y los paquetes comprimidos también son difíciles de comprimir más, y activar -z sólo aumentará la carga de la CPU.

Errores habituales y soluciones

Permission denied

Primero, confirme en el registro si no pudo leer el archivo de origen, no pudo crear el archivo de destino o no pudo configurar el propietario, ACL o xattr.

1
sudo grep -Ei 'permission denied|operation not permitted|failed' /var/log/rsync-photos.log

No ejecute directamente un chmod -R 777 amplio en todo el destino. Se deben verificar las opciones de montaje, el propietario del directorio de destino y las capacidades del sistema de archivos de destino.

No space left on device

Verifique tanto la capacidad como el inodo:

1
2
df -hT "$DST1"
df -i "$DST1"

Una gran cantidad de archivos pequeños pueden agotar primero los inodos, aunque df -h todavía muestre capacidad libre.

Input/output error

Vea el estado del kernel y del disco ahora:

1
2
dmesg -T | tail -n 100
sudo smartctl -a /dev/sdX

Reemplace /dev/sdX con el dispositivo real. Cuando se producen errores de lectura persistentes, primero debe proteger los datos que aún se pueden leer y no realizar repetidamente una verificación completa del disco para aumentar la presión sobre el disco fallido.

file has vanished

El código de estado 24 generalmente indica que el archivo fuente se movió o eliminó después del escaneo pero antes de copiarlo.

No es raro que esto suceda ocasionalmente en cachés, registros y directorios de descarga. Para los directorios comerciales que requieren coherencia, debe pausar la escritura o la copia desde una instantánea, luego volver a ejecutarla y confirmar que los archivos faltantes ya no aparecen.

Todos los archivos vuelven a transferirse

Las razones comunes incluyen:

  • El sistema de archivos de destino no puede preservar la precisión del tiempo de origen;
  • La aplicación reescribe el archivo después de copiarlo;
  • Relojes de origen y destino anormales;
  • Utilice un método de montaje que cambie los atributos del archivo;
  • Los archivos se vuelven a codificar o empaquetar a través de un programa intermediario.

Primero use --dry-run --itemize-changes para observar si el contenido, el tamaño, el tiempo o los permisos activan la actualización.

Lista de verificación final

Después de completar la migración de dos directorios grandes, conserve al menos la siguiente evidencia:

  • Ambos comandos reales de rsync devuelven 0;
  • No hay errores de E/S, permisos o espacio pendientes en ambos registros;
  • No hubo resultados inesperados en ninguno de los dos conjuntos de dry-runs normales;
  • Si se requiere duplicación, la dry-run con --delete no tiene eliminaciones accidentales;
  • El número de archivos y el total de bytes lógicos coinciden entre origen y destino;
  • Los datos importantes completan rsync -nc o verificación independiente SHA-256;
  • De hecho, los archivos clave se pueden abrir desde el destino;
  • Los permisos, las ACL, xattr y los enlaces físicos se conservan según los requisitos operativos;
  • El disco de origen no se ha formateado ni se ha desconectado antes de que se complete la verificación final;
  • Si es posible, realice una prueba de restauración desde el destino.

El comando de confirmación más práctico sigue siendo:

1
2
3
4
5
6
sudo rsync -aHAXnc \
  --numeric-ids \
  --delete \
  --itemize-changes \
  /源目录/ \
  /目标目录/

Cuando no tiene resultados, significa que rsync no encontró diferencias de contenido, ruta o atributos relacionados dentro de las reglas y opciones de exclusión actuales.

Con varios TB de datos es normal que la verificación estricta tarde mucho. No elimine el origen solo porque la copia muestre 100%: completar la copia, superar la verificación y comprobar la restauración son etapas distintas.

Preguntas frecuentes

¿Necesito agregar un comando especial de “reanudación” después de una interrupción?

Generalmente no es necesario. Simplemente vuelva a ejecutar el mismo comando rsync. --partial --partial-dir=.rsync-partial retendrá datos incompletos y se omitirán los archivos que ya sean coherentes.

¿Se pueden copiar dos directorios grandes en paralelo?

Técnicamente sí, pero las tareas paralelas tienden a reducir el rendimiento si están en el mismo disco de origen o en el mismo disco duro de destino. El número de serie predeterminado facilita el registro, el reintento y la verificación final.

¿Cuál es la diferencia entre --progress y --info=progress2?

--progress prefiere mostrar el progreso del archivo actual, mientras que --info=progress2 muestra el progreso general de toda la tarea de transferencia. Los directorios muy grandes suelen ser más fáciles de ver.

¿Por qué du -sh muestra valores distintos en ambos lados?

El tamaño de bloque del sistema de archivos, los archivos dispersos, la compresión, los enlaces físicos, los metadatos y los bloques reservados pueden causar diferencias en la ocupación. Priorice la comparación de rsync, la lista de archivos y la verificación de contenido, no mire solo du.

¿rsync -nc modifica los archivos de destino?

No. -n es un dry-run y -c solo requiere que la diferencia se determine en función de la suma de comprobación del contenido del archivo. El comando realiza una lectura masiva del disco pero no realiza una copia ni elimina.

¿Por qué incluir --delete durante la verificación?

Debido a que solo se comparan los archivos que existen en el origen, no se pueden encontrar las rutas adicionales en el lado de destino. Cuando se usa junto con -n, --delete solo informa estos contenidos adicionales y en realidad no los elimina.

¿Cuándo se puede eliminar el directorio de origen?

Al menos espere hasta que los dos conjuntos de estados de salida de sincronización sean normales, los registros no tengan errores sin resolver, pases de verificación estrictas y los archivos clave se abran o restauren exitosamente desde el extremo de destino. Se debe mantener otra copia de seguridad independiente de los datos importantes.