¿Cómo encontrar copias de datos de un archivo determinado en el sistema de archivos Btrfs?

¿Cómo encontrar copias de datos de un archivo determinado en el sistema de archivos Btrfs?

He deduplicado mi sistema de archivos Btrfs con bedup, por lo que ahora todos los archivos duplicados (por encima de cierto tamaño) son copias "reflink".

¿Hay alguna forma de ver, dado un nombre de archivo, qué otros archivos tienen los mismos enlaces de referencia?

Respuesta1

El objetivo de tener un sistema de archivos de copia en escritura (CoW) como btrfs es que el contenido de múltiples versiones de un archivo se puede compartir de manera eficiente. Por lo tanto, es posible que vea un archivo como una colección de rangos con contenidos, cuyo contenido puede o no ser compartido por otros archivos. O por otras versiones del archivo. La implementación se parece más a un árbol de extensiones, donde se pueden compartir extensiones.

El mismo mecanismo que funciona al escribir un cambio en un archivo (y, por lo tanto, al producir una nueva versión de ese archivo) se utiliza para realizar la deduplicación. La implementación se describe enhttps://github.com/g2p/bedup:

La deduplicación se implementa mediante una función Btrfs que permite clonar datos de un archivo a otro. Los rangos clonados se comparten en el disco, ahorrando espacio.

La implementación en el kernel está (por ejemplo) enhttp://lxr.free-electrons.com/source/fs/btrfs/ioctl.c#L2843; el comentario deja claro que no se trata de 'volver a vincular' el archivo, sino de rangos:

2843 /**
2844  * btrfs_clone() - clone a range from inode file to another
2845  *
2846  * @src: Inode to clone from
2847  * @inode: Inode to clone to
2848  * @off: Offset within source to start clone from
2849  * @olen: Original length, passed by user, of range to clone
2850  * @olen_aligned: Block-aligned value of olen, extent_same uses
2851  *               identical values here
2852  * @destoff: Offset within @inode to start clone
2853  */

Por lo tanto, no es el archivo el que se vuelve a vincular, sino el rango el que se comparte. También se podría haber construido un nuevo archivo compartiendo el rango con varios archivos. O ser compartido entre volúmenes. O (no estoy seguro si esto es actualmente compatible) incluso tener el mismo rango varias veces en el mismo archivo;)

Por lo tanto, no existe ninguna herramienta de alto nivel para buscar archivos que compartan el archivo completo, ya que se trata de un concepto derivado. Por supuesto, sería posible escribir soporte para ello, pero hasta donde yo sé, ese no es el caso...

Respuesta2

Acabo de lanzar un programa llamadofienode(← enlace) que calcula un hash SHA1 de las extensiones físicas de un archivo. Las copias idénticas de CoW tienen el mismo hash.

En principio, puede ejecutar esto en todos los archivos del sistema de archivos y luego buscar hashes idénticos.

También hay una respuesta más detallada aquí, que explica por qué es necesario.

Sin embargo, tenga en cuenta que BTRFS tiene la libertad de cambiar las extensiones físicas. He observado que un archivo grande vinculado cambia sus extensiones físicas sin provocación, lo que hace que el fienoderesultado sea diferente, a pesar de que la mayoría de las extensiones físicas todavía estaban compartidas.

información relacionada