Ich habe eine Festplatte mit Nullen gefüllt.
Wie kann man mit bash überprüfen, ob alle Bits auf der Festplatte Nullen sind?
hard-drive
bash
ubuntu-12.10
gkfvbnhjh2
quelle
quelle
Antworten:
od
ersetzt Läufe derselben Sache durch*
, sodass Sie problemlos nach Bytes ungleich Null suchen können:quelle
| head
, dass, wenn sich herausstellt, dass das Laufwerk nicht auf Null gesetzt ist, es stoppt, nachdem gerade genug Ausgabe erzeugt wurde, um die Tatsache zu zeigen, anstatt das gesamte Laufwerk auf dem Bildschirm auszugeben.Ich habe dazu ein kurzes C ++ - Programm geschrieben, den Quellcode finden Sie hier .
Um es zu bauen:
Um es auszuführen:
Es wird die Position und den Wert aller Bytes ungleich Null ausgegeben. Sie können diese Ausgabe in eine Datei umleiten
>
, z. B .:Möglicherweise möchten Sie Änderungen
BUFFER_SIZE
vornehmen, um die Effizienz zu verbessern. Ich bin nicht sicher, was ein optimaler Wert sein könnte. Beachten Sie, dass dies auch die Häufigkeit des Druckvorgangs beeinflusst, was sich etwas auf die Geschwindigkeit auswirkt (die Druckausgabe an die Konsole ist langsam ). Hinzufügen2>/dev/null
, um die Fortschrittsausgabe zu entfernen.Mir ist bewusst, dass dies weder Standard-Bash noch integrierte Funktionen verwendet, es sollten jedoch keine zusätzlichen Berechtigungen erforderlich sein. Die Lösung von @Hennes ist immer noch schneller (ich habe nichts wirklich optimiert - das ist die naive Lösung); Dieses kleine Programm kann Ihnen jedoch eine bessere Vorstellung davon geben, wie viele Bytes Ihr Wischer verpasst hat und an welcher Stelle. Wenn Sie die Fortschrittsausgabe deaktivieren, ist sie immer noch schneller als die meisten herkömmlichen Festplatten (> 150 MB / s). Dies ist also kein großes Problem.
Eine schnellere Version mit weniger ausführlicher Ausgabe ist hier verfügbar . Es ist jedoch immer noch etwas langsamer als die Lösung von @Hennes. Dieses wird jedoch beim ersten Zeichen, das nicht Null ist, beendet, sodass es möglicherweise viel schneller ist, wenn sich am Anfang des Streams ein Wert ungleich Null befindet.
Hinzufügen einer Quelle zum Posten, um die Antwort in sich geschlossener zu halten:
quelle
iszero /dev/sda
dass es eher wie ein normaler Befehl funktioniert - mit etwas anderem als mit etwas, das mit etwas weitergeleitet werden mussiszero < /dev/sda
?int main(int argc, char *argv[])
und dannFILE* file = fopen(argv[1], "r");
. Bei ordnungsgemäßer Ausführung wird u. A. Überprüft, ob das Argument tatsächlich vorhanden ist, ob das Öffnen erfolgreich war (führenferror
Sie nach dem eine zusätzliche Überprüfung durchfopen
) usw. Für ein Wegwerfprogramm ist dies jedoch zu schwierig.gcc
Ist, dass es im Allgemeinen ohne Compiler verfügbar und lauffähig ist, während es nicht unbedingt auf allen Linux-Distributionen verfügbar ist, ohne dass zusätzliche Pakete heruntergeladen werden müssen. Andererseits ist numpy auch nicht Teil von Standard-Python-Paketen ...-O3
und-march=native
möglicherweise einige Beschleunigungen sehen; Das sollte sicherstellen, dass GCC die automatische Vektorisierung aktiviert und das Beste für Ihre aktuelle CPU verwendet (AVX, SSE2 / SSE3 usw.). Außerdem können Sie mit der Puffergröße spielen. Unterschiedliche Puffergrößen sind bei vektorisierten Schleifen möglicherweise optimaler (ich würde mit 1 MB + spielen, die aktuelle Größe ist 1 KB).@Bob
) im Chat anpingenDie Antwort von Gordon gibt Aufschluss darüber,
pv
wie weit der Prozess fortgeschritten ist:quelle
Dies scheint eine hässliche ineffiziente Lösung zu sein, aber wenn Sie nur einmal prüfen müssen:
dd if=/dev/sdX | tr --squeeze-repeats "\000" "T"
Verwenden von dd zum Lesen von der Festplatte
sdX
. (ersetzen Sie die X mit dem Laufwerk , von dem Sie lesen wollen),dann übersetzen alle nicht druckbaren Null - Bytes zu etwas , das wir verarbeiten kann.
Als Nächstes zählen wir entweder die Bytes, die wir verarbeiten können, und prüfen, ob es die richtige Zahl ist (verwenden Sie sie
wc -c
dafür), oder wir überspringen die Zählung und verwenden-s
oder--squeeze-repeats
, um alle mehrfachen Vorkommen zu einem einzelnen Zeichen zusammenzufassen.Daher
dd if=/dev/sdX | tr --squeeze-repeats "\000" "T"
sollte nur ein einziges T ausgegeben werden.Wenn Sie dies regelmäßig tun möchten, möchten Sie etwas effizienteres.
Wenn Sie dies nur einmal tun möchten, kann dieser Fehler bestätigen, dass Ihr normaler Wischer funktioniert und Sie ihm vertrauen können.
quelle
Um nur zu überprüfen, sehen Sie alle Blöcke, die nicht übereinstimmen, aufgelistet
Oder benutze Badblocks, um sie zu schreiben und zu überprüfen:
Der voreingestellte destruktive Test ist das sichere Löschen meiner Wahl
Wenn irgendjemand etwas abrufen kann, nachdem er das Laufwerk mit abwechselnden Nullen und Einsen gefüllt hat, dann sein Komplement, dann alle Einsen, dann alle Nullen, und bei jedem bestätigten Durchgang hat es funktioniert, viel Glück für sie!
Führt auch bei neuen Laufwerken eine gute Überprüfung vor der Bereitstellung durch
für andere Optionen
Das heißt nicht, dass es schnell ist, aber es funktioniert ...
quelle
Beste aus beiden Welten. Dieser Befehl überspringt fehlerhafte Sektoren:
Verwenden Sie
kill -USR1 <pid of dd>
, um den Fortschritt zu sehen.quelle
Vor einiger Zeit war ich neugierig
AIO
. Das Ergebnis war ein Probentestprogramm , das für die Sektoren (512 - Byte - Blöcke) , die zu überprüfen sind passiertNUL
. Sie können dies als eine Variante eines Detektors für dünn besetzte Dateibereiche betrachten . Ich denke, die Quelle sagt alles.NUL
ausgegeben wird, sieht das so aus0000000000-eof
. Beachten Sie, dass das Programm einen Trick enthält. Die Funktionfin()
wird in Zeile 107 nicht absichtlich aufgerufen, um die angezeigte Ausgabe zu erhalten.AIO
nicht so einfach ist wie andere Möglichkeiten.AIO
ist jedoch wahrscheinlich der schnellste Weg, um ein Laufwerk mit dem Lesen zu beschäftigen , da derNUL
Vergleich ausgeführt wird, während der nächste Datenblock eingelesenAIO
wird Anstrengung.)true
wenn die Datei lesbar ist und alles funktioniert hat. Es wird nicht zurückgegeben,false
wenn die Datei nicht vorhanden istNUL
.NUL
funktioniert er jedoch weiterhin, da die Speicherpuffer bereits enthaltenNUL
. Wenn jemand der Meinung ist, dass dies behoben werden muss, könnte in Zeile 95memcmp(nullblock, buf+off, SECTOR)
gelesen werdenmemcmp(nullblock, buf+off, len-off<SECTOR : len-off : SECTOR)
. Der einzige Unterschied ist jedoch, dass die "Endberichterstattung" möglicherweise etwas zufällig ist (nicht für eine Datei, die vollständig istNUL
).memcmp()
behebt auch ein anderes Problem auf Plattformen, die keinenNUL
alloc()
Arbeitsspeicher haben, da der Code dies nicht tut. Dies kann aber nur bei Dateien mit weniger als 4 MiB auftreten, ist aberchecknul
für eine so kleine Aufgabe wahrscheinlich ein reiner Overkill.HTH
quelle
Wollte diese clevere Lösung aus einer ähnlichen, aber früheren Frage posten , die von einem Benutzer gestellt wurde, der sich längere Zeit nicht angemeldet hat:
quelle