GNU/Linux >> Linux Esercitazione >  >> Linux

Copia di un file sparse da 1 TB

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

  1. Durante l'estrazione, tar rileverà automaticamente un archivio creato con -S quindi non è necessario specificarlo.
  2. Un archivio creato con pbzip2 viene memorizzato in blocchi. Ciò comporta che l'archivio sia leggermente più grande di if bzip2 viene utilizzato, ma significa anche che l'estrazione può essere multithread, a differenza di un archivio creato con bzip2 .
  3. pbzip2 e bzip2 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

Linux
  1. Cosa sono i file sparsi in Linux

  2. Aggiornamento di un singolo file in un tar compresso

  3. Come estrarre il file nomefile.tar.gz

  4. tar -C con un modello di file con caratteri jolly

  5. Come posso convertire tar.bz2 in tar.gz?

Come estrarre (decomprimere) il file Tar Gz

Come estrarre (decomprimere) il file Tar Bz2

Come estrarre (decomprimere) il file tar.xz

Come creare file Tar Gz

Come creare un file Tar gz

Estrai il file tar.gz in Linux