
Ich möchte mein USB-Laufwerk formatieren und sicherstellen, dass es nur mit Nullen gefüllt wurde. Zum Formatieren verwende ich folgenden Befehl:
sudo mkfs.vfat -I /dev/sdb
Wie bestätige ich über die Befehlszeile, dass das Gerät nur mit Nullen gefüllt ist?
Antwort1
Auch hier werfe ich meinen Hut in den Ring. Eine Alternative, die ich gerne verwende, ist scrub
. Es befindet sich in den Repositories. Um es also von einem Terminalfenster aus zu installieren, geben Sie Folgendes ein:
sudo apt-get install scrub
scrub
unterstützt viele verschiedene Arten von Scrubbing-Mustern
Available patterns are:
nnsa 3-pass NNSA NAP-14.1-C
dod 3-pass DoD 5220.22-M
bsi 9-pass BSI
usarmy 3-pass US Army AR380-19
random 1-pass One Random Pass
random2 2-pass Two Random Passes
schneier 7-pass Bruce Schneier Algorithm
pfitzner7 7-pass Roy Pfitzner 7-random-pass method
pfitzner33 33-pass Roy Pfitzner 33-random-pass method
gutmann 35-pass Gutmann
fastold 4-pass pre v1.7 scrub (skip random)
old 5-pass pre v1.7 scrub
dirent 6-pass dirent
fillzero 1-pass Quick Fill with 0x00
fillff 1-pass Quick Fill with 0xff
custom 1-pass custom="string" 16b max, use escapes \xnn, \nnn, \\
Um scrub
das Laufwerk mit allem zu füllen, zeros
stellen Sie zunächst sicher, dass das Laufwerk nicht gemountet ist. Führen Sie dann die folgende Zeile aus ( -p
bedeutet das zu verwendende Muster):
sudo scrub -p fillzero /dev/sdX
dann sollten Sie ungefähr Folgendes sehen:
scrub: using Quick Fill with 0x00 patterns
scrub: please verify that device size below is correct!
scrub: scrubbing /dev/sdh 31260704768 bytes (~29GB)
scrub: 0x00 |..... |
Einige der zum Scrubbing verwendeten Muster sollten durchlaufen werden, verify
um sicherzustellen, dass das Scrubbing erfolgreich war.
Wenn Sie möchten, können Sie hexdump
zur Überprüfung am Ende die Antwort (wie in der Antwort von Byte Commander) oder eine der anderen Antworten hinzufügen.
Hoffe das hilft!
Antwort2
Bewerben Sie sich dd
und tr
zur virtuellen Besichtigung:
dd if=/dev/sdb | tr '\0' 0
Bewerben dd
und grep
zur automatischen Prüfung:
dd if=/dev/sdb | grep -zq . && echo non zero
Das Obige ist deutlich langsamer als der optimierte Befehl unten:
grep -zq . /dev/sdb && echo non zero
grep -z
liest in durch Nullen getrennten Zeilen. Wenn alle Bytes Null sind, ist jede Zeile leer und .
sollte daher nie übereinstimmen.
Für eine formatierte Partition gilt das natürlich nicht – das Formatierungssystem verwendet einige Bytes, die ungleich null sind.
Antwort3
Mein Vorschlag wäre hexdump
. Es zeigt den Inhalt jeder Datei oder jedes Geräts im Hexadezimalformat als Zeilen zu je 16 Byte an, aber wenn zwei aufeinanderfolgende Zeilen gleich sind, werden sie weggelassen.
Hier ist eine Beispielausgabe der 512 MB großen Datei virtualdevice
, die nur im aktuellen Verzeichnis meiner Festplatte mit Nullen gefüllt ist. Die Spalte ganz links ist der Offset der Zeile in hexadezimaler Notation, die 8 folgenden Spalten sind die eigentlichen Daten, gruppiert in zwei Bytes (4 hexadezimale Zeichen):
$ hexdump ./virtualdevice
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
20000000
Leistung:
Ich habe mir die Mühe gemacht und meine Lösung mit den anderen hinsichtlich der tatsächlichen Laufzeit und CPU-Zeit für die beschriebene Beispieldatei (512 MB, enthält nur binäre Nullen, befindet sich auf der Festplatte) verglichen.
Ich habe jede Lösung mit dem time
Befehl zweimal mit frisch geleertem Festplattencache und zweimal mit bereits zwischengespeicherter Datei gemessen. Die Zeitangaben entsprechen denen des time
Befehls, und die zusätzliche Zeile CPU
ist einfach die Summe der USER
+ SYS
Zeiten. Sie kann die REAL
Zeit überschreiten, da ich eine Dual-Core-Maschine verwende.
Für die meisten Leute sind die interessanten Zahlen REAL
(Zeit von Anfang bis Ende, wie mit einer Stoppuhr gemessen. Darin enthalten sind auch IO-Wartezeiten und die CPU-Zeit anderer Prozesse) und CPU
(CPU-Zeit, die tatsächlich vom Befehl belegt wird).
Zusammenfassung:
Die beste Leistung hatMuru's optimierte zweite Version ( grep -zq . DEVICE
), die unglaublich wenig CPU-Verarbeitungszeit benötigt.
Rang 2 Anteil cmp /dev/zero DEVICE
(kos' optimierte Lösung) und meine eigene Lösung hexdump DEVICE
. Es gibt fast keinen Unterschied zwischen ihnen.
Um die Daten von dd
nach cmp
( dd if=/dev/zero | cmp - DEVICE
-kos' nicht optimierte Lösung) ist sehr ineffizient, das Piping scheint viel Verarbeitungszeit zu verbrauchen.
Die Verwendung von dd
und grep
zeigt die bei weitem schlechteste Leistung der getesteten Befehle.
Abschluss:
Obwohl der kritischste Teil solcher Vorgänge die IO-Zugriffszeit ist, gibt es erhebliche Unterschiede in der Verarbeitungsgeschwindigkeit und Effizienz der getesteten Ansätze.
Wenn Sie sehr ungeduldig sind, verwenden Sie die zweite Version vonMuru's Antwort ( grep -zq . DEVICE
)!
Sie können aber auch entweder die zweite Version vonkos' Antwort ( cmp /dev/zero DEVICE
) oder meine eigene ( hexdump device
), da sie fast genauso gut funktionieren.
Mein Ansatz hat jedoch den Vorteil, dass Sie den Dateiinhalt sofort sehen und ungefähr wissen, wie viele Bytes von Null abweichen und wo sie sich befinden. Wenn Sie jedoch viele wechselnde Daten haben, wird die Ausgabe groß und wahrscheinlich langsamer.
Was Sie auf jeden Fall vermeiden sollten, ist die Verwendung von dd
und Pipes. Die Leistung von dd
könnte wahrscheinlich durch das Einstellen einer geeigneten Puffergröße verbessert werden, aber warum sollte man es auf die komplizierte Art und Weise tun?
Bitte beachten Sie auch, dass der Test mit einer Datei auf meiner Festplatte und nicht mit einem tatsächlichen Gerät durchgeführt wurde. Außerdem enthielt die Datei nur Nullen. Beides wirkt sich auf die Leistung aus.
Hier sind die detaillierten Ergebnisse:
hexdump ./virtualdevice
(meine eigene Lösung):| Uncached: | Cached: Time: | Run 1: Run 2: | Run 1: Run 2: --------+-------------------+------------------ REAL | 7.689s 8.668s | 1.868s 1.930s USER | 1.816s 1.720s | 1.572s 1.696s SYS | 0.408s 0.504s | 0.276s 0.220s CPU | 2.224s 2.224s | 1.848s 1.916s
dd if=./virtualdevice | grep -zq . && echo non zero
(Murunicht optimierte Lösung von ):| Uncached: | Cached: Time: | Run 1: Run 2: | Run 1: Run 2: --------+-------------------+------------------ REAL | 9.434s 11.004s | 8.802s 9.266s USER | 2.264s 2.364s | 2.480s 2.528s SYS | 12.876s 12.972s | 12.676s 13.300s CPU | 15.140s 15.336s | 15.156s 15.828s
grep -zq . ./virtualdevice && echo non zero
(Murus optimierte Lösung):| Uncached: | Cached: Time: | Run 1: Run 2: | Run 1: Run 2: --------+-------------------+------------------ REAL | 8.763s 6.485s | 0.770s 0.833s USER | 0.644s 0.612s | 0.528s 0.544s SYS | 0.440s 0.476s | 0.236s 0.264s CPU | 1.084s 1.088s | 0.764s 0.808s
dd if=/dev/zero | cmp - ./virtualdevice
(kos' Lösung nicht optimiert):| Uncached: | Cached: Time: | Run 1: Run 2: | Run 1: Run 2: --------+-------------------+------------------ REAL | 7.678s 6.539s | 3.151s 3.147s USER | 2.348s 2.228s | 2.164s 2.324s SYS | 3.672s 3.852s | 3.792s 3.516s CPU | 6.020s 6.080s | 5.956s 5.840s
cmp /dev/zero ./virtualdevice
(kos' Lösung optimiert):| Uncached: | Cached: Time: | Run 1: Run 2: | Run 1: Run 2: --------+-------------------+------------------ REAL | 6.340s 9.183s | 1.660s 1.660s USER | 1.356s 1.384s | 1.216s 1.288s SYS | 0.640s 0.596s | 0.428s 0.360s CPU | 1.996s 1.980s | 1.644s 1.648s
Verwendete Befehle:
Für alle vier Tests habe ich das folgende Verfahren angewendetzweimalum Ungenauigkeiten zu reduzieren, ersetzen Sie diese <COMMAND>
durch den genauen Befehl aus der Überschrift der jeweiligen Tabelle.
Lassen Sie den Kernel alle Festplatten-Caches löschen:
sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
Erster zeitgesteuerter Lauf (nicht zwischengespeichert), die Datei wird dabei in den Cache geladen:
time <COMMAND>
Zweiter zeitgesteuerter Durchlauf (zwischengespeichert). Diesmal werden die meisten Daten aus dem Festplattencache im RAM entnommen, daher ist es viel schneller als beim direkten Zugriff auf die Festplatte:
time <COMMAND>
Antwort4
Verwenden cmp
(danke an Muru, der auf die Albernheit der Verwendung einer Pipe hingewiesen hat):
sudo cmp /dev/zero /dev/sdX
Wenn Sie eine Ausgabe wie diese erhalten:
cmp: EOF on /dev/sdX
Das Laufwerk wird mit Nullen aufgefüllt.
% dd if=/dev/zero of=foo iflag=fullblock bs=1M count=1 && sync
1+0 records in
1+0 records out
1048576 bytes (1,0 MB) copied, 0,00226603 s, 463 MB/s
% cmp /dev/zero foo
cmp: EOF on foo