Mir ist klar, dass diese Frage sehr alt ist, aber hier ist ein Update, das für andere hilfreich sein kann, die sich hier genauso zurechtfinden wie ich.
Zum Glück ist die ausgezeichnete Antwort von mvp jetzt veraltet. Laut den GNU-Tar-Versionshinweisen wurde SEEK_HOLE/SEEK_DATA in v. 1.29 hinzugefügt, veröffentlicht am 16.05.2016. (Und da GNU tar v. 1.30 jetzt Standard in Debian Stable ist, kann man davon ausgehen, dass die tar-Version ≥ 1.29 fast überall verfügbar ist.)
Der Weg, mit spärlichen Dateien umzugehen, besteht jetzt darin, sie mit dem auf Ihrem System installierten tar (GNU oder BSD) zu archivieren, und dasselbe zum Extrahieren.
Darüber hinaus gilt für Dateien mit geringer Dichte, die tatsächlich einige Daten enthalten, wenn es sich lohnt, eine Komprimierung zu verwenden (d. h. die Daten sind komprimierbar genug, um erheblichen Speicherplatz zu sparen, und die Einsparungen an Speicherplatz sind die wahrscheinlich erhebliche Zeit und CPU-Ressourcen wert, die zum Komprimieren erforderlich sind). :
tar -cSjf <archive>.tar.bz2 /path/to/sparse/file
werden sowohl die SEEK_HOLE-Funktionalität von tar nutzen, um die Sparse-Datei schnell und effizient zu archivieren, als auch bzip2 verwenden, um die eigentlichen Daten zu komprimieren.tar --use-compress-program=pbzip2 -cSf <archive>.tar.bz2 /path/to/sparse/file
, wie in Marcins Kommentar angedeutet, wird dasselbe tun, während auch Verwenden mehrerer Kerne für die Komprimierungsaufgabe.
Auf meinem kleinen Heimserver mit einer Quad-Core-Atom-CPU mit pbzip2
gegenüber bzip2
die Zeit um etwa 25 oder 30 % reduziert.
Mit oder ohne Komprimierung erhalten Sie ein Archiv, das keine spezielle Handhabung von Sparse-Dateien erfordert, ungefähr die "echte" Größe der ursprünglichen Sparse-Datei einnimmt (oder weniger, wenn komprimiert) und ohne Bedenken verschoben werden kann über die Inkonsistenz zwischen den Sparse-File-Fähigkeiten verschiedener Dienstprogramme. Beispiel:cp
wird automatisch spärliche Dateien erkennen und das Richtige tun, rsync
wird mit Sparse-Dateien richtig umgehen, wenn Sie -S
verwenden Flag und scp
hat keine Option für Sparse-Dateien (es wird Bandbreite verbrauchen, um Nullen für alle Löcher zu kopieren, und die resultierende Kopie wird eine Datei ohne Sparse sein, deren Größe die 'scheinbare' Größe des Originals ist); aber alle von ihnen werden natürlich problemlos mit einem tar-Archiv umgehen – ob es Sparse-Dateien enthält oder nicht – ohne spezielle Flags.
Zusätzliche Hinweise
- Beim Extrahieren
tar
erkennt automatisch ein mit-S
erstelltes Archiv Sie müssen es also nicht angeben. - Ein mit
pbzip2
erstelltes Archiv wird in Blöcken gespeichert. Dadurch wird das Archiv geringfügig größer als beibzip2
verwendet wird, bedeutet aber auch, dass die Extraktion im Gegensatz zu einem mitbzip2
erstellten Archiv multithreaded sein kann . pbzip2
undbzip2
werden die Archive des anderen zuverlässig ohne Fehler oder Beschädigung extrahieren.
Kurze Antwort: Verwenden Sie bsdtar
oder GNU tar
(Version 1.29 oder höher) zum Erstellen von Archiven und GNU tar
(Version 1.26 oder höher), um sie auf einer anderen Box zu extrahieren.
Lange Antwort: Damit dies funktioniert, müssen einige Voraussetzungen erfüllt sein.
Erstens muss Linux mindestens Kernel 3.1 sein (Ubuntu 12.04 oder höher würde ausreichen), damit es SEEK_HOLE
unterstützt Funktionalität.
Dann benötigen Sie das tar-Dienstprogramm, das diesen Systemaufruf unterstützen kann. GNU tar
unterstützt es seit Version 1.29 (veröffentlicht am 16.05.2016, sollte standardmäßig seit Ubuntu 18.04 vorhanden sein) oder bsdtar
ab Version 3.0.4 (verfügbar seit Ubuntu 12.04) - installieren Sie es mit sudo apt-get install bsdtar
.
Während bsdtar
(der libarchive
verwendet ) ist großartig, leider ist es nicht sehr schlau, wenn es um das Entpacken geht - es erfordert dummerweise mindestens so viel freien Speicherplatz auf dem Ziellaufwerk wie die Größe der ungetarnten Datei, ohne Rücksicht auf Löcher. GNU tar
entpackt solche spärlichen Archive effizient und überprüft diese Bedingung nicht.
Dies ist ein Protokoll von 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
$
Wie oben schon gesagt leider mit bsdtar
enttarnen funktioniert nicht, es sei denn, Sie haben 1 TB freien Speicherplatz. Jedoch jede Version von GNU tar
funktioniert gut, um solche sparse.tar
zu entpacken :
$ 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