Existe um sistema de arquivos que mantém apenas uma cópia de um arquivo e outras cópias são apenas referências?

18

A pergunta pode ser imprecisa, então tentarei explicá-la com mais detalhes.

Por várias razões, tenho muitas cópias do mesmo arquivo no meu sistema de arquivos Linux. Muitos deles são bastante grandes.

Digamos que possuo /path/to/some.filee cópias deste arquivo /other/path/file.namee /yet/another/path/third.copy. Gostaria de saber se existe um sistema de arquivos que literalmente faria dois desses arquivos agirem como uma referência ao original. Naturalmente, se o usuário modificar um deles, somente então eles se tornarão arquivos independentes.

PS. Eu sei que isso pode ser (parcialmente) realizado usando links. Mas quero que esse recurso que tentei explicar acima seja tratado de forma transparente pelo sistema de arquivos.

DejanLekic
fonte
Como ainda não parece haver uma resposta perfeita, por que não escrever um script (talvez executado a partir do cron) que substitua os arquivos por links físicos (ou, se for seguro para alguns deles, links simbólicos)? De qualquer forma, se você ainda não sabe onde estão todas as duplicatas, consulte fdupes code.google.com/p/fdupes .
19412 Joe
11
Não posso fazer isso porque, quando algum usuário altera os dados em uma das duplicatas, eles devem se tornar arquivos independentes porque o conteúdo é diferente após a alteração ... Se eu criar links simbólicos, a modificação realmente mudará o original. Pense no arquivo original como um valor em uma linguagem de programação funcional - quando você o modifica, obtém literalmente um novo objeto e faz referência a ele.
DejanLekic
ESTÁ BEM. Apenas algumas idéias: existe alguma maneira de obter entre seus usuários e esses arquivos? Se puder, você pode começar com um link (simbólico ou físico) e, em seguida, interromper o link se eles escreverem algo no arquivo. Você também pode usar algo como diff para armazenar apenas diferenças e economizar muito espaço, como em um sistema de controle de versão. Se você colocar os arquivos em um deles, ele poderá gerenciar as diferenças para você. Eu não usei muito os sistemas vcs, então não conheço os detalhes.
23412 Joe

Respostas:

17

Esse recurso é chamado de deduplicação . Nenhum dos sistemas de arquivos Linux populares (ext *) o suporta, mas aparentemente o ZFS o suporta parcialmente . Há também uma tabela de sistemas de arquivos listando, entre outros, a desduplicação, mas não parece haver nenhuma escolha popular - é um recurso planejado para o Btrfs.

Eu acho que verificar periodicamente o seu sistema de arquivos e criar links físicos apropriados é o melhor que você pode fazer no momento, embora isso não implique cópia na gravação.

Cláudio
fonte
Eu esperava que o BTRFS o tivesse alraedy. Eu não sabia que eles planejavam ter esse recurso - boas notícias! Obrigado!
DejanLekic
10

A palavra-chave principal que você deseja procurar é "copiar na gravação". O BTRFS possui uma operação de clone que faz exatamente o que você deseja e cp --reflinkfará o que você está procurando, desde que o seu sistema possua um kernel e coreutils 7.5 modernos o suficiente. Fonte do Wiki Além disso, bedup é uma ferramenta que mescla duplicatas em um volume inteiro. O CoW também é o recurso de direção abaixo da tecnologia de captura de imagens da btrfs, IIRC.

afrazier
fonte
Estou ciente, cp --reflinkmas note que realmente quero que o FS detecte clones e use referências em vez disso, de forma transparente. Também estou fora da bedupferramenta.
DejanLekic
Quando um processo no nível do usuário lê de um arquivo e grava em outro, como a camada FS saberá que é uma cópia exata e não uma cópia modificada? É por isso que há um ioctl separado para clonagem versus apenas leitura e escrita. Os aplicativos que desejam clonar arquivos e desejam usar o CoW devem usar essas coisas quando disponíveis e voltar ao contrário. Não existe um método mágico confiável pelo qual a camada FS possa detectar uma cópia e fazer CoW. Um aplicativo deve usar a chamada adequada para o trabalho ( cp --reflink/ clone) ou uma ferramenta separada para concluir o trabalho mais tarde (hora de dormir).
afrazier
Comparando valores de hashes (mais seguros) ou crc + timestamp. A gravação definitivamente faria o FS criar uma cópia independente de um arquivo. Futhermore, este sistema ma ser implementado no nível de página ...
DejanLekic
E onde exatamente isso é feito no kernel? O que você está falando não é um problema simples. Também é possível fazê-lo no nível da página, mas requer grandes quantidades de RAM para fazer inline - o ZFS pode ter mais de 20 GB de RAM por TB de dados [Fonte ] e o OpenDedup deseja 8 GB de RAM por TB de dados. / 4k páginas [Fonte ]. Os requisitos do ZFS podem ser reduzidos com o L2ARC ao custo do desempenho.
afrazier
11
O WHS não faz desduplicação, a menos que você esteja falando sobre o armazenamento de backup. No caso de software de backup, o cliente pode fazer a maior parte do trabalho e verificar o hash com o servidor antes de enviar quaisquer dados para serem gravados. Um serviço de backup é um animal muito diferente de um sistema de arquivos. Estratégias que funcionam para um podem não ser viáveis ​​para outro.
afrazier
4

Existe um sistema de arquivos online S3QL projetado para backups com grande capacidade de desduplicação.

Daniel Fanjul
fonte
Eu deveria ter dito que preciso disso para um sistema de arquivos local ... +1 de qualquer maneira para obter informações úteis.
DejanLekic
@DejanLekic, URLs como local: // ... são permitidos.
precisa
0

Zfs, btrfs, ext3cow, bcachefs (disponível, mas há uma chance de ainda não estar implementado). A Microsoft tinha um em desenvolvimento, mas eles pararam por razões desconhecidas.

orange_juice6000
fonte