Mi rendo conto che questa domanda è molto vecchia, ma ecco un aggiornamento che potrebbe essere utile ad altri che trovano la loro strada qui nello stesso modo in cui l'ho fatto io.
Per fortuna, l'eccellente risposta di mvp è ora obsoleta. Secondo le note di rilascio di GNU tar, SEEK_HOLE/SEEK_DATA è stato aggiunto nella versione 1.29, rilasciata il 16-05-2016. (E con GNU tar v. 1.30 ora standard in Debian stable, è lecito ritenere che la versione tar ≥ 1.29 sia disponibile quasi ovunque.)
Quindi il modo per gestire i file sparsi ora è archiviarli con qualsiasi tar (GNU o BSD) sia installato sul tuo sistema, e lo stesso vale per l'estrazione.
Inoltre, per i file sparsi che contengono effettivamente alcuni dati, se vale la pena utilizzare la compressione (ovvero i dati sono sufficientemente comprimibili da risparmiare spazio su disco sostanziale e i risparmi di spazio su disco valgono il tempo probabilmente sostanziale e le risorse della CPU necessarie per comprimerlo) :
tar -cSjf <archive>.tar.bz2 /path/to/sparse/file
entrambi trarranno vantaggio dalla funzionalità SEEK_HOLE di tar per archiviare in modo rapido ed efficiente il file sparse e utilizzeranno bzip2 per comprimere i dati effettivi.tar --use-compress-program=pbzip2 -cSf <archive>.tar.bz2 /path/to/sparse/file
, come accennato nel commento di marcin, farà lo stesso mentre anche utilizzando più core per l'attività di compressione.
Sul mio piccolo server domestico con una CPU Atom quad-core, usando pbzip2
rispetto a bzip2
ridotto il tempo di circa il 25 o 30%.
Con o senza compressione, questo ti darà un archivio che non richiede alcuna gestione speciale di file sparse, occupa approssimativamente la dimensione "reale" del file sparse originale (o meno se compresso) e può essere spostato senza preoccupazioni sull'incoerenza tra le capacità di file sparse di diverse utilità. Ad esempio:cp
rileverà automaticamente i file sparsi e farà la cosa giusta, rsync
gestirà correttamente i file sparsi se usi il -S
flag e scp
non ha alcuna opzione per i file sparsi (consumerà larghezza di banda copiando zeri per tutti i buchi e la copia risultante sarà un file non sparsi la cui dimensione è la dimensione "apparente" dell'originale); ma ovviamente tutti gestiranno bene un archivio tar, che contenga file sparsi o meno, senza alcun flag speciale.
Note aggiuntive
- Durante l'estrazione,
tar
rileverà automaticamente un archivio creato con-S
quindi non è necessario specificarlo. - Un archivio creato con
pbzip2
viene memorizzato in blocchi. Ciò comporta che l'archivio sia leggermente più grande di ifbzip2
viene utilizzato, ma significa anche che l'estrazione può essere multithread, a differenza di un archivio creato conbzip2
. pbzip2
ebzip2
estrarranno in modo affidabile gli archivi reciproci senza errori o danneggiamenti.
Risposta breve: Usa bsdtar
o GNU tar
(versione 1.29 o successiva) per creare archivi e GNU tar
(versione 1.26 o successiva) per estrarli su un'altra scatola.
Risposta lunga: Ci sono alcuni requisiti affinché funzioni.
Innanzitutto, Linux deve essere almeno kernel 3.1 (Ubuntu 12.04 o successivo andrebbe bene), quindi supporta SEEK_HOLE
funzionalità.
Quindi, è necessaria l'utilità tar in grado di supportare questa chiamata di sistema. GNU tar
lo supporta dalla versione 1.29 (rilasciata il 16/05/2016, dovrebbe essere presente di default da Ubuntu 18.04), o bsdtar
dalla versione 3.0.4 (disponibile da Ubuntu 12.04) - installalo usando sudo apt-get install bsdtar
.
Mentre bsdtar
(che utilizza libarchive
) è fantastico, sfortunatamente, non è molto intelligente quando si tratta di untarring:richiede stupidamente di avere almeno tanto spazio libero sull'unità di destinazione quanto la dimensione del file non tarato, indipendentemente dai buchi. GNU tar
eseguirà l'untar di tali archivi sparsi in modo efficiente e non verificherà questa condizione.
Questo è il registro di Ubuntu 12.10 (Linux kernel 3.5):
$ dd if=/dev/zero of=1tb seek=1T bs=1 count=1
1+0 records in
1+0 records out
1 byte (1 B) copied, 0.000143113 s, 7.0 kB/s
$ time bsdtar cvfz sparse.tar.gz 1tb
a 1tb
real 0m0.362s
user 0m0.336s
sys 0m0.020s
# Or, use gnu tar if version is later than 1.29:
$ time tar cSvfz sparse-gnutar.tar.gz 1tb
1tb
real 0m0.005s
user 0m0.006s
sys 0m0.000s
$ ls -l
-rw-rw-r-- 1 autouser autouser 1099511627777 Nov 7 01:43 1tb
-rw-rw-r-- 1 autouser autouser 257 Nov 7 01:43 sparse.tar.gz
-rw-rw-r-- 1 autouser autouser 134 Nov 7 01:43 sparse-gnutar.tar.gz
$
Come ho detto sopra, sfortunatamente, decomprimere con bsdtar
non funzionerà a meno che tu non abbia 1 TB di spazio libero. Tuttavia, qualsiasi versione di GNU tar
funziona perfettamente per decomprimere tale sparse.tar
:
$ rm 1tb
$ time tar -xvSf sparse.tar.gz
1tb
real 0m0.031s
user 0m0.016s
sys 0m0.016s
$ ls -l
total 8
-rw-rw-r-- 1 autouser autouser 1099511627777 Nov 7 01:43 1tb
-rw-rw-r-- 1 autouser autouser 257 Nov 7 01:43 sparse.tar.gz