Como acelerar as operações em arquivos esparsos com tar, gzip, rsync?

9

Eu tenho um arquivo esparso. ( du -hrelatórios 3G e du -h --apparent-sizerelatórios 100G.) Até agora, tudo bem.

Agora, quando eu quiser compactar o arquivo usando-o tarou enviá-lo pela rede rsync, será necessário tanto tempo quanto 3G. Parece que essas ferramentas leem todos os zeros.

Eu pensei que os buracos estão de alguma forma marcados e essas ferramentas poderiam de alguma forma simplesmente ignorá-los?

Provavelmente não há problemas com meu arquivo?

Esse é um recurso que falta tare rsyncnão procura arquivos esparsos? Eu usei o tarparâmetro --sparse, mas isso não acelerou as coisas. O rsyncparâmetro também não --sparse.

Existe alguma maneira de acelerar essas ferramentas em arquivos esparsos?

adrelanos
fonte

Respostas:

7

bsdtar(pelo menos a partir do libarchive3.1.2) é capaz de detectar seções esparsas usando o FS_IOC_FIEMAPioctl nos sistemas de arquivos que o suportam (embora ele também suporte várias outras APIs); no entanto, pelo menos no meu teste, por incrível que pareça, é incapaz de lidar com os tararquivos que ele próprio gera (parece um bug).

No entanto, usar o GNU tarpara extraí-los funciona, mas o GNU tar não pode lidar com alguns dos atributos estendidos que o bsdtar suporta.

assim

bsdtar cf - sparse-files | (cd elsewhere && tar xpf -)

funciona desde que os arquivos não tenham atributos ou sinalizadores estendidos.

Ele ainda não funciona para arquivos totalmente esparsos (apenas zeros), pois o FS_IOC_FIEMAPioctl retorna a extensão 0 e parece bsdtarque não lida com isso adequadamente (outro bug?).

star( Schily tar ) é outra implementação tar de código aberto que pode detectar arquivos esparsos (use a -sparseopção) e não possui esses bugs bsdtar(mas não é empacotado por muitos sistemas).

Stéphane Chazelas
fonte
2

Este artigo tem algumas sugestões úteis para rsyncpelo menos:

Problemas

Usar rsync --sparse works, mas causa uma enorme quantidade de gravações desnecessárias em disco. A alteração de 10 bytes em 50 GB de comprimento (1 GB usado) deve fazer com que apenas um ou dois blocos sejam gravados; isso faz com que 1 GB seja gravado. Isso é lento e possivelmente não é bom para a longevidade dos discos.

Usando rsync --inplaceobras, mas cria arquivos não esparsos.

Você não pode usar --sparse e --inplace ao mesmo tempo :-( isso não é permitido pelo rsync. Rsync: --sparse não pode ser usado com --inplace

Solução

Se você usar --inplace para atualizar um arquivo esparso preexistente, o arquivo permanecerá esparso e terá apenas um pequeno número de blocos gravados. É somente quando o rsync --inplace cria um arquivo que o torna não esparso.

Portanto, a solução é criar um arquivo esparso vazio, vazio e correspondente na máquina de destino para cada arquivo na máquina de origem - se o arquivo ainda não estiver presente na máquina de destino.

Então o rsync --inplace funcionará como planejado, deixando os arquivos esparsos escassos e gravando apenas os blocos alterados no disco.

Portanto, se eu li isso corretamente, primeiro você deseja criar um arquivo esparso vazio no destino. Você pode fazer isso com

truncate -s 3G filename

Você pode usar rsync --inplacepara copiar os arquivos. Isso deve ser necessário apenas uma vez.


O mesmo artigo sugere o uso do Virtsync, que é

uma ferramenta de linha de comando comercial do Linux de US $ 49 para sincronizar o conteúdo de grandes arquivos (como imagens de disco e bancos de dados de máquinas virtuais).

Essa pode ser a melhor solução se você estiver disposto a pagar por isso, pois parece que foi escrito especificamente para esse tipo de situação.

terdon
fonte