So füllen Sie eine Festplatte unter Linux

24

Ich teste gerade einen Teil des Codes und möchte eine Festplatte mit Daten füllen. Ich habe festgestellt, dass dddas im Handumdrehen riesige Dateien erstellen kann, aber nicht der dfMeinung ist. Folgendes habe ich versucht:

dd if=/dev/zero of=filename bs=1 count=1 seek=$((10*1024*1024*1024))

ls -lhzeigt eine 10G-Datei. df -hZeigt jedoch, dass die Partition nicht verkleinert wurde. Was muss ich also tun, um zu dferkennen, dass die Daten jetzt erfasst wurden? Ich hoffe auf etwas Schnelles, das ich in einem Unit-Test codiere.

User1
quelle
Sie werden mehr Glück haben, wenn Sie bei serverfault.com fragen
Übrigens ist 10 * 1024 * 1024 * 1024 dasselbe wie 10 * 2 ** 30, etwas einfacher.
Dienstag,

Antworten:

26

Das Problem mit dem seek=<big number>Trick ist, dass das Dateisystem (normalerweise) klug ist: Wenn ein Teil einer Datei noch nie geschrieben wurde (und daher nur Nullen enthält), macht es nichts aus, ihm Speicherplatz zuzuweisen. Wie Sie gesehen haben, können Sie eine 10-GB-Datei haben, die keinen Speicherplatz belegt (dies wird als "Sparse-Datei" bezeichnet und kann in einigen Fällen sehr nützlich sein, z. B. bei bestimmten Datenbankimplementierungen).

Sie können die Zuweisung des Speicherplatzes erzwingen (zum Beispiel) mit:

dd if=/dev/zero of=filename bs=$((1024*1024)) count=$((10*1024))

Das dauert viel länger, füllt aber tatsächlich die Festplatte. Ich empfehle, die Blockgröße viel größer als eins zu machen, da dies bestimmt, wie viele Systemaufrufe der ddProzess macht - je kleiner die Blockgröße, desto mehr Systemaufrufe und damit desto langsamer wird er ausgeführt. (Obwohl es über etwa 1 MB hinausgeht, macht es wahrscheinlich keinen großen Unterschied und kann sogar die Dinge verlangsamen ...)

psmears
quelle
Normalerweise verwende ich bs = (unabhängig davon, welche Hälfte der Cache-Größe auf dem Laufwerk liegt, das ich schreibe). Dies hat bisher gut funktioniert, wenn Partitionen für eine spätere Größenänderung auf größeren Festplatten gesichert wurden. ETA: das kritische Wort HALB.
Atroon
20

Als weitere Option können Sie yes zusammen mit einer einzelnen Zeichenfolge verwenden und sie ist ungefähr zehnmal schneller als dd, wenn = / dev / urandom of = largefile ausgeführt wird. So was

yes abcdefghijklmnopqrstuvwxyz0123456789 > largefile
DeltaRay
quelle
Dies ist überraschenderweise ungefähr so ​​schnell wie die Verwendung von dd, wenn = / dev / zero von = filename bs = 1M.
Bhinesley
Die Syntax ist auch leicht zu merken.
AWT
7

Sie haben eine so genannte "Sparse-Datei" erstellt - eine Datei, die, da sie größtenteils leer ist (dh als \ 0 zurückgelesen wird), neben dem tatsächlich Geschriebenen (1B, nach 10 GB) keinen Speicherplatz auf der Festplatte beansprucht der Lücke).

Ich glaube nicht, dass Sie riesige Dateien erstellen können, die im Handumdrehen tatsächlichen Speicherplatz beanspruchen. Wenn Sie physischen Speicherplatz beanspruchen, muss das Dateisystem Ihrer Datei Festplattenblöcke zuweisen.

Ich denke, Sie stecken mit dem altmodischen "dd if = / dev / zero von = filename bs = 100M count = 100" fest, das durch die sequentielle Schreibgeschwindigkeit Ihres Laufwerks begrenzt ist.

qdot
quelle
6

Wenn Sie nur auf Fälle mit gefüllten Dateisystemen testen, ist ein Fallocate möglicherweise ausreichend. Und auch schneller! z.B

Fallocate -l 150G

uchihaangel
quelle
3
Dies muss einen Dateinamen angegeben werden: fallocate -l 150G foo. Trotzdem +1 für das Erwähnen des Tools.
Kamil Maciorowski
3

Beenden Sie die Verwendung seekund verwenden Sie ein sehr großes bsund / oder count. Da es sich um eine spärliche Datei handelt , müssen Sie dies natürlich nicht tun.

Ignacio Vazquez-Abrams
quelle
3

Wenn Sie die Festplatte buchstäblich füllen möchten, gehen Sie folgendermaßen vor:

dd if=/dev/zero of=zeros bs=1M

Sie können optional count angeben, wenn Sie die Größe begrenzen möchten. Wenn Sie die Anzahl jedoch weglassen, wird sie nur so lange ausgeführt, bis Ihnen der Speicherplatz ausgeht.

dd if=/dev/zero of=zeros bs=1M count=10240

Wie von psmears erwähnt, erhalten Sie eine bessere Leistung, wenn Sie die Blockgröße auf 1 MB (bs = 1M) anstelle von 1 B (bs = 1) festlegen. Dies dauert noch eine Weile, aber wenn Sie den Fortschritt Ihres Befehls überprüfen möchten, öffnen Sie eine separate Konsole und führen Sie die folgenden Befehle aus:

ps aux | grep dd

Verwenden Sie die PID von dd in diesem Befehl (ersetzen Sie die PID durch die PID von dd):

kill -USR1 PID

Dann schauen Sie sich Ihr dd-Terminal an. Dies ist natürlich von begrenztem Nutzen, wenn Sie nur versuchen, das Laufwerk zu füllen (Sie können einfach df oder du verwenden, um den freien Speicherplatz bzw. die Dateigröße zu überprüfen). Es gibt jedoch auch andere Situationen, in denen es praktisch ist, dd dazu zu bringen, seinen Fortschritt auszugeben.

Zusätzliches Guthaben: Eine praktische Verwendung für das Nullsetzen des freien Speicherplatzes besteht darin, dass Sie anschließend die "Null" -Dateien löschen und die gesamte Partition (oder den Datenträger, wenn Sie alle Partitionen auf Null gesetzt haben) zu einer Datenträger-Image-Datei machen können (z. B. , disk-backup.dd) und komprimieren Sie die Datei. Der freie Speicherplatz ist jetzt stark komprimierbar, sodass Ihr komprimiertes dd-Image viel kleiner ist als das ursprüngliche Blockgerät, dessen Inhalt es enthält.

Shenanigans: Zippen Sie eine große Nulldatei hoch und senden Sie sie per E-Mail an alle Ihre Freunde. Sagen Sie ihnen, dass es etwas wirklich cooles ist.

rauben
quelle
2

Sie erstellen eine 1-TB-Datei mit geringer Dichte mit dem folgenden Befehl:

dd if=/dev/zero of=bigfile1 bs=10000000000 count=512

Dies war nützlich, um zu testen, was passiert, wenn Kontingente überschritten werden oder ein Dateisystem voll ist.

df -h zeigt den verfügbaren Platz immer kleiner.

user75112
quelle