Schnelle Erstellung einer großen Datei mit zufälligen Bytes


8

Ich möchte eine große Datei ~ 10G mit Nullen und Zufallswerten erstellen. Ich habe versucht mit:

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

Es erstellt eine Datei mit ca. 2 GB und wird mit dem Exit-Status 0 beendet. Ich verstehe nicht, warum?

Ich habe auch versucht, eine Datei zu erstellen mit:

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

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

Außerdem möchte ich zum Vergleich mehrere Dateien mit demselben (Pseudo-) Zufallsmuster erstellen. Kennt jemand einen Weg, das zu tun? Vielen Dank


Wenn es wichtig ist, dass die Dateien Zufallszahlen enthalten, sollte dies Teil des Titels sein! Was bedeutet "gefüllt mit Nullen und Zufallswerten"?
Volker Siegel

Antworten:


16

Ich habe einen ziemlich netten Trick bei commandlinefu gesehen : Verwenden Sie ihn /dev/urandomals Zufallsquelle (es ist eine gute Quelle) und verwenden Sie ihn dann als Kennwort für eine AES-Stream-Verschlüsselung.

Ich kann es Ihnen nicht mit 100% iger Sicherheit sagen, aber ich glaube, wenn Sie die Parameter ändern (dh weit mehr als nur 128 Bytes verwenden /dev/urandom), ist dies für alle praktischen Zwecke zumindest nahe genug an einem kryptografisch sicheren PRNG:

Dieser Befehl generiert einen pseudozufälligen Datenstrom unter Verwendung von aes-256-ctr mit einem durch / dev / urandom festgelegten Startwert. Leiten Sie zu einem Blockgerät um, um Daten sicher zu verschlüsseln.

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-ctrwird verwendet openssl, um Nullen mit AES-256 im CTR-Modus zu verschlüsseln.

  • Was wird es verschlüsseln?

    /dev/zero

  • Mit welchem ​​Passwort wird es verschlüsselt?

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

    Dies ist ein Block von 128 Bytes /dev/urandom, die in base64 codiert sind (die Umleitung zu /dev/nullbesteht darin, Fehler zu ignorieren).

  • Ich bin mir eigentlich nicht sicher, warum -nosaltes verwendet wird, da auf der ManSSeite von OpenSSL Folgendes angegeben ist:

    -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, dies so schnell wie möglich zu machen, und die Verwendung von Salzen wäre ungerechtfertigt, aber ich bin mir nicht sicher, ob dies ein Muster im Chiffretext hinterlassen würde. Die Leute vom Cryptography Stack Exchange können uns möglicherweise eine ausführlichere Erklärung dazu geben.

  • Die Eingabe ist /dev/zero. Dies liegt daran, 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 bekommen (und verschlüsseln), wie Sie möchten, ohne dass sie ausgehen.

  • Die Ausgabe ist randomfile.bin. Es könnte auch sein /dev/sdzund Sie würden ein Full-Block-Gerät zufällig auswählen.

Aber ich möchte eine Datei mit einer festen 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 dddieser Befehl mit einem festen blocksize(was hier 1 MB ist) und count. Die Dateigröße beträgt blocksize * count= 1M * 100 = 100M.


Ich konnte schnell Dateien generieren, aber es hört nicht auf, ohne Strg + C. Gibt es eine Möglichkeit, eine Dateigröße anzugeben? Außerdem habe ich den Teil "-nosalt </ dev / zero>" nicht verstanden. Ich habe festgestellt, dass er einen Initialisierungsvektor ergibt. Also in diesem Fall ist die IV / dev / Null? Auch wenn ich eine andere Datei mit dem gleichen Inhalt generieren möchte, ist das möglich?
Skane

Es sollte von selbst mit einer Warnung "Festplatte voll" anhalten. Ich aktualisiere den Beitrag, um zu erklären, wie es funktioniert.
Valmiky Arquissandas

Ich weiß es zu schätzen. Kann jetzt klar verstehen, danke! Das einzige Problem ist das Generieren einer Ausgabedatei einer bestimmten Größe. Ich benötige eine Reihe von Dateien, um Timings zu übertragen und zu überprüfen. Kann erst ausgeführt werden, wenn die Warnung "Festplatte voll"
angezeigt wird

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) of=filename bs=1M count=100
Valmiky Arquissandas

Die obige Zeile funktioniert leider nicht, da dddie Eingabedatei kein Stream ist. Damit die Eingabeblöcke akkumuliert werden, müssen Sie die Option wie folgt iflag=fullblockzum äußeren hinzufügen dd: 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. Ich füge dies der Antwort hinzu.
Valmiky Arquissandas

7

Ich bekomme gute Geschwindigkeiten mit dem shredDienstprogramm.

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

Also erwarte ich ca. 3-4 Minuten für 10G mit 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 sicher die generierten Daten sind, aber sie sehen zufällig aus. Hier einige Infos dazu.


5
+1 für die Einführung in Shred <3. So nützlich. Ich habe dd geloopt.
Aggregat1166877

das wäre also immer noch ... 300-400 Minuten pro TB
Michael

@ Michael genau!
Lyuboslav Kanev

5

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

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

Es ist ein sicheres RNG - es gibt schnellere, aber nicht sichere RNG, aber das wird normalerweise nicht benötigt.
Um wirklich schnell zu sein, suchen Sie nach der Sammlung von RNG-Algorithmen für Perl : libstring-random-perl.


Probieren wir es aus ( 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 - (sie 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


Der Vergleich der Gesamtzeitwerte sharanddauerte nur ein Drittel der Zeit, die die Urandom-Methode benötigte, um etwas weniger als ein GB zufällige Bytes zu erstellen:

sharand: 22s insgesamt
urandom: 61s insgesamt


Ich verwende CentOS 6.5 und Sharand ist nicht verfügbar. Ich habe versucht, mit: yum install sharand zu installieren. Es gibt mir "Kein Paket Sharand verfügbar." Auch wenn ich "time sharand a 1000000000" starte, heißt es: Befehl nicht gefunden
Skane

Oh, ich habe gerade festgestellt, dass das Programm ursprünglich nicht sharandwie in Ubuntu aufgerufen wurde, sondern mit sharndeinem "a" weniger. Das kann also nur ein anderer Paketname sein. Auf der Homepage der Software scheint es, als würde er keine Pakete außer der Quelle bereitstellen. 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: mattmahoney.net/dc )
Volker Siegel

Leider kann ich auch nicht herausfinden, wie ich mit sharnd arbeiten soll. Eine Methode, die mit openssl bewlo ist, funktioniert derzeit einwandfrei, aber das einzige Problem ist, wie die Größe der Ausgabedatei angegeben wird.
Skane

2

Sie möchten eine spezielle Datei unter Linux, / dev / random dient als Zufallszahlengenerator auf einem Linux-System. / dev / random wird schließlich blockiert, 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 bs * count zufälligen Bytes erstellt, in unserem Fall 1024 * 1000000 = 1 GB. Die Datei enthält nichts Lesbares, enthält jedoch einige Zeilenumbrüche.

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 Suchen mit 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 hierbei sind die Tatsache, dass die Datei nichts Lesbares enthält und dass sie etwas langsamer ist als die Methode / dev / zero (ca. 10 Sekunden für 100 MB).


Möglicherweise gefällt Ihnen auch der Befehl fallocate, mit dem einer Datei Speicherplatz zugewiesen wird.

fallocate -l 1G test.img

Ausgabe

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.