Watch at EaseHistorias. Respuestas. Perspectiva.

Tecnología · GUÍA PRÁCTICA

¿rsync --link-dest creó copias? Verifique la estructura de rutas y los atributos preservados

Resuelva el directorio de referencia desde el destino, identifique diferencias de atributos y verifique los enlaces duros mediante dispositivo e inode, sin confiar solo en hashes iguales.

Ilustración editorial original de los árboles del origen, la referencia anterior y la nueva instantánea, con rutas relativas de archivos coincidentes.
Ilustración editorial original: resuelva --link-dest desde el destino y compruebe que coincide la ruta relativa antes de esperar un enlace duro. Watch at Ease

Que dos archivos sean idénticos byte a byte no basta para rsync --link-dest. El archivo anterior debe estar en la misma ruta relativa y coincidir en todos los atributos que preserve el comando. Una ruta de referencia incorrecta respecto al destino, un prefijo de --relative, una diferencia de modo de permisos o grupo, o --ignore-times pueden generar una copia independiente sin cambiar el contenido.

Trate la creación de enlaces duros como una propiedad verificable de la copia de seguridad. Registre el comando exacto y las rutas resueltas en el receptor, ejecute el mismo comando con --dry-run y --itemize-changes, escriba en una instantánea vacía y después compare los números de dispositivo e inode. Los hashes iguales solo prueban que los bytes son iguales; no demuestran que se comparta almacenamiento.

1. Fije el comando exacto y un destino vacío

Copie el comando exacto de rsync en una nota del incidente, incluidas las barras finales de origen y destino, las opciones que engloba -a, -R o --relative, -H, las opciones de ACL o xattr, las exclusiones y cada --link-dest. Trabaje en un directorio nuevo y vacío para la instantánea; el manual oficial advierte que los archivos ya existentes en el destino pueden sufrir cambios de atributos y dificultar la interpretación de la salida detallada.

No añada --ignore-times como atajo de diagnóstico. El manual de rsync dice expresamente que esta opción impide que --link-dest cree enlaces, porque enlazar sustituye a una transferencia; no es una segunda pasada después de una actualización.

2. Resuelva la referencia desde el destino

Con DEST=/backups/2026-10-28 y --link-dest=../2026-10-27, el directorio de referencia se resuelve como /backups/2026-10-27. Use realpath sobre el destino y sobre la ruta de referencia compuesta, y confirme que el archivo anterior existe en la misma ruta relativa que creará la nueva transferencia. No resuelva una referencia relativa desde el directorio actual del shell.

Un origen que termina en barra transfiere el contenido del directorio; sin ella, rsync crea un nivel adicional con el directorio de origen. --relative también conserva los prefijos del origen. Una referencia absoluta elimina la ambigüedad sobre dónde comienza DIR, pero no elimina los prefijos introducidos por --relative: el árbol anterior todavía debe contener la misma ruta relativa transferida.

3. Distinga la igualdad de bytes de la igualdad de atributos

Ejecute el comando rsync original desde el mismo host iniciador, la misma cuenta de usuario y el mismo directorio de trabajo, manteniendo los extremos de origen y destino y todas las demás opciones; añada --dry-run y --itemize-changes. Inspeccione las rutas de referencia y destino y sus números de dispositivo en el host receptor. Interprete las letras de la salida detallada en vez de detenerse ante un checksum igual. Una diferencia p, o, g, t, a o x puede explicar por qué rsync creó una copia local: los nombres enlazados al mismo inode no pueden tener metadatos de inode distintos.

Compare con stat el archivo de origen y el candidato anterior, y registre modo de permisos, propietario, grupo, tamaño y fecha de modificación. Si decide no preservar un atributo, conviértalo en una decisión explícita de política y mantenga coherentes el origen, la instantánea anterior y la nueva ejecución; no desactive la preservación a ciegas para forzar la deduplicación.

4. Compruebe los límites del sistema de archivos y de rsync

GNU documenta que los enlaces duros no pueden cruzar límites entre sistemas de archivos. Registre los números de dispositivo del archivo anterior y del nuevo directorio de destino. Si son distintos, rsync aún puede utilizar el archivo anterior como base de transferencia, pero no puede crear el enlace duro entre ambos sistemas de archivos. Los tipos de archivo especiales y los propios sistemas de archivos pueden imponer otros límites.

Distinga -H de --link-dest. -H conserva los grupos de enlaces duros que ya existen en el origen; --link-dest crea enlaces a partir de archivos sin cambios en una jerarquía de instantáneas alternativa. Una opción no corrige para la otra una ruta de referencia incorrecta.

5. Ejecute una vez y después demuestre el enlace

Para la ejecución real, quite --dry-run (o -n si lo utilizó) del comando revisado, conserve todas las demás opciones revisadas y ejecute rsync sobre el destino vacío; la comprobación con stat -c que sigue utiliza GNU stat. Para una muestra de archivos regulares sin cambios, use stat -c '%d %i %h %a %s %Y %n' en las rutas anterior y nueva. Acepte la afirmación de ahorro de espacio solo si coinciden los números de dispositivo e inode; el número de enlaces debe reflejar el nombre adicional.

Registre también hashes para comprobar la integridad del contenido, pero mantenga separadas las conclusiones. En el caso de prueba local con rsync 3.2.7, unos atributos idénticos produjeron el mismo inode y un número de enlaces de 2. Cambiar solo el modo de permisos produjo cf...p..... en la salida detallada y un inode nuevo; --ignore-times produjo >f......... y otro inode nuevo, aunque todos los hashes SHA-256 coincidían.

6. Escale los fallos de versiones concretas con evidencias

Antes de escalar, siga los resultados observados. Si falta el candidato anterior en la ruta --relative calculada, compruebe tanto la estructura de la ruta transferida como si la instantánea anterior seleccionada contiene ese archivo y terminó correctamente; la ausencia por sí sola no demuestra una discrepancia de prefijos. Corrija una discrepancia de estructura confirmada en la configuración de la transferencia. Si la referencia está incompleta o no contiene el archivo, elija, si está disponible, una referencia completa y verificada que incluya ese candidato; de lo contrario, espere una nueva copia de ese archivo. Las marcas p, o, g, t, a o x identifican valores de atributos preservados que difieren; compare los metadatos del origen y de la copia anterior con la política de preservación prevista antes de decidir qué cambiar. -I o --ignore-times desactiva la sustitución de la transferencia por un enlace, y distintos números de dispositivo hacen imposible el enlace duro. Solo si esas comprobaciones pasan, registre las versiones local y remota de rsync, el modo de transferencia, la salida detallada y una reproducción mínima. Un informe de primera mano de 2026 documentó una regresión del daemon con referencias relativas que retransmitía datos silenciosamente y fue corregida por el proyecto; conserve la evidencia de versión sin atribuir todos los fallos a ese error.

Este procedimiento demuestra la reutilización mediante enlaces de archivos regulares en las rutas muestreadas. No certifica todas las ACL, xattr, enlaces simbólicos, nodos de dispositivo, montajes remotos ni compilaciones antiguas de rsync. Amplíe la muestra según las clases concretas de archivos que su copia de seguridad promete cubrir y después supervise en las nuevas instantáneas la reutilización de inodes y los bytes transferidos inesperadamente.

Ilustración editorial original que compara evidencias de dispositivo e inode coincidentes con archivos de hashes iguales pero inodes distintos.
Ilustración editorial original: hashes iguales prueban bytes iguales; números de dispositivo e inode coincidentes prueban que los dos nombres son enlaces duros. Watch at Ease