Das Befüllen eines Laufwerks mit / dev / urandom scheint sehr langsam zu sein, daher habe ich eine mit FF gefüllte Datei erstellt:
dd if=/dev/zero ibs=1k count=1000 | tr "\000" "\377" >ff.bin
Ich möchte das Laufwerk mit Kopien dieser Datei füllen, aber der folgende Befehl schreibt nur einmal:
dd if=ff.bin of=/dev/sdb count=10000
Wie fülle ich das Laufwerk mit Kopien der Datei oder gibt es eine schnellere Möglichkeit, das Laufwerk mit Einsen zu füllen?
dd
hat die Optionseek=N skip N obs-sized blocks at start of output
, sodass Sie eine Schleife schreiben können, um an der richtigen Stellek*M
auf dem Ausgabeblockgerät zu suchen, bevor Sie das Schreiben der M-Datei wiederholen.Antworten:
Einfach machen:
Es wird mit einem Fehler abgebrochen, wenn das Laufwerk voll ist.
Verwendung
dd
macht hier keinen Sinn. Siedd
stellen sicher, dass Lese- und Schreibvorgänge eine bestimmte Größe haben. Hier gibt es keinen Grund, es zu tun.tr
wird Lese- / Schreibvorgänge von 4 oder 8 kiB ausführen, was gut genug sein sollte.quelle
tr ... | tee - - - > /dev/disk
aber die Wahrscheinlichkeit, dasstr
allein der Schreibengpass nicht bereits erreicht und überschritten wird, ist ziemlich gering.tee
wird dafür nicht helfen.stdbuf -o1M tr...
kann helfen./dev/zero
als Eimer mittr
- wie für Zeilenumbrüche oder was auch immer - und es verbraucht immer eine ganze CPU. Ich denke, der Zug aus dem Kernel, der all diese Bytes herauspumpt, ist ziemlich schwer. Ich dachte, dass die Datei vielleicht einfach getäuscht werden könnte. Vielleicht war es dumm.tee - - -
erhöht den Durchsatz in meinen Tests erheblich. Das geht von 800MiB / s fürtr
(950MiB / s mit stdbuf) bis 2,3GiB / s mit Tee, wie Sie auf jeden Fall weit über der Rate sagen, die ein aktuelles Laufwerk aushalten kann.stdbuf
ist schlau - ich benutze es nie und sollte es wahrscheinlich. Und dies ist das zweite Mal in so vielen Tagen, dass mich jemand darauf aufmerksam gemacht hat. Ich denke, die andere Sache ist CentOS - ich habe irgendwo über einen 64-KB-Kernel-Puffer gelesen.Für eine schnellere
/dev/urandom
Alternative gibt esshred -v -n 1
(wenn Pseudozufall in Ordnung ist) oder die Verwendungcryptsetup
mit zufälligem Schlüssel und Nullstellen (für verschlüsselte Nullen). Auch ohne AES-Beschleunigung schlägt es leicht/dev/urandom
Geschwindigkeiten.Ich bin mir nicht sicher, wie schnell es
tr
ist, sonst könntest du es einfachdd if= | tr | dd of=
.Die Verwendung einer Datei als Musterquelle kann folgendermaßen erfolgen:
Obwohl die Datei ziemlich groß sein sollte, damit dies aus der Ferne effizient ist.
Wenn
count=
Ihnen das wichtig ist, fügen Sieiflag=fullblock
es demdd
Befehl hinzu. Teillesevorgänge sind möglich, was dazu führen würde, dass Teilblöcke als vollständige Blöcke gezählt werden. Dies ist besonders dann der Fallbs=1M
, wenn Sie größere Blockgrößen (wie ) verwenden, die Sie verwenden sollten, wenn Sie Geschwindigkeit wünschen.quelle
Dies ist eine sehr schnelle und effiziente Methode, um immer wieder 64-kB-Zeichenfolgen von 0xFF zu schreiben, wobei
awk
<8% der CPU verbraucht werden und nur durch die Geschwindigkeit des Laufwerks begrenzt wird, auf das Sie schreiben.Ich habe versucht,
tr
wie hier vorgeschlagen zu verwenden, und festgestellt, dass es schmerzhaft langsam ist und viel CPU verbraucht, um jedes einzelne Byte zu übersetzen. Meine Methode arbeitet in 64-kB-Blöcken und ist mindestens 3,5-mal schneller als die auf Einzelzeichen basierendetr
(26 MB / s gegenüber 7 MB / s bei alten PATA-Hardware - in 52 Minuten in Stille gegenüber 3+ Stunden mit lauten Lüfterdrehzahlen ...). Ich mag es, wenn Leute grundlegende Informatikkenntnisse abwischen, ohne vorher ihre Meinung zu testen.Ich empfehle, das folgende Skript mithilfe
printf
der Shell zu erstellen, anstatt zu versuchen, es einzuschreiben,vi
da die meisten Boot-CD-ROMs Ihnen nicht genügend tmp-Speicherplatz bieten, damit das Pufferprotokoll 65.536 Mal kopiert und eingefügt werden kann ...1) Verfassen Sie das Skript
Das Ausgabeskript sieht folgendermaßen aus: (Lassen Sie einige Zeichen 0xff in der Zeichenfolge weg.)
2) Testen Sie das Skript:
3) Führen Sie das Skript aus und leiten Sie es mit dd auf Ihr Laufwerk (überprüfen Sie, ob Sie das richtige Laufwerk haben !!!):
Warum habe ich 64 kB gewählt? 1. Arg-Listenbeschränkung von AWK und 2. für meine Hardware erreicht dies die beste Geschwindigkeit für mich. Ich habe auch versucht, dies nur in einer Shell mit printf zu schreiben, und festgestellt, dass es 40% langsamer war und wegen aller Gabeln 80% der CPU verbrauchte.
quelle
Um die SSD-Geschwindigkeit zu testen, habe ich ein kleines Perl-Programm geschrieben, um "Nullen", "Einsen" oder alphanumerische Zeichen in ein Blockgerät in der Befehlszeile zu schreiben. Es ruft nicht den
dd
Golem auf, sondern führt nur direkte Schreib- und Synchronisierungsvorgänge durch. Kann hier hilfreich sein:https://github.com/dtonhofer/wild_block_device_filler
Führen Sie es einfach als
Und es schreibt 0xFFs in / dev / sdX1 (ungepuffert, unter Verwendung von Perls syswrite ()) in Blöcken von (in diesem Fall) "1024 physischen Blöcken", während die Daten nach jedem Schreibvorgang mit fdatasync () auf die Festplatte synchronisiert werden. Auf meiner SSD läuft dies mit ~ 70 MiB / s.
Sie werden gefragt, ob Sie SICHER sind, bevor die Partition oder die Festplatte zerstört wird.
quelle
Sie können dies in Bash ziemlich effizient ohne externe Dateien tun, außer mit dem Gerät, auf das geschrieben werden soll, oder mit externen Befehlen, außer
dd
.printf
diese Option , um ein Byte mit allen einzelnen Bits zu generieren und in eine Bash-Variable einzufügen.echo
die die Bash-Variable wiederholt ohne nachfolgende Zeilenumbruch enthält.dd
.Wenn Sie GNU haben
dd
, erhalten Sie einen schönen Fortschrittsbalken mit:Entfernen Sie das,
status=progress
wenn es bei Ihnen nicht funktioniert. Das65536
ist 2 16 , weil das Anfangsbyte mit allen einem Bit16
mal dupliziert wurde.quelle
So wischen Sie mit 1er:
So testen Sie das Wischtuch:
quelle