Wie kann ich schnell eine große Datei auf einem Linux- System ( Red Hat Linux ) erstellen ?
dd/dev/zero
erledigt den Job, aber das Lesen von und Schreiben auf das Laufwerk kann lange dauern, wenn Sie eine Datei mit einer Größe von mehreren hundert GB zum Testen benötigen ... Wenn Sie dies 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 kann das gemacht werden?
Die Verwendung einer Sparse-Datei funktioniert hierfür nicht. Ich muss der Datei Speicherplatz zugewiesen bekommen.
linux
file
filesystems
DrStalker
quelle
quelle
df
gemeldet wird? Testen einer App, die etwas Besonderes tut. Die Antwort hängt davon ab, was Sie testen möchten. Wie auch immer, ich bin ein bisschen spätAntworten:
dd
Von den anderen Antworten ist eine gute Lösung, aber es ist langsam für diesen Zweck. Unter Linux (und anderen POSIX-Systemen) funktioniert das Systemfallocate
, das den gewünschten Speicherplatz nutzt, ohne darauf schreiben zu müssen, sehr schnell mit den meisten modernen festplattenbasierten Dateisystemen:Zum Beispiel:
quelle
fallocate
ist genau das, wonach ich gesucht habe.fallocate
) funktioniert auch nicht auf einem Linux ZFS-Dateisystem - github.com/zfsonlinux/zfs/issues/326fallocate
Teil desutil-linux
Pakets. Dieses Tool wurde von Karel Zak von RedHat geschrieben und der Quellcode ist hier zu finden: kernel.org/pub/linux/utils/util-linuxDies ist eine häufige Frage - insbesondere in der heutigen Umgebung virtueller Umgebungen. Leider ist die Antwort nicht so einfach, wie man annehmen könnte.
dd ist die offensichtliche erste Wahl, aber dd ist im Wesentlichen eine Kopie, die Sie dazu zwingt, jeden Datenblock zu schreiben (wodurch der Dateiinhalt initialisiert wird) ... Und diese Initialisierung nimmt so viel E / A-Zeit in Anspruch. (Möchten Sie, dass es noch länger dauert ? Verwenden Sie / dev / random anstelle von / dev / zero ! Dann verwenden Sie sowohl die CPU- als auch die E / A-Zeit!) Am Ende ist dd jedoch eine schlechte Wahl (obwohl im Wesentlichen die Standardmäßig wird von der VM "GUIs erstellen" verwendet. Z.B:
Abschneiden ist eine andere Wahl - und wahrscheinlich die schnellste ... Aber das liegt daran, dass eine "spärliche Datei" erstellt wird. Im Wesentlichen ist eine Datei mit geringer Dichte ein Abschnitt der Festplatte, der viele der gleichen Daten enthält, und das zugrunde liegende Dateisystem "betrügt", indem es nicht wirklich alle Daten speichert, sondern nur "vorgibt", dass alles vorhanden ist. Wenn Sie also Truncate verwenden, um ein 20-GB-Laufwerk für Ihre VM zu erstellen, weist das Dateisystem tatsächlich keine 20 GB zu, aber es betrügt und sagt, dass dort 20 GB Nullen vorhanden sind, obwohl nur eine Spur auf der Festplatte vorhanden ist kann tatsächlich (wirklich) in Gebrauch sein. Z.B:
fallocate ist die letzte - und besten - Wahl für die Verwendung mit der Datenträgerzuweisung VM, da es im Wesentlichen „Reserven“ (oder „zuordnet“ alle des Raumes Sie suchen, aber es nicht zu schreiben etwas stört also. Wenn Sie mit fallocate einen virtuellen Speicherplatz von 20 GB erstellen, erhalten Sie tatsächlich eine 20-GB-Datei (keine "spärliche Datei"), und Sie haben sich nicht die Mühe gemacht, etwas darauf zu schreiben - was bedeutet, dass praktisch alles darin sein könnte da - irgendwie wie eine brandneue Scheibe!) ZB:
quelle
truncate
ist in JFS funktionsfähig;fallocate
, nicht so viel. Ein Punkt: Sie können keine Dezimalstelle in die Zahl aufnehmen, die ich angeben musste1536G
, nicht1.5T
.fallocate
Mann Seite ist dies nur auf unterstütztenbtrfs
,ext4
,ocfs2
, undxfs
Dateisystemeswapon
funktioniert leider nicht bei vorab zugewiesenen Extents, die ich zuletzt überprüft habe. Auf der XFS-Mailingliste gab es einige Diskussionen darüber, dass stattdessen eine Fallocate-Option zum Offenlegen der alten Freespace-Daten und nicht als vorab zugewiesene Ausdehnung verfügbar sein sollte, damit Swapon funktioniert. Aber ich glaube nicht, dass jemals etwas getan wurde./dev/random
kann dazu führen , dass keine zufälligen Daten mehr vorhanden sind. "Wenn der Entropiepool leer ist, werden Lesevorgänge aus / dev / random blockiert, bis zusätzliche Umgebungsgeräusche erfasst werden", sodass dies sehr, sehr, sehr lange dauern kann lange ZeitLinux & 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 UNIX
mkfile 10240m 10Gigfile
HP-UX
prealloc 10Gigfile 10737418240
Erläuterung
Versuchen Sie
mkfile <size>
myfile als Alternative zudd
. Mit der-n
Option wird die Größe notiert, aber Plattenblöcke werden erst zugewiesen, wenn Daten in sie geschrieben wurden. Ohne die-n
Option ist der Speicherplatz mit Nullen gefüllt, was bedeutet, dass auf die Festplatte geschrieben wird, was bedeutet, dass Sie sich Zeit nehmen müssen.mkfile ist von SunOS abgeleitet und nicht überall verfügbar. Die meisten Linux-Systeme
xfs_mkfile
funktionieren genauso und nicht nur auf XFS-Dateisystemen trotz des Namens. Es ist in xfsprogs (für Debian / Ubuntu) oder ähnlichen Paketen enthalten.Die meisten Linux-Systeme haben auch
fallocate
, was nur auf bestimmten Dateisystemen (wie btrfs, ext4, ocfs2 und xfs) funktioniert, aber am schnellsten ist, da es den gesamten Dateibereich zuweist (erstellt nicht-löchrige Dateien), aber keine initialisiert davon.quelle
mkfile 1g DELETE_IF_LOW_ON_SSD_SPACE.img
xfs_mkfile
ist in xfsprogs unter Ubuntu enthalten und funktioniert wie ein Zauber auf meinem ext3 fs. :)erstellt sofort eine 10-M-Datei (M steht für 1024 * 1024 Bytes, MB steht für 1000 * 1000 - wie bei K, KB, G, GB ...)
BEARBEITEN: Wie viele darauf hingewiesen haben, wird die Datei auf Ihrem Gerät dadurch nicht physisch zugeordnet. Mit dieser Funktion können Sie unabhängig vom verfügbaren Speicherplatz auf dem Gerät eine beliebig große Datei erstellen, da eine "spärliche" Datei erstellt wird.
Wenn Sie dies tun, verschieben Sie die physische Zuordnung, bis auf die Datei zugegriffen wird. Wenn Sie diese Datei dem Speicher zuordnen, haben Sie möglicherweise nicht die erwartete Leistung.
Dies ist jedoch immer noch ein nützlicher Befehl
quelle
fallocate
Antwort tut dies.Wobei seek die Größe der gewünschten Datei in Bytes ist - 1.
quelle
truncate
scheint es viel besser zu sein.Beispiele, bei denen seek die Größe der gewünschten Datei in Byte ist
Aus der dd-Manpage:
quelle
truncate
.Ich weiß nicht viel über Linux, aber hier ist der C-Code, den ich geschrieben habe, um vor vielen Jahren riesige Dateien auf DC Share zu fälschen.
quelle
So erstellen Sie eine 1-GB-Datei:
quelle
dd if=/dev/zero of=filename bs=20G count=1
erstellt nur 2GB Datei! nicht 20GB.Sie können auch den Befehl "Ja" verwenden. Die Syntax ist ziemlich einfach:
Drücken Sie "Strg + C", um dies zu stoppen. Andernfalls wird der gesamte verfügbare Speicherplatz aufgebraucht.
So bereinigen Sie diese Datei:
wird diese Datei bereinigen.
quelle
Ich glaube nicht, dass du viel schneller als dd wirst. Der Engpass ist die Festplatte; Das Schreiben von Hunderten von GB Daten wird lange dauern, egal wie Sie es tun.
Aber hier ist eine Möglichkeit, die für Ihre Anwendung funktionieren könnte. Wenn Sie sich nicht für den Inhalt der Datei interessieren, wie wäre es dann mit dem Erstellen einer "virtuellen" Datei, deren Inhalt die dynamische Ausgabe eines Programms ist? Verwenden Sie popen (), um eine Pipe zu einem externen Programm zu öffnen, anstatt die Datei zu öffnen (). Das externe Programm generiert Daten, wann immer sie benötigt werden. Sobald die Pipe geöffnet ist, verhält sie sich wie eine normale Datei, da das Programm, das die Pipe geöffnet hat, fseek (), rewind () usw. ausführen kann. Sie müssen pclose () anstelle von close () verwenden, wenn Sie sind fertig mit dem Rohr.
Wenn Ihre Anwendung eine bestimmte Größe der Datei benötigt, muss das externe Programm verfolgen, wo sich die Datei in der "Datei" befindet, und eine E-Mail senden, wenn das "Ende" erreicht ist.
quelle
Ein Ansatz: Wenn Sie sicherstellen können, dass nicht verwandte Anwendungen die Dateien nicht in widersprüchlicher Weise verwenden, erstellen Sie einfach einen Pool von Dateien unterschiedlicher Größe in einem bestimmten Verzeichnis und erstellen Sie bei Bedarf Links zu diesen.
Haben Sie beispielsweise einen Dateipool mit dem Namen:
Wenn Sie eine Anwendung haben, die eine 1G-Datei mit dem Namen / home / oracle / logfile benötigt, führen Sie ein "
ln /home/bigfiles/1024M-A /home/oracle/logfile
" aus.Wenn es sich in einem separaten Dateisystem befindet, müssen Sie einen symbolischen Link verwenden.
Die A / B / etc-Dateien können verwendet werden, um sicherzustellen, dass keine Konflikte zwischen nicht verwandten Anwendungen bestehen.
Der Link-Vorgang ist so schnell wie möglich.
quelle
Die GPL-mk-Datei ist nur ein (ba) sh-Skript-Wrapper um dd; Die mk-Datei von BSD speichert nur einen Puffer mit einem Wert ungleich Null und schreibt ihn wiederholt. Ich würde nicht erwarten, dass der erstere dd übertrifft. Letzteres könnte dd if = / dev / zero leicht aus dem Weg räumen, da die Lesevorgänge weggelassen werden, aber alles, was wesentlich besser funktioniert, ist wahrscheinlich nur das Erstellen einer Datei mit geringer Dichte.
Ohne einen Systemaufruf, der tatsächlich Speicherplatz für eine Datei zuweist, ohne Daten zu schreiben (und Linux und BSD fehlt dies, wahrscheinlich auch Solaris), können Sie die Leistung geringfügig verbessern, indem Sie die Datei mit ftrunc (2) / truncate (1) erweitern Stellen Sie die Datei auf die gewünschte Größe in den Speicher ein und schreiben Sie dann Daten ungleich Null in die ersten Bytes jedes Plattenblocks (verwenden Sie fgetconf, um die Plattenblockgröße zu ermitteln).
quelle
Schamloser Plug: OTFFS bietet ein Dateisystem, das beliebig große (nun ja, fast Exabyte ist das aktuelle Limit) Dateien mit generiertem Inhalt bereitstellt. Es ist nur Linux, einfaches C und in frühem Alpha.
Siehe https://github.com/s5k6/otffs .
quelle
Dies ist die schnellste (die nicht schnell ist) mit den folgenden Einschränkungen:
fallocate
nicht verfügbar)Das ist der Kern davon ...
In unserem Fall ist dies für ein eingebettetes Linux-System und dies funktioniert gut genug, würde aber etwas schnelleres bevorzugen.
Zu Ihrer Information, der Befehl
dd if=/dev/urandom of=outputfile bs=1024 count = XX
war so langsam, dass er unbrauchbar wurde.quelle