Como encontrar cópias de dados de um determinado arquivo no sistema de arquivos Btrfs?

6

Eu desdupliquei meu sistema de arquivos Btrfs com bedup, então agora todos os arquivos duplicados (acima de um determinado tamanho) são cópias "reflink".

Existe alguma maneira de ver, dado um nome de arquivo, que outros arquivos são os mesmos reflexos?

    
por Peter Smit 06.05.2014 / 09:29

2 respostas

3

O objetivo de ter um sistema de arquivos Copy-On-Write (CoW) como o btrfs é que o conteúdo de várias versões de um arquivo pode ser compartilhado eficientemente. Assim, você pode ver um arquivo como uma coleção de intervalos com conteúdo, em que o conteúdo pode ou não ser compartilhado por outros arquivos. Ou por outras versões do arquivo. A implementação é mais como uma árvore de extensões, onde as extensões podem ser compartilhadas.

O mesmo mecanismo que funciona durante a gravação de uma alteração em um arquivo (e, portanto, produz uma nova versão desse arquivo) está sendo usado para fazer a deduplicação. A implementação está descrita no link :

Deduplication is implemented using a Btrfs feature that allows for cloning data from one file to the other. The cloned ranges become shared on disk, saving space.

A implementação no kernel é (por exemplo) no link ; o comentário deixa claro que não se trata de "refletir" o arquivo, mas de intervalos:

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  */

Portanto, não é o arquivo que é reavaliado, é o intervalo que é compartilhado. Um novo arquivo também poderia ter sido construído compartilhando o intervalo com vários arquivos. Ou ser compartilhado entre volumes. Ou (não tenho certeza se isso é atualmente suportado), mesmo tendo o mesmo intervalo várias vezes no mesmo arquivo;)

Portanto, não existe uma ferramenta de alto nível para encontrar arquivos que compartilhem o arquivo inteiro, pois esse é um conceito derivado. Claro que seria possível escrever suporte para isso, mas não é o caso, tanto quanto eu sei ...

    
por 21.05.2014 / 23:10
0

Acabei de lançar um programa chamado fienode (← link) que calcula um hash SHA1 das extensões físicas de um Arquivo. Cópias idênticas do CoW têm o mesmo hash.

Em princípio, você pode executar isso em todos os arquivos no sistema de arquivos e, em seguida, procurar por hashes idênticos.

Há também uma resposta mais detalhada aqui, explicando por que isso é necessário.

Note, no entanto, que o BTRFS tem a liberdade de alterar as extensões físicas. Eu observei que um grande arquivo com link refletido muda suas extensões físicas sem provocação, tornando a saída fienode diferente, mesmo que a maioria das extensões físicas ainda sejam compartilhadas.

    
por 17.04.2016 / 10:26