Estoy ejecutando un servidor rsync (basado en Linux) para la distribución de software. Un servidor de repositorio de origen (basado en Windows) que está fuera de mi control envía paquetes de software a través de rsync, y alrededor de cien servidores satélite en todo el mundo extraen de él, también a través de rsync.
El repositorio de origen contiene muchos archivos duplicados de gran tamaño. Quiero reducir el consumo de espacio en disco y ancho de banda en los servidores satelitales reemplazando esos duplicados por enlaces duros. El administrador del repositorio de origen no quiere o no puede hacerlo en el origen, por lo que estoy intentando hacerlo después en el servidor de distribución. He creado un script bash simple basado en el fdupes
comando que busca grupos de duplicados y los reemplaza con enlaces duros a un solo archivo. Las transferencias rsync a los servidores satelitales conservan estos enlaces duros como se desee gracias a la opción -H. Sin embargo, la transferencia desde el repositorio de origen produce resultados inconsistentes. A veces se conserva la deduplicación. A veces, el servidor de origen retransmite todos los archivos de un grupo deduplicado y la deduplicación se interrumpe aunque los archivos de origen no hayan cambiado.
De ahí mi pregunta: ¿Cuál es el comportamiento oficial de rsync en caso de que se le solicite sincronizar dos archivos idénticos pero separados y los archivos ya existan en el destino con el contenido correcto, pero como enlaces físicos al mismo archivo? ¿Cuál es el criterio exacto para retransmitir un archivo? ¿Hay alguna manera de garantizar que el vínculo físico en el destino se conserve en esa situación aunque el vínculo físico no exista en el origen?
Respuesta1
tl;dr: Para preservar la deduplicación a nivel de archivo a través de enlaces físicos en el destino, ejecute rsync
la --checksum
opción.
Respuesta completa, según una serie de experimentos que hice:
Si dos archivos no están vinculados en el origen, rsync
se sincronizará cada uno de ellos individualmente con el destino. No importa si los archivos están vinculados en el destino. Si uno de los archivos (o ambos) termina siendo retransmitido, el enlace físico en el destino se romperá; de lo contrario, permanecerá intacto. Es decir, incluso con la --hard-links
opción, rsync
no se romperá un vínculo físico en el destino solo porque los archivos no están vinculados en el origen.
Los criterios para retransmitir un archivo dependen de las opciones --checksum
( -c
) y --ignore-times
( -I
).
- Si se da la opción
--checksum
, solo se retransmiten los archivos que difieren en tamaño o suma de verificación entre el origen y el destino. En consecuencia, si el contenido del archivo no ha cambiado, se conservará un enlace físico en el destino incluso si no existe en el origen. - Si
--ignore-times
se da la opción, todos los archivos se retransmiten, rompiendo cualquier vínculo físico en el destino que no exista en el origen. - Si no se da ninguna de estas dos opciones,
rsync
utilizará las marcas de tiempo de modificación de los archivos de origen y de destino para su decisión. En ese caso, si las marcas de tiempo de los dos archivos de origen difieren, un vínculo físico en el destino siempre se romperá porque solo una de las dos marcas de tiempo puede coincidir.
Respuesta2
Conserva los enlaces físicos de origen si utiliza la opción -H o --hard-links
Esa voluntadnocree enlaces físicos: tendrá que hacerlo después buscando archivos con la misma suma de verificación, eliminando uno y agregando un enlace físico para reemplazarlo. Después de todo, no querrás que rsync convierta cada archivo duplicado de contenido en un enlace físico al mismo archivo. Imagínese si cada archivo de longitud 0 fuera un enlace físico: agrega contenido a uno y cambia el contenido para todos.