Tenho diretórios com backups incrementais antigos e eles estão cheios de cópias redundantes de vários arquivos. Meu plano era usar o ZFS que lida com somas de verificação de arquivos e evita redundância.
Portanto, uma situação modelo:
cd /poolname/zalohy
zfs list -p poolname
NAME USED AVAIL REFER MOUNTPOINT
poolname 995328 374734901248 98304 /poolname
for i in {0..10}; do echo {1..99999} >file$i.txt; done # I create eleven identical files of the size 588888 bytes.
zfs list -p poolname
NAME USED AVAIL REFER MOUNTPOINT
poolname 5677056 374730219520 98304 /poolname
374734901248 - 374730219520 = 4 681 728, i.e. cca 5MB.
Eu esperava que 11 arquivos idênticos (com a mesma soma de verificação) ocupassem um pouco mais de 588.888 bytes, ou seja, dez vezes menos.
Onde está o problema. Como lidar com essa redundância? Existe um sistema de arquivos melhor que o ZFS para essa finalidade?
Muito obrigado pela ajuda.
Em geral
Isso requer que seu pool ZFS (ou sistema de arquivos) tenha sido configurado com a Deduplicação habilitada.
Da documentação do OpenZFS :
A desduplicação está desabilitada por padrão porque, como mencionado acima, ela pode consumir muito CPU e memória.
Tal como acontece com todas as propriedades do ZFS, a
dedup
propriedade pode ser definida no nível do pool ZFS ou do conjunto de dados (sistema de arquivos) e ser herdada pelos sistemas de arquivos subjacentes.Antes de ativar
dedup
, você deve considerar o seguinte:Para verificar se o seu pool será beneficiado
dedup
, você pode executar (ondetank
está o nome do pool) :O
-S
simuladedup
estatísticas e só pode ser usado em todo o pool. A saída será uma DDT (tabela de desduplicação) simulada e termina com algumas estatísticas como:Como regra geral, se a
dedup
proporção estimada for superior a 2, a desduplicação poderá ser uma opção para economizar espaço. No exemplo acima, como adedup
proporção é 1,2, provavelmente não vale a pena.Para verificar a
dedup
propriedade de um pool, digite:E para definir a desduplicação para o pool, digite:
E para configurá-lo apenas para um conjunto de dados (
tank/home
), digite:Depois
dedup
de habilitado em um pool existente, somente os dados recém-criados serão desduplicados.Conforme mencionado na documentação, pode ser uma opção melhor definir a
compression=lz4
propriedade em seu pool (lz4
a compactação tem pouco ou nenhum impacto no desempenho na maioria dos sistemas) .Para sua situação
Para sua situação específica, eu criaria um conjunto de dados específico (sistema de arquivos) apenas para backup e ativaria a desduplicação apenas neste conjunto de dados.
Por exemplo, se você criar o conjunto de dados ZFS
poolname/backup
:E então defina:
Desta forma, você pode testar se funciona da maneira esperada. E se tiver problemas, você sempre pode transferir seu backup para um conjunto de dados ZFS normal sem
dedup
habilitação (mas talvez com compactação).Observação: não é possível desabilitar a desduplicação em um pool ou conjunto de dados depois de habilitada. Nesse caso, só é possível fazer backup dos dados, destruir o conjunto de dados e mover os dados para outro conjunto de dados sem desduplicação. É por isso que eu nunca recomendaria habilitar a desduplicação em um Zpool inteiro.
Outro usuário útil no Mastodon acabou de postar um link para o
hardlink
comando ( https://manpages.debian.org/unstable/util-linux/hardlink.1.en.html ) O que parece ser uma solução melhor para o seu problema do que o programa que eu escreveu (mencionado em um comentário à resposta mais longa e definitiva WRT ZFS.)No Ubuntu 22.04,
hardlink
é instalado por padrão (como parte doutil-linux
pacote) e, no seu caso, o comando padrão a ser executado seria (se o diretório/poolname/zalohy
contiver os dados de backup):Consulte a
hardlink
página de manual para obter mais informações.