Come posso velocizzare le operazioni su file sparsi con tar, gzip, rsync?


9

Ho un file sparso. ( du -hriporta 3G e du -h --apparent-sizeriporta 100G.) Finora tutto bene.

Ora, quando voglio comprimere il file usando taro inviarlo tramite la rete rsync, richiederà tanto tempo quanto il 3G. Sembra che questi strumenti leggano tutti gli zeri.

Pensavo che i fori fossero in qualche modo segnati e questi strumenti potessero in qualche modo saltarli?

Probabilmente non c'è nessun problema con il mio file?

È una caratteristica mancante in tare rsyncnon cercare file sparsi? Ho usato il tarparametro --sparse, ma questo non ha accelerato le cose. Nemmeno il rsyncparametro --sparse.

C'è un modo per accelerare questi strumenti su file sparsi?

Risposte:


7

bsdtar(almeno dalla libarchive3.1.2) è in grado di rilevare sezioni sparse usando lo FS_IOC_FIEMAPioctl sui file system che lo supportano (sebbene supporti anche un numero di altre API), tuttavia, almeno nel mio test, stranamente, è non in grado di gestire i tarfile che si genera da solo (sembra comunque un bug).

Comunque usare GNU tarper estrarli funziona, ma poi GNU tar non può gestire alcuni degli attributi estesi supportati da bsdtar.

Così

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

funziona fintanto che i file non hanno attributi o flag estesi.

Non funziona ancora per file completamente sparsi (solo zeri) poiché lo FS_IOC_FIEMAPioctl restituisce quindi l'estensione 0 e sembra che bsdtarnon lo gestisca correttamente (un altro bug?).

star( Schily tar ) è un'altra implementazione di tar open source in grado di rilevare file sparsi (usare l' -sparseopzione) e non ha questi bug di bsdtar(ma non è impacchettato da molti sistemi).


2

Questo articolo contiene alcuni suggerimenti utili per rsyncalmeno:

I problemi

Utilizzando rsync --sparse works, ma provoca un enorme montaggio di scritture su disco non necessarie. La modifica di 10 byte su 50 GB di lunghezza (1 GB utilizzato) dovrebbe comportare la scrittura di solo uno o due blocchi, causando la scrittura di 1 GB. Questo è lento e forse non va bene per la longevità dei dischi.

Utilizzando rsync --inplacefunziona, ma crea file non sparsi.

Non puoi usare --sparse e --inplace allo stesso tempo :-( questo non è consentito da rsync. Rsync: --sparse non può essere usato con --inplace

Soluzione

Se usi --inplace per aggiornare un file sparse preesistente, il file rimarrà sparse e avrà solo un piccolo numero di blocchi scritti. È solo quando rsync --inplace crea un file che lo rende non sparso.

Quindi la soluzione è quella di creare un file corrispondente, vuoto, di lunghezza corretta, vuoto sul computer di destinazione per ogni file sul computer di origine, se il file non è ancora presente sul computer di destinazione.

Quindi rsync --inplace funzionerà come previsto, lasciando sparsi i file sparsi e scrivendo solo i blocchi modificati su disco.

Quindi, se l'ho letto correttamente, vuoi prima creare un file sparse vuoto sulla destinazione. Puoi farlo con

truncate -s 3G filename

È quindi possibile utilizzare rsync --inplaceper copiare i file sopra. Questo dovrebbe essere necessario solo una volta.


Lo stesso articolo suggerisce usando Virtsync che è

uno strumento da riga di comando Linux commerciale da $ 49 per sincronizzare il contenuto di file di grandi dimensioni (come immagini e database di dischi di macchine virtuali).

Questa potrebbe essere la soluzione migliore se sei disposto a pagare per questo dato che sembra essere stato scritto appositamente per questo tipo di situazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.