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

9

Eu tenho um arquivo esparso. ( du -h relata 3G e du -h --apparent-size relata 100G.) Até agora, tudo bem.

Agora, quando eu quiser compactar o arquivo usando tar ou enviá-lo pela rede usando rsync , ele exigirá o mesmo tempo que o 3G. Parece que essas ferramentas leem todos os zeros.

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

Provavelmente não há problema com o meu arquivo?

Este é um recurso ausente em tar e rsync para não procurar por arquivos esparsos? Eu usei o tar parameter --sparse , mas isso não acelerou as coisas. Nem rsync parameter --sparse .

Existe alguma maneira de acelerar essas ferramentas em arquivos esparsos?

    
por adrelanos 17.03.2014 / 19:26

2 respostas

7

bsdtar (pelo menos de libarchive 3.1.2) é capaz de detectar seções esparsas usando FS_IOC_FIEMAP ioctl nos sistemas de arquivos que a suportam (embora também suporte várias outras APIs), no entanto , pelo menos no meu teste, por incrível que pareça, ele não é capaz de manipular os arquivos tar que ele mesmo gera (parece um bug, no entanto).

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

Então

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_FIEMAP ioctl retorna 0 extent e parece que bsdtar não manipula corretamente (outro bug?).

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

    
por 17.03.2014 / 21:50
2

Este artigo tem algumas sugestões úteis para rsync , pelo menos:

Problems

Using rsync --sparse works, but causes a huge a mount of unnecessary disk writes. Changing 10 bytes on 50GB long (1GB used) should cause only one or two blocks to be written, this causes 1GB to be written. This is slow, and possible not good for the disks' longevity.

Using rsync --inplace works, but creates non-sparse files.

You cannot use --sparse and --inplace at the same time :-( this is disallowed by rsync. rsync: --sparse cannot be used with --inplace

Solution

If you use --inplace to update a pre-existing sparse file, the file will remain sparse and only have a small number of blocks written. It's only when rsync --inplace creates a file that it makes it non-sparse.

So the solution is to create a corresponding, correctly-lengthed, empty, sparse file on the target machine for every file on the source machine - if the file isn't yet present on the target machine.

Then rsync --inplace will work as intended, leaving sparse files sparse, and only writing the changed blocks to disk.

Então, se eu leio corretamente, primeiro você quer criar um arquivo esparso vazio no alvo. Você pode fazer isso com

truncate -s 3G filename

Você pode usar rsync --inplace para copiar os arquivos. Isso só deve ser necessário uma vez.

O mesmo artigo sugere o uso de Virtsync , que é

a $49 commercial Linux command-line tool for synchronizing the contents of huge files (such as virtual machine disk images and databases).

Esta pode ser a melhor solução se você estiver disposto a pagar por ela, pois parece estar escrita especificamente para esse tipo de situação.

    
por 17.03.2014 / 19:35