599 Stimmen

Schnelles Erstellen einer großen Datei auf einem Linux-System

Wie kann ich schnell eine große Datei auf einem Linux ( Red Hat Linux ) System?

dd wird die Aufgabe erfüllen, aber das Lesen von /dev/zero und das Schreiben auf das Laufwerk kann sehr lange dauern, wenn Sie eine mehrere hundert GB große Datei für Tests benötigen... Wenn Sie das wiederholt tun müssen, summiert sich die Zeit wirklich.

Der Inhalt der Datei ist mir egal, ich möchte nur, dass sie schnell erstellt wird. Wie lässt sich das bewerkstelligen?

Die Verwendung einer spärlichen Datei ist dafür nicht geeignet. Der Datei muss Speicherplatz zugewiesen werden.

741voto

Franta Punkte 6927

dd aus den anderen Antworten ist eine gute Lösung, aber sie ist für diesen Zweck zu langsam. In Linux (und anderen POSIX-Systemen) haben wir fallocate die den gewünschten Speicherplatz nutzt, ohne darauf schreiben zu müssen, funktioniert mit den meisten modernen plattenbasierten Dateisystemen und ist sehr schnell:

Zum Beispiel:

fallocate -l 10G gentoo_root.img

381voto

Dan McAllister Punkte 3539

Dies ist eine häufig gestellte Frage - insbesondere in der heutigen Zeit der virtuellen Umgebungen. Leider ist die Antwort nicht so einfach, wie man vielleicht annehmen könnte.

dd ist die offensichtliche erste Wahl, aber dd ist im Wesentlichen eine Kopie, und das zwingt Sie, jeden Datenblock zu schreiben (also den Dateiinhalt zu initialisieren)... Und diese Initialisierung ist es, die so viel E/A-Zeit in Anspruch nimmt. (Möchten Sie, dass es noch länger dauert? Verwenden Sie /dev/random 代わりに /dev/zero ! Dann verbrauchen Sie sowohl CPU- als auch I/O-Zeit!) Letztendlich ist dd jedoch eine schlechte Wahl (obwohl es im Wesentlichen der Standard ist, der von den VM "create" GUIs verwendet wird). z.B.:

dd if=/dev/zero of=./gentoo_root.img bs=4k iflag=fullblock,count_bytes count=10G

abschneiden. ist eine weitere Möglichkeit - und wahrscheinlich die schnellste... Das liegt aber daran, dass dabei eine "Sparse-Datei" erstellt wird. Im Wesentlichen ist eine Sparse-Datei ein Abschnitt auf der Festplatte, der viele gleiche Daten enthält, und das zugrundeliegende Dateisystem "betrügt", indem es nicht wirklich alle Daten speichert, sondern nur "vorgibt", dass sie alle da sind. Wenn Sie also truncate verwenden, um ein 20-GB-Laufwerk für Ihre VM zu erstellen, weist das Dateisystem nicht wirklich 20 GB zu, sondern schummelt und sagt, dass dort 20 GB mit Nullen vorhanden sind, obwohl nur eine Spur auf der Platte tatsächlich (wirklich) in Gebrauch sein kann. Z.B.:

 truncate -s 10G gentoo_root.img

fallocate ist die endgültig -- und am besten -- Auswahl für die Verwendung mit der VM-Festplattenzuweisung, da es im Wesentlichen den gesamten gewünschten Speicherplatz "reserviert" (oder "zuweist"), aber nichts schreibt. Wenn Sie also fallocate verwenden, um einen 20 GB großen virtuellen Laufwerksspeicher zu erstellen, erhalten Sie wirklich eine 20 GB große Datei (keine "Sparse-Datei", und Sie haben sich nicht die Mühe gemacht, irgendetwas darauf zu schreiben - was bedeutet, dass praktisch alles darin enthalten sein könnte - wie eine brandneue Festplatte!) Z.B.:

fallocate -l 10G gentoo_root.img

201voto

Christian C. Salvadó Punkte 763569

Linux und alle Dateisysteme

xfs_mkfile 10240m 10Gigfile

Linux & und einige Dateisysteme (ext4, xfs, btrfs und ocfs2)

fallocate -l 10G 10Gigfile

OS X, Solaris, SunOS und wahrscheinlich andere UNIXe

mkfile 10240m 10Gigfile

HP-UX

prealloc 10Gigfile 10737418240

説明

Versuchen Sie mkfile <size> myfile als Alternative zu dd . Mit dem -n wird die Größe notiert, aber die Blöcke werden erst dann zugewiesen, wenn Daten in sie geschrieben werden. Ohne die Option -n wird der Speicherplatz mit Null aufgefüllt, was bedeutet, dass auf die Festplatte geschrieben wird, was Zeit kostet.

mkfile stammt von SunOS und ist nicht überall verfügbar. Die meisten Linux-Systeme haben xfs_mkfile das genau so funktioniert, und trotz des Namens nicht nur auf XFS-Dateisystemen. Es ist enthalten in xfsprogs (für Debian/Ubuntu) oder ähnlich benannte Pakete.

Die meisten Linux-Systeme haben auch fallocate Dies funktioniert nur bei bestimmten Dateisystemen (z. B. btrfs, ext4, ocfs2 und xfs), ist aber am schnellsten, da es den gesamten Dateispeicherplatz alloziert (d. h. Nicht-Holey-Dateien erstellt), aber nichts davon initialisiert.

119voto

kiv Punkte 1507
truncate -s 10M output.file

wird sofort eine 10-M-Datei erstellt (M steht für 1024 1024 Bytes, MB steht für 1000 1000 - dasselbe mit K, KB, G, GB...)

EDIT。 Wie bereits erwähnt, wird die Datei dadurch nicht physisch auf Ihrem Gerät zugewiesen. Auf diese Weise können Sie tatsächlich eine beliebig große Datei erstellen, unabhängig vom verfügbaren Speicherplatz auf dem Gerät, da es eine "sparse" Datei erstellt.

Beachten Sie z.B., dass mit diesem Befehl kein Festplattenplatz verbraucht wird:

### BEFORE
$ df -h | grep lvm
/dev/mapper/lvm--raid0-lvm0
                      7.2T  6.6T  232G  97% /export/lvm-raid0

$ truncate -s 500M 500MB.file

### AFTER
$ df -h | grep lvm
/dev/mapper/lvm--raid0-lvm0
                      7.2T  6.6T  232G  97% /export/lvm-raid0

Wenn Sie dies tun, verschieben Sie also die physische Zuweisung, bis auf die Datei zugegriffen wird. Wenn Sie diese Datei dem Arbeitsspeicher zuordnen, erzielen Sie möglicherweise nicht die erwartete Leistung.

Aber es ist trotzdem nützlich, diesen Befehl zu kennen. So wird z.B. beim Benchmarking von Übertragungen mit Dateien immer noch die angegebene Größe der Datei verschoben.

$ rsync -aHAxvP --numeric-ids --delete --info=progress2 \
       root@mulder.bub.lan:/export/lvm-raid0/500MB.file \
       /export/raid1/
receiving incremental file list
500MB.file
    524,288,000 100%   41.40MB/s    0:00:12 (xfr#1, to-chk=0/1)

sent 30 bytes  received 524,352,082 bytes  38,840,897.19 bytes/sec
total size is 524,288,000  speedup is 1.00

47voto

Zoredache Punkte 34350

Dabei ist seek die Größe der gewünschten Datei in Bytes - 1.

dd if=/dev/zero of=filename bs=1 count=1 seek=1048575

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X