Existem scripts de deduplicação que usam o btrfs CoW como dedup?

9

Procurando por ferramentas de desduplicação no Linux, há muitas, veja, por exemplo, esta página wiki .

Quase todos os scripts fazem apenas a detecção, imprimindo os nomes de arquivos duplicados ou removendo os arquivos duplicados vinculando-os a uma única cópia.

Com o surgimento do btrfs, haveria outra opção: criar uma cópia CoW (copy-on-write) de um arquivo (como cp reflink=always). Não encontrei nenhuma ferramenta que faça isso, alguém conhece a ferramenta que faz isso?

Peter Smit
fonte
Atualização: O ramo de desenvolvimento do rmlint, e acredito que também seja mestre, adicionou o seguinte: 1) Hash incremental de arquivo. Ele não re-hash de um arquivo, a menos que tenha sido alterado desde a última execução [que é enorme]. 2) Desduplicação incremental . Deduz apenas arquivos que ainda não foram ou foram alterados. [Isso é ainda mais abrangente.] Combinado com apenas arquivos de hash depois que todos os outros métodos de comparação rápida falham, o torna imbatível. Bedup é abandonado e, aparentemente, não será compilado. Fiz uma comparação detalhada: docs.google.com/spreadsheets/d/…
Jim

Respostas:

17

Eu escrevi bedup para este fim. Ele combina a digitalização incremental de btree com a desduplicação de CoW. Melhor usado com o Linux 3.6, onde você pode executar:

sudo bedup dedup
Gabriel
fonte
Olá @ Gabriel, um comentário à minha resposta abaixo afirma que "... adormecido ... coloque coisas em baldes de tamanho e leia apenas o arquivo inteiro, para criar somas de verificação, se necessário". Isso é verdade? Nesse caso, gostaria de atualizar minha resposta abaixo. (E uso o bedup eu mesmo!) Infelizmente não consegui verificar isso em nenhum lugar. Eu tentei o Google, pesquisando na sua página do github e uma pesquisa no código. Obrigado.
Jim
4

Eu tentei dormir. Embora seja bom (e tenha alguns recursos diferenciados úteis que possam torná-lo a melhor escolha para muitos), parece verificar a totalidade de todos os arquivos de destino em busca de somas de verificação.

O que é dolorosamente lento.

Outros programas, por outro lado, como rdfind e rmlint, digitalizam de maneira diferente.

O rdfind possui um recurso "experimental" para usar o refluxo btrfs. (E opções "sólidas" para links físicos, links simbólicos etc.)

O rmlint possui opções "sólidas" para btrfs clone, reflink, hardlinks regulares, links simbólicos, exclusão e seus próprios comandos personalizados.

Mais importante, porém, rdfind e rmlint são significativamente mais rápidos. Como em ordens de magnitude. Em vez de varrer todos os arquivos de destino em busca de somas de verificação, ele faz isso aproximadamente:

  • Examine todo o sistema de arquivos de destino, reunindo apenas caminhos e tamanhos de arquivo.
  • Remova da consideração arquivos com tamanhos de arquivo exclusivos. Isso por si só, economiza muito tempo e atividade do disco. ("Scads" é uma função exponencial inversa ou algo assim.)
  • Dos candidatos restantes, verifique os primeiros N bytes. Remova da consideração aqueles com o mesmo tamanho de arquivo, mas com os primeiros N bytes diferentes.
  • Faça o mesmo para os últimos N bytes.
  • Somente o restante (geralmente pequena fração) restante, procura por somas de verificação.

Outras vantagens do rmlint que conheço:

  • Você pode especificar a soma de verificação. MD5 muito assustador? Tente sha256. Ou 512. Ou comparação bit a bit. Ou sua própria função de hash.
  • Ele oferece a opção de Btrfs "clone" e "reflink", em vez de apenas reflink. "cp --reflink = always" é apenas um pouco arriscado, pois não é atômico, não está ciente do que mais está acontecendo com esse arquivo no kernel e nem sempre preserva os metadados. "Clone", OTOH (que é um termo abreviado ... Estou ignorando o nome oficial relacionado à API), é uma chamada no nível do kernel que é atômica e preserva os metadados. Quase sempre resultando na mesma coisa, mas um pouco mais robusta e segura. (Embora a maioria dos programas seja inteligente o suficiente para não excluir o arquivo duplicado, se ele não conseguir primeiro fazer com que uma temperatura reflita para o outro.)
  • Ele tem várias opções para muitos casos de uso (o que também é uma desvantagem).

Comparei o rmlint com o deduperemove - que também verifica cegamente todos os arquivos de destino em busca de somas de verificação. Duperemove levou vários dias no meu volume para concluir (4 eu acho), indo até o máximo. O fmlint levou algumas horas para identificar duplicatas e menos de um dia para deduzi-las com o clone Btrfs.

(Dito isto, qualquer um que se esforce para escrever e oferecer suporte a software robusto e de qualidade, de graça, merece muitos elogios!)

Btw: você deve evitar a deduplicação usando hardlinks regulares como uma solução de desduplicação "geral", a todo custo.

Embora os hardlinks possam ser extremamente úteis em certos casos de uso direcionados (por exemplo, arquivos individuais ou com uma ferramenta que possa verificar tipos específicos de arquivos que excedam um tamanho mínimo - ou como parte de muitas soluções de backup / captura de tela gratuitas e comerciais), pode ser desastroso para "desduplicação" em um sistema de arquivos grande para uso geral. O motivo é que a maioria dos usuários pode ter milhares de arquivos em seu sistema de arquivos, que são binários idênticos, mas funcionalmente completamente diferentes.

Por exemplo, muitos programas geram modelos e / ou arquivos de configurações ocultos (às vezes em todas as pastas que podem ver), que são inicialmente idênticos - e a maioria permanece assim, até que você, usuário, precise que eles não sejam.

Como uma ilustração específica: os arquivos de cache de miniaturas de fotos, que incontáveis ​​programas geram na pasta que contém as fotos (e por boas razões - portabilidade), podem levar horas ou dias para serem gerados, mas tornam fácil o uso de um aplicativo de fotos. Se esses arquivos de cache inicial estiverem todos vinculados, depois você abrirá o aplicativo em um diretório e ele criará um cache grande ... então adivinhe: Agora, TODAS as pastas que possuem um cache vinculado anteriormente, agora têm o cache errado. Potencialmente, com resultados desastrosos que podem resultar em destruição acidental de dados. E também potencialmente de uma maneira que explode uma solução de backup que não reconhece hardware.

Além disso, pode arruinar instantâneos inteiros. O objetivo principal das capturas instantâneas é que a versão "ao vivo" possa continuar a mudar, com a capacidade de reverter para um estado anterior. Se tudo estiver vinculado juntos ... você "reverte" para a mesma coisa.

A boa notícia é que a desduplicação com o clone / reflink do Btrfs pode desfazer esse dano (eu acho - já que durante a verificação, ele deve ver os arquivos vinculados como idênticos ... a menos que tenha lógica para não considerar os links físicos. Provavelmente depende de o utilitário específico que está executando a desduplicação.)

Jim
fonte
Isso não está correto; bedup faz o mesmo, coloca as coisas em baldes de tamanho e apenas lê o arquivo inteiro, para criar somas de verificação, se necessário. Além disso, o bedup armazena o resultado disso para que as execuções subsequentes sejam ainda mais rápidas.
Peter Smit
@ PeterSmit, eu gostaria de atualizar minha resposta (e considere voltar a dormir sozinho), se eu puder verificar a primeira parte do seu comentário. O leia-me do github do Bedup não menciona isso, e uma pesquisa por "tamanho do arquivo" ou "tamanho do arquivo" não fornece respostas óbvias. Como posso verificar?
Jim
Além disso, a hora de dormir parece ter sido abandonada nos últimos 3 anos. O que é uma pena, pois parece uma ideia realmente fantástica que eu adoraria usar! Espero que você pegue de volta.
Jim