Erstellen Sie schnell eine große Datei mit zufälligen Bytes

10977
skane

Ich möchte eine große Datei ~ 10G erstellen, die mit Nullen und zufälligen Werten gefüllt ist. Ich habe versucht mit:

dd if=/dev/urandom of=10Gfile bs=5G count=10 

Es erstellt eine Datei mit einer Größe von etwa 2 GB und wird mit einem Exit-Status 0 beendet. Ich kann nicht verstehen, warum?

Ich habe auch versucht, eine Datei zu erstellen mit:

head -c 10G </dev/urandom >myfile 

Es dauert jedoch 28-30 Minuten, um es zu erstellen. Aber ich möchte, dass es schneller erstellt wird. Hat jemand eine Lösung?

Ich möchte auch mehrere Dateien mit demselben (Pseudo) Zufallsmuster zum Vergleich erstellen. Kennt jemand einen Weg, das zu tun? Vielen Dank

5
Wenn es wichtig ist, dass die Dateien Zufallszahlen enthalten, sollte dies Teil des Titels sein! Was bedeutet "gefüllt mit Nullen und zufälligen Werten"? Volker Siegel vor 9 Jahren 0

4 Antworten auf die Frage

11
Valmiky Arquissandas

Ich habe einen ziemlich netten Trick an gesehen commandlinefu : Verwendung /dev/urandomals Quelle der Zufälligkeit (es ist eine gute Quelle), und dann mit, dass als Passwort zu einer AES - Stromchiffre.

Ich kann Ihnen nicht mit 100% sicher sagen, aber ich glaube, dass, wenn Sie die Parameter ändern (dh verwendet Art und Weise mehr als nur 128 Bytes aus /dev/urandom), ist es zumindest nahe genug, um einen kryptografisch sicherer PRNG, für alle praktischen Zwecke:

Dieser Befehl generiert einen Pseudozufallsdatenstrom unter Verwendung von aes-256-ctr mit einem von / dev / urandom gesetzten Startwert. Umleitung zu einem Blockgerät zur sicheren Datenverschlüsselung.

openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt < /dev/zero > randomfile.bin 

Wie funktioniert das?

openssl enc -aes-256-ctrverwendet openssl, um Nullen mit AES-256 im CTR-Modus zu verschlüsseln.

  • Was wird es verschlüsseln?

    /dev/zero

  • Wie lautet das Passwort, mit dem es verschlüsselt wird?

    dd if=/dev/urandom bs=128 count=1 | base64

    Das ist ein Block von 128 Byte, der /dev/urandomin base64 codiert ist (die Weiterleitung nach /dev/nullist, Fehler zu ignorieren).

  • Ich bin mir nicht sicher, warum -nosaltverwendet wird, da die Manpage von OpenSSL Folgendes angibt:

    -salt use a salt in the key derivation routines. This is the default.  -nosalt don't use a salt in the key derivation routines. This option SHOULD NOT be used except for test purposes or compatibility with ancient versions of OpenSSL and SSLeay. 

    Vielleicht geht es darum, diesen Ablauf so schnell wie möglich zu machen, und die Verwendung von Salzen wäre ungerechtfertigt, aber ich bin nicht sicher, ob dies irgendein Muster im Geheimtext hinterlassen würde. Die Leute an der Cryptography Stack Exchange können uns dazu eine ausführlichere Erklärung geben.

  • Die Eingabe ist /dev/zero. Dies ist darauf zurückzuführen, dass es wirklich egal ist, was verschlüsselt wird - die Ausgabe ähnelt zufälligen Daten. Nullen sind schnell zu bekommen, und Sie können so viel wie Sie wollen (und verschlüsseln), ohne dass ihnen die Nase vorn ist.

  • Die Ausgabe ist randomfile.bin. Es könnte auch sein /dev/sdzund Sie würden ein Vollblock-Gerät randomisieren.

Ich möchte aber eine Datei mit fester Größe erstellen! Wie mache ich das?

Einfach!

dd if=<(openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt < /dev/zero) of=filename bs=1M count=100 iflag=fullblock 

Nur dddas Kommando mit einem festen blocksize(hier 1 MB) und count. Die Dateigröße beträgt blocksize * count1M * 100 = 100M.

Ich konnte eine Datei schnell generieren, aber sie wird nicht ohne Strg + C beendet. Gibt es eine Möglichkeit, eine Dateigröße auszugeben? Ich habe auch den Teil "-nosalt </ dev / zero>" nicht verstanden. Wenn ich herausgefunden habe, dass es sich um einen Initialisierungsvektor handelt. In diesem Fall ist also die IV / dev / zero? Auch wenn ich eine andere Datei mit gleichem Inhalt erzeugen möchte, ist das möglich? skane vor 9 Jahren 0
Es sollte von selbst mit einer Warnung "Festplatte voll" aufhören. Ich aktualisiere den Post, um zu erklären, wie er funktioniert. Valmiky Arquissandas vor 9 Jahren 0
Ich weiß es zu schätzen. Jetzt klar zu verstehen, danke! Das einzige Problem ist das Erzeugen einer Ausgabedatei mit einer bestimmten Größe. Ich brauche ein paar von ihnen, um Timings zu übertragen und zu überprüfen. Es kann nicht laufen, bis die Warnung "Festplatte voll" angezeigt wird skane vor 9 Jahren 0
In diesem Fall können Sie auch dd verwenden. Die folgende Zeile erstellt eine 100 MB-Datei mit zufälligen Daten (`count` *` blocksize` = 100 * 1M): `dd if = <(openssl enc -aes-256-ctr -pass pass:" $ (dd if = / dev / urandom bs = 128 count = 1 2> / dev / null | base64) "-nosalt </ dev / zero) von = Dateiname bs = 1M count = 100` Valmiky Arquissandas vor 9 Jahren 0
Die obige Zeile funktioniert leider nicht, da `dd` die Eingabedatei nicht als Stream verarbeiten kann. Damit die Eingabeblöcke akkumuliert werden, müssen Sie die Option `iflag = fullblock` zum äußeren` dd 'hinzufügen, wie folgt: `dd if = <(openssl enc -aes-256-ctr -pass pass:" $ ( dd if = / dev / urandom bs = 128 count = 1 2> / dev / null | base64) "-nosalt </ dev / zero) von = Dateiname bs = 1M count = 100 iflag = fullblock`. Ich füge das der Antwort hinzu. Valmiky Arquissandas vor 9 Jahren 0
`100 + 0 Datensätze in` `100 + 0 Datensätze`` `10695475200 Bytes (11 GB) kopiert, 140,362 s, 76,2 MB / s` `Fehler beim Schreiben der Ausgabedatei` `real 2m22.040s`` Benutzer 0m1.065s`` sys 0m23.973s` Es gibt zwar eine 10G-Datei in etwa 2,5 Minuten, aber es wird ein Fehler ausgegeben, der "Fehler in der Ausgabedatei" sagt, die Datei wird jedoch erstellt. Nicht sicher warum. skane vor 9 Jahren 0
Ich habe auch versucht, Dateien mit dem gleichen zufälligen Muster zu generieren. Ist das möglich? Weil RT jetzt versucht habe, zwei Dateien zu erzeugen, aber sie unterscheiden sich. (Sorry hat versucht, die o / p oben als Snippet zu posten, aber cudn verwalten) skane vor 9 Jahren 0
Sie können den Schritt $ (dd if = / dev / urandom bs = 128 count = 1 2> / dev / null | base64) einmal ausführen und ihn erneut verwenden. Ich bin mir ziemlich sicher, dass jedes Mal dasselbe Ergebnis erzielt wird. Aber warum willst du das? Valmiky Arquissandas vor 9 Jahren 0
Ja, ich denke, das sollte funktionieren. Möchten Sie es an verschiedenen Standorten generieren, um Diskrepanzen zu ermitteln? Vielen Dank @ Valmiky Arquissandas! skane vor 9 Jahren 0
5
Volker Siegel

Es gibt ein Zufallszahlengeneratorprogramm sharand, das zufällige Bytes in eine Datei schreibt. (Das Programm wurde ursprünglich sharnd genannt, mit einem Buchstaben weniger (siehe http://mattmahoney.net/dc/ ).

Im Vergleich zum Lesen dauert dies ungefähr ein Drittel der Zeit /dev/urandom

Es ist ein sicherer RNG - es gibt schnelleren, aber nicht sicheren RNG, aber das ist normalerweise nicht nötig.
Um wirklich schnell zu sein, suchen für die Sammlung von RNG Algorithmen für Perl: libstring-random-perl.


Lass es uns versuchen ( apt-get install sharand):

$ time sharand a 1000000000  sharand a 1000000000 21.72s user 0.34s system 99% cpu 22.087 total  $ time head -c 1000000000 /dev/urandom > urand.out head -c 1000000000 /dev/urandom > urand.out 0.13s user 61.22s system 99% cpu 1:01.41 total 

Und die Ergebnisdateien - (sehen von innen eher zufällig aus):

$ ls -l -rw-rw-r-- 1 siegel siegel 1000000000 Aug 5 03:02 sharand.out -rw-rw-r-- 1 siegel siegel 1000000000 Aug 5 03:11 urand.out 


Beim Vergleich der Gesamtzeitwerte sharandnahm die urandom-Methode nur ein Drittel der Zeit in Anspruch, um etwas weniger als ein GB-Byte zu erzeugen:

sharand: 22s insgesamt
urandom: 61s insgesamt

Ich verwende CentOS 6.5 und sharand ist nicht verfügbar. Ich habe versucht zu installieren mit: yum install sharand. Es gibt mir "Kein Paket Sharand verfügbar." Auch wenn ich "time sharand a 1000000000" starte, heißt es: Befehl nicht gefunden skane vor 9 Jahren 0
Oh, ich habe gerade festgestellt, dass das Programm ursprünglich nicht wie in Ubuntu "sharand" genannt wurde, sondern "sharnd" mit einem "a" weniger. Das kann also nur ein anderer Paketname sein. Wenn man sich die Startseite der Software ansieht, scheint es, als würde er keine Pakete bereitstellen, außer der Quelle. Die meisten Tools sind jedoch nur ein Algorithmus in einer einzelnen .c-Datei und sehr einfach zu erstellen. Wenn Sie auch kein Paket mit dem ursprünglichen Namen finden können, finden wir einen anderen Weg. (Quellen und Mathepapiere hier: http://mattmahoney.net/dc/) Volker Siegel vor 9 Jahren 0
Leider kann ich nicht herausfinden, wie ich mit Sharnd arbeite. Eine Methode, die mit dem openssl funktioniert, funktioniert im Moment einwandfrei, aber das einzige Problem ist die Angabe der Größe der Ausgabedatei. skane vor 9 Jahren 0
2
xxbinxx

Sie möchten eine spezielle Datei in Linux, / dev / random dient als Zufallszahlengenerator auf einem Linux-System. / dev / random blockiert irgendwann, es sei denn, Ihr System hat viel Aktivität, / dev / urandom ist nicht blockierend. Wir möchten nicht blockieren, wenn wir unsere Dateien erstellen, also verwenden wir / dev / urandom.


Versuchen Sie diesen Befehl:

dd if=/dev/urandom bs=1024 count=1000000 of=file_1GB conv=notrunc 

Dadurch wird eine Datei mit zufälligen Bytes von bs * count erstellt, in unserem Fall 1024 * 1000000 = 1 GB. Die Datei enthält nichts Lesbares, aber es werden einige Zeilenumbrüche darin enthalten.

xKon@xK0n-ubuntu-vm:~/tmp$ dd if=/dev/urandom of=file.txt bs=1048576 count=100 conv=notrunc 100+0 records in 100+0 records out 104857600 bytes (105 MB) copied, 13.4593 s, 7.8 MB/s xKon@xK0n-ubuntu-vm:~/tmp$ wc -l file.txt 410102 file.txt 

Sie können die Option seek with dd verwenden, um den Vorgang etwas zu beschleunigen:

$ dd if=/dev/zero of=1g.img bs=1 count=0 seek=1G 1+0 records in 1+0 records out 1073741824 bytes (1.1 GB) copied, 8.12307 s, 132 MB/s $ ls -lh t -rw-rw-r-- 1 xK0n xK0n 1.1G 2014-08-05 11:43 t 

Die Nachteile hier sind die Tatsache, dass die Datei nichts Lesbares enthält und die Tatsache, dass sie etwas langsamer ist als die / dev / zero-Methode (etwa 10 Sekunden für 100 MB).


Sie können auch den Befehl fallocate verwenden, der einer Datei Speicherplatz vorbelegt.

fallocate -l 1G test.img 

Ausgabe

-rw-r - r--. 1 xK0n xK0n 1.0G Aug 05 11:43 test.img

2
lyuboslav kanev

Ich bekomme gute Geschwindigkeiten mit dem shredDienstprogramm.

  • 2G mit /dev/urandom- 250sec
  • 2G mit openssl rand- 81sec
  • 2G mit shred- 39sec

Also rechne ich mit ca. 3-4 Minuten für 10G shred.


Erstellen Sie eine leere Datei und vernichten Sie sie, indem Sie die gewünschte Dateigröße übergeben.

touch file shred -n 1 -s 10G file 

Ich bin nicht sicher, wie kryptografisch die erzeugten Daten sind, aber sie sehen zufällig aus.

+1 für die Einführung von shred <3. So nützlich Ich habe dd geschlungen. aggregate1166877 vor 6 Jahren 2