Estou brincando com o btrfs, que permite cp --reflink
copiar na gravação. Outros programas, como o lxc-clone
, também podem usar esse recurso. Minha dúvida é: como saber se um arquivo é CoW de outro? Assim como no hardlink, posso dizer pelo número do inode.
Responder1
Boa pergunta. Parece que atualmente não existem maneiras fáceis de saber de alto nível.
Um problema é que um arquivo pode compartilhar apenas parte dos dados via Copy-on-Write. Isso é chamado de extensão física ealguns ou todosdas extensões físicas podem ser compartilhadas entre arquivos CoW.
Não há nada análogo a um (Editar: vejaminha outra resposta).inode
que, quando comparado entre arquivos, diga que os arquivos compartilham as mesmas extensões físicas.
A resposta de baixo nível é que você pode perguntar ao kernel quais extensões físicas são usadas para o arquivo usando o comandoFS_IOC_FIEMAP
ioctl
, qual édocumentado emDocumentation/filesystems/fiemap.txt
. Em princípio, se todas as extensões físicas forem iguais, o arquivo deverá compartilhar o mesmo armazenamento subjacente.
Poucas coisas implementam uma maneira de analisar essas informações em um nível superior. Eu encontrei algunsvá o código aqui. Aparentemente ofilefrag
o utilitário deve mostrar as extensões com -v. Além disso,btrfs-debug-tree
mostra essas informações.
Eu gostaria de ter cuidado, no entanto, uma vez que essas coisas podem ter pouca utilidade para esse propósito, você pode encontrar bugs que lhe dão respostas erradas, então tome cuidado ao confiar nesses dados para decidir sobre operações que podem causar corrupção de dados.
Algumas questões relacionadas:
Responder2
Seguindo minha resposta anterior, acabei de lançarfienode
que calcula um hash SHA1 das extensões físicas do arquivo e pode ser usado para encontrar algumas cópias de reflink (idênticas). Porém, tenha cuidado, há advertências (vejaa documentação). O BTRFS decidiu alterar algumas, mas não todas, as extensões físicas de uma cópia refink que fiz sem provocação ou aviso, fazendo com que o valor mudasse.
Responder3
A solução mais fácil para isso é usar btrfs filesystem du .
Exclusive será 0,00B se for CoW.
Encontrado aqui:https://unix.stackexchange.com/a/655813/525352
Responder4
Isso não acrescenta muito à resposta aceita, mas alguém resumiu os problemas e vários métodos aqui -https://www.ctrl.blog/entry/distinguish-file-link-clone.html
Problemas:
- distinguir links simbólicos e links físicos de links de referência
- identificar clones parciais (arquivos que compartilham alguns dados, mas não todos)
Soluções:
- Usar filefrag
- Use
stat
para identificar o dispositivo, pois os clones devem residir no mesmo sistema de arquivos.
Citar:
Os links físicos compartilham o mesmo número de inode de seu destino, enquanto os clones têm seus próprios inodes. Essa distinção (mais um sistema de arquivos copy-on-write) é o que permite que os clones atuem independentemente de seus originais, mesmo quando modificados por programas que não reconhecem a clonagem."
- Execute o comando filefrag -v file1 file2 (parte de e2fsprogs). Compare os intervalos de deslocamento físico dos arquivos nas linhas de extensão que possuem o sinalizador compartilhado definido.
Os dois arquivos compartilham dados desduplicados/clonados na unidade de armazenamento se compartilharem intervalos idênticos ou sobrepostos.
Quanto a determinar qual é o original e qual é o clone…. Isso é quase impossível de determinar sem uma máquina do tempo.