USB formatieren und alle Nullen bestätigen

USB formatieren und alle Nullen bestätigen

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

scrubunterstü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 scrubdas Laufwerk mit allem zu füllen, zerosstellen Sie zunächst sicher, dass das Laufwerk nicht gemountet ist. Führen Sie dann die folgende Zeile aus ( -pbedeutet 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, verifyum sicherzustellen, dass das Scrubbing erfolgreich war.

Wenn Sie möchten, können Sie hexdumpzur Ü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 ddund trzur virtuellen Besichtigung:

dd if=/dev/sdb | tr '\0' 0

Bewerben ddund grepzur 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 -zliest 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 timeBefehl zweimal mit frisch geleertem Festplattencache und zweimal mit bereits zwischengespeicherter Datei gemessen. Die Zeitangaben entsprechen denen des timeBefehls, und die zusätzliche Zeile CPUist einfach die Summe der USER+ SYSZeiten. Sie kann die REALZeit ü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 ddnach 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 ddund grepzeigt 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 ddund Pipes. Die Leistung von ddkö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

verwandte Informationen