GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Kopieren einer 1 TB Sparse-Datei

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

  1. Beim Extrahieren tar erkennt automatisch ein mit -S erstelltes Archiv Sie müssen es also nicht angeben.
  2. Ein mit pbzip2 erstelltes Archiv wird in Blöcken gespeichert. Dadurch wird das Archiv geringfügig größer als bei bzip2 verwendet wird, bedeutet aber auch, dass die Extraktion im Gegensatz zu einem mit bzip2 erstellten Archiv multithreaded sein kann .
  3. pbzip2 und bzip2 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

Linux
  1. Wie wandelt man eine Tar-Datei in eine Tgz-Datei um?

  2. So komprimieren/dekomprimieren Sie unter Linux

  3. So extrahieren oder entpacken Sie die tar.xz-Datei unter Linux

  4. Was sind Sparse-Dateien in Linux?

  5. Wie macht man eine Datei spärlich?

So extrahieren (entpacken) Sie die Tar Gz-Datei

So extrahieren (entpacken) Sie die Tar Bz2-Datei

So extrahieren (entpacken) Sie die tar.xz-Datei

So erstellen Sie eine Tar-Gz-Datei

So erstellen Sie eine Tar gz-Datei

Extrahieren Sie die tar.gz-Datei unter Linux