Estou copiando um grande número de arquivos entre dois sistemas de arquivos BtrFS compactados com lzo em unidades diferentes montadas na mesma máquina. Parece que os arquivos estão sendo des/recompactados. Existe uma maneira de evitar isso?
Estou copiando um grande número de arquivos entre dois sistemas de arquivos BtrFS compactados com lzo em unidades diferentes montadas na mesma máquina. Parece que os arquivos estão sendo des/recompactados. Existe uma maneira de evitar isso?
Na verdade não, e tudo se resume a syscalls. Tenha um exemplo:
(Estes são dados strace, um pouco limpos para maior clareza, feitos durante a cópia de um arquivo.)
Para copiar um arquivo do ponto A para o ponto B, especialmente entre os pontos de montagem, o Linux chamará
read
o arquivo a ser copiado e, em seguida, chamaráwrite
o novo. Você pode vê-lo no traço acima.A
read
syscall solicita o arquivo para uso por um processo, que aciona a descompactação BTRFS. Esses dados recuperados são alimentados nawrite
chamada, o que acionará a compactação BTRFS no destino. Esse comportamento é fundamental para o funcionamento das camadas do sistema de arquivos do Linux.Para contornar isso, não use
cp
. Você teria que usar uma ferramenta específica do btrfs que lida com a movimentação de estruturas de dados inteiramente dentro do volume btrfs. O problema é que não sei se essas ferramentas existem.Como @ sysadmin1138 tão bem ilustrado, esse problema é inevitável se usar
cp
/rsync
/send
-receive
em sistemas de arquivos; mas há uma maneira de evitá-lo em certas circunstâncias. Se você usar um dispositivo seed, adicionar um novo dispositivo (como raid1) e, em seguida, excluir o seed, obterá um volume duplicado que é essencialmente o mesmo da origem. (Embora o UUID mude.)Conforme apontado na lista de desenvolvedores, "... o volume duplicado é essencialmente o mesmo que a fonte (o processo copia os blocos), o que significa que o perfil do bloco também é preservado."
Como observação sobre meu caso de uso específico, eu poderia ter usado esse método para copiar, instalar meu servidor em um subvolume e, em seguida, apenas copiar
mv
os arquivos. Isso teria economizado uma quantidade substancial de trabalho.