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

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

Desduplicamos 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, quais outros arquivos são os mesmos reflinks?

Responder1

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 com eficiência. Portanto, você pode ver um arquivo como uma coleção de intervalos com conteúdo, onde o conteúdo pode ou não ser compartilhado por outros arquivos. Ou por outras versões do arquivo. A implementação é mais parecida com 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, produzindo uma nova versão desse arquivo) está sendo usado para fazer a desduplicação. A implementação é descrita emhttps://github.com/g2p/bedup:

A desduplicação é implementada usando um recurso Btrfs que permite clonar dados de um arquivo para outro. Os intervalos clonados são compartilhados no disco, economizando espaço.

A implementação no kernel é (por exemplo) emhttp://lxr.free-electrons.com/source/fs/btrfs/ioctl.c#L2843; o comentário deixa claro que não se trata de 'reflinkar' 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 é vinculado novamente, é o intervalo que é compartilhado. Um novo arquivo também poderia ter sido construído compartilhando o intervalo com vários arquivos. Ou sendo compartilhado entre volumes. Ou (não tenho certeza se isso é suportado atualmente) mesmo tendo o mesmo intervalo várias vezes no mesmo arquivo;)

Portanto, não existe nenhuma ferramenta de alto nível para localizar arquivos que compartilhem o arquivo inteiro, pois este é um conceito derivado. Claro que seria possível escrever suporte para isso, mas não é o caso, até onde eu sei...

Responder2

Acabei de lançar um programa chamadofienode(← 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 do sistema de arquivos e procurar hashes idênticos.

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

Observe, entretanto, que o BTRFS tem liberdade para alterar as extensões físicas. Observei que um grande arquivo relinkado altera suas extensões físicas sem provocação, tornando a fienodesaída diferente, embora a maioria das extensões físicas ainda estivesse compartilhada.

informação relacionada