Copiando entre o BTRFS comprimido por lzo: de / re-comprimir?

1

Estou copiando um grande número de arquivos entre dois sistemas de arquivos BTRFS compactados por lzo em diferentes unidades montadas na mesma máquina. Parece que os arquivos estão sendo de / re-compactados. Existe uma maneira de evitar isso?

    
por Diagon 08.01.2016 / 21:38

2 respostas

0

Como @ sysadmin1138 tão bem ilustrado, esse problema é inevitável se você usar cp / rsync / send - receive entre sistemas de arquivos; mas há uma maneira de evitá-lo sob certas circunstâncias. Se você usar um dispositivo de propagação, adicionar um novo dispositivo (como raid1) e excluir a semente, você obterá um volume duplicado que é essencialmente o mesmo que a origem. (Embora o UUID mude.)

Como apontado na lista de desenvolvimento, "... o volume duplicado é essencialmente o mesmo que o de origem (o processo copia partes), o que significa que o perfil do fragmento também é preservado."

Como uma observação a respeito do meu caso de uso específico, eu poderia ter usado esse método para copiar, feito a instalação do meu servidor em um subvolume e, em seguida, apenas mv dos arquivos. Isso teria economizado uma quantidade substancial de trabalho.

    
por 17.01.2016 / 23:20
3

Não realmente, e se resume a syscalls. Tem um exemplo:

open  ("tuppence", O_RDONLY)                           = 3
fstat (3, {st_mode=S_IFREG|0644, st_size=15, ...})     = 0
open  ("/tmp/tuppence", O_WRONLY|O_CREAT|O_EXCL, 0644) = 4
fstat (4, {st_mode=S_IFREG|0644, st_size=0, ...})      = 0
read  (3, "I have cheese.\n", 32768)                   = 15
write (4, "I have cheese.\n", 15)                      = 15

(Isto é strace data, limpo um pouco para maior clareza, feito ao copiar um arquivo.)

Para copiar um arquivo do ponto A para o ponto B, especialmente nos pontos de montagem, o Linux chamará read no arquivo a ser copiado e, em seguida, chamará write no novo arquivo. Você pode vê-lo no traço acima.

  1. Abra o arquivo de origem, gerando o descritor de arquivo número 3.
  2. Abra o arquivo de destino, gerando o descritor de arquivo número 4.
  3. Leia do descritor 3, o arquivo de origem.
  4. Escreva os dados lidos de 3, no descritor 4, o arquivo de destino.
  5. Feche tudo.

O read syscall solicita o arquivo para uso por um processo, que dispara a descompactação do BTRFS. Esses dados recuperados são então alimentados na chamada write , que acionará a compactação BTRFS no destino. Esse comportamento é fundamental para o funcionamento das camadas do sistema de arquivos Linux.

Para ignorar isso, não use cp . Você teria que usar uma ferramenta específica do btrfs que manipule as estruturas de dados em movimento inteiramente dentro do volume btrfs. O problema é que não sei se essas ferramentas existem.

    
por 08.01.2016 / 22:46