Wenn ich tar -cvf
ein Verzeichnis mit einer Größe von 937 MB verwende, um eine einfach herunterladbare Kopie einer tief verschachtelten Ordnerstruktur zu erstellen, riskiere ich, den Datenträger mit der folgenden df -h
Ausgabe zu füllen :
/dev/xvda1 7.9G 3.6G 4.3G 46% /
tmpfs 298M 0 298M 0% /dev/shm
Verwandte Fragen:
- Wenn die Festplatte voll sein könnte, warum wird Linux (Amazon AMI) und / oder
tar
was unter der Haube tun? - Wie kann ich diese Informationen selbst genau bestimmen, ohne erneut zu fragen?
tar
disk-usage
Codecowboy
quelle
quelle
--totals
Option herumspielen. In beiden Fällen können Sie das Archiv einfach löschen, wenn Sie die Festplatte voll haben. Um alle verfügbaren Optionen zu überprüfen, können Sie durchgehentar --help
.Antworten:
tar -c data_dir | wc -c
ohne Kompressionoder
tar -cz data_dir | wc -c
mit Gzip-Komprimierungoder
tar -cj data_dir | wc -c
mit bzip2 KomprimierungGibt die Größe des zu erstellenden Archivs in Byte aus, ohne auf die Festplatte zu schreiben. Sie können dies dann mit der Menge an freiem Speicherplatz auf Ihrem Zielgerät vergleichen.
Mit dem folgenden Befehl können Sie die Größe des Datenverzeichnisses selbst überprüfen, falls eine falsche Annahme über seine Größe gemacht wurde:
du -h --max-depth=1 data_dir
Wie bereits beantwortet, fügt tar jedem Datensatz im Archiv einen Header hinzu und rundet die Größe jedes Datensatzes auf ein Vielfaches von 512 Bytes auf (Standardeinstellung). Das Ende eines Archivs ist durch mindestens zwei aufeinanderfolgende, mit Nullen gefüllte Datensätze gekennzeichnet. Es ist also immer der Fall, dass Sie eine unkomprimierte TAR-Datei haben, die größer ist als die Dateien selbst. Die Anzahl der Dateien und die Ausrichtung an 512-Byte-Grenzen bestimmen den zusätzlichen verwendeten Speicherplatz.
Natürlich verwenden Dateisysteme selbst Blockgrößen, die möglicherweise größer als der Inhalt einer einzelnen Datei sind. Seien Sie also vorsichtig, wenn Sie diese entpacken. Das Dateisystem kann möglicherweise nicht viele kleine Dateien aufnehmen, obwohl der freie Speicherplatz größer als die Teergröße ist!
https://en.wikipedia.org/wiki/Tar_(computing)#Format_details
quelle
-f -
für tar ist überflüssig, da Sie das-f
Argument einfach ganz weglassen können, um das Ergebnis in stdout (ietar -c data_dir
) zu schreiben .Die Größe Ihrer TAR-Datei beträgt 937 MB plus der Größe der für jede Datei oder jedes Verzeichnis erforderlichen Metadaten (512 Byte pro Objekt). Außerdem wird eine Auffüllung hinzugefügt, um Dateien an einer 512-Byte-Grenze auszurichten.
Eine sehr grobe Berechnung zeigt uns, dass eine weitere Kopie Ihrer Daten 3,4 GB frei lässt. In 3,4 GB haben wir Platz für etwa 7 Millionen Metadatensätze, vorausgesetzt, dass keine Auffüllung erfolgt, oder weniger, wenn Sie von einer durchschnittlichen Auffüllung von 256 Byte pro Datei ausgehen. Wenn Sie also Millionen von Dateien und Verzeichnissen zu tar haben, können Probleme auftreten.
Sie könnten das Problem abmildern, indem Sie
z
oderj
bistar
tar
als normaler Benutzer aus, damit der reservierte Speicherplatz auf der/
Partition nicht berührt wird, wenn Ihnen der Speicherplatz ausgeht.quelle
tar
selbst kann über die Größe seiner Archive berichten mit der--test
Option:Der obige Befehl schreibt nichts auf die Festplatte und hat den zusätzlichen Vorteil, dass die einzelnen Dateigrößen jeder im Tarball enthaltenen Datei aufgelistet werden. Das Hinzufügen der verschiedenen
z/j/xz
Operanden zu beiden Seiten des|pipe
Befehls behandelt die Komprimierung wie gewünscht.AUSGABE:
Sie sind sich Ihres Zwecks nicht ganz sicher, aber wenn es darum geht, den Tarball herunterzuladen, ist dies möglicherweise der springende Punkt:
Oder einfach kopieren mit
tar
:quelle
tar
Anschließend wird der Baum in einem Stream auf Ihre lokale Festplatte kopiert, ohne dass etwas auf der Remote-Festplatte gespeichert wird. Anschließend können Sie ihn vom Remote-Host löschen und später wiederherstellen. Sie sollten wahrscheinlich-z
für die Komprimierung hinzufügen, wie Goldlöckchen darauf hinweist, um Bandbreite bei der Übertragung zu sparen.-i
richtig, sorry!Ich habe viel darüber recherchiert. Sie können die Datei mit einer Wortzahl testen, aber es wird Ihnen nicht die gleiche Nummer wie a angezeigt
du -sb adir
.du
zählt jedes Verzeichnis als 4096 Bytes undtar
Verzeichnisse als 0 Bytes. Sie müssen jedem Verzeichnis 4096 hinzufügen:dann müssen Sie alle Zeichen hinzufügen. Für etwas, das so aussieht:
Ich bin mir nicht sicher, ob dies perfekt ist, da ich keine Dateien ausprobiert habe, die berührt wurden (Dateien mit 0 Bytes) oder Dateien mit 1 Zeichen. Das sollte dich näher bringen.
quelle
-cvf
Beinhaltet keine Komprimierung. Wenn Sie dies in einem ~ 1 GB-Ordner tun, erhalten Sie eine ~ 1 GB-TAR-Datei (die Antwort von Flub enthält weitere Informationen zur zusätzlichen Größe in der TAR-Datei. Beachten Sie jedoch, dass dies nur bei 10.000 Dateien der Fall ist 5 MB). Da Sie mehr als 4 GB frei haben, werden Sie die Partition nicht füllen.Die meisten Leute würden das Herunterladen als "einfacher" und als "kleiner" bezeichnen, daher sollten Sie hier eine gewisse Komprimierung verwenden.
bzip2
Sollte nun ein Tag auf jedem System mit Teer verfügbar sein, denke ich,j
ist es wahrscheinlich die beste Wahl , dies in Ihre Switches aufzunehmen.z
(gzip
) ist vielleicht noch häufiger und es gibt andere (weniger allgegenwärtige) Möglichkeiten mit mehr Kürbis.Wenn Sie meinen, für die
tar
Ausführung der Aufgabe wird vorübergehend zusätzlicher Speicherplatz benötigt. Ich bin mir ziemlich sicher, dass dies aus mehreren Gründen nicht der Fall ist. Einer stammt aus einer Zeit, als Bandlaufwerke eine Form des Primärspeichers waren und der andere Es mussten sich Jahrzehnte entwickeln (und ich bin sicher, dass es nicht notwendig ist, temporären Zwischenraum zu verwenden, auch wenn es um Komprimierung geht).quelle
Wenn Geschwindigkeit wichtig ist und keine Komprimierung erforderlich ist, können Sie die verwendeten Syscall-Wrapper
tar
mitLD_PRELOAD
, änderntar
, um sie für uns zu berechnen. Durch einige dieser Funktionen neu implementieren unsere Bedürfnisse anzupassen (die Größe der möglichen Ausgangs tar Daten Berechnung), sind wir viel beseitigen könnenread
undwrite
dass im Normalbetrieb von ausgeführttar
. Dies macht estar
viel schneller, da der Kontext nicht annähernd so schnell in den Kernel gewechselt werden muss undstat
statt der eigentlichen Dateidaten nur die angeforderten Eingabedateien / -ordner von der Festplatte gelesen werden müssen.Der folgende Code enthält Implementierungen der
close
,read
undwrite
POSIX - Funktionen. Das MakroOUT_FD
steuert, welcher Dateideskriptortar
als Ausgabedatei verwendet werden soll. Derzeit ist es auf stdout eingestellt.read
wurde so geändert, dass nur der Erfolgswert voncount
Bytes zurückgegeben wird, anstatt buf mit den Daten zu füllen, da die tatsächlichen Daten nicht gelesen wurden. buf würde keine gültigen Daten für die Weitergabe an die Komprimierung enthalten. Wenn also die Komprimierung verwendet würde, würden wir einen falschen Wert berechnen Größe.write
wurde geändert, um die Eingabebytescount
in die globale Variable zu summierentotal
und den Erfolgswert voncount
Bytes nur dann zurückzugeben, wenn der Dateideskriptor übereinstimmtOUT_FD
. Andernfalls wird der ursprüngliche Wrapperdlsym
aufgerufen, der über erworben wurde , um den gleichnamigen Syscall auszuführen.close
Die ursprüngliche Funktionalität bleibt erhalten, aber wenn der Dateideskriptor mit OUT_FD übereinstimmt,tar
wird versucht, eine tar-Datei zu schreiben. Dietotal
Zahl ist also endgültig und wird auf stdout gedruckt.Benchmark-Vergleich einer Lösung, bei der der Lesezugriff auf die Festplatte und alle Systemaufrufe des normalen Tar-Vorgangs mit der
LD_PRELOAD
Lösung durchgeführt werden.Der obige Code, ein grundlegendes Erstellungsskript, um das Obige als gemeinsam genutzte Bibliothek zu erstellen, und ein Skript mit der "
LD_PRELOAD
Technik", die es verwendet, sind im Repository enthalten: https://github.com/G4Vi/tarsizeEinige Informationen zur Verwendung von LD_PRELOAD: https://rafalcieslak.wordpress.com/2013/04/02/dynamic-linker-tricks-using-ld_preload-to-cheat-inject-features-and-investigate-programs/
quelle