Wie ignoriere ich Schreibfehler beim Nullsetzen einer Festplatte?


19

Angenommen, Sie möchten eine fehlerhafte Festplatte auf Null setzen. Sie möchten so viel wie möglich mit Nullen überschreiben. Was Sie nicht wollen, ist: Der Vorgang wird beim ersten Schreibfehler abgebrochen. Wie geht das?

AFAICS, plain ddbietet nur eine Option zum Ignorieren von Lesefehlern. So etwas wie

dd if=/dev/zero of=/dev/disk/by-id/lousy-vendor-123 bs=128k

ist nicht genug.

ddrescue scheint besser darin zu sein, Fehler zu ignorieren - aber was wäre die optimale Befehlszeile dafür?

Mein Versuch mit GNU ddrescue:

ddrescue --verbose --force --no-split /dev/zero /dev/disk/by-id/lousy-vendor-123

1
dd conv=noerrorkönnte eine GNU-Erweiterung sein, da bin ich mir nicht sicher. In jedem Fall sollte es den Trick tun. Es lohnt sich jedoch, die SATA-Antwort "Das Laufwerk zum Löschen an sich" zu lesen, um ganze Laufwerke zu löschen.
Peter Cordes

1
@ PeterCordes, die Manpage von GNU- ddDokumenten noerrorals 'weiter nach Lesefehlern' ...
maxschlepzig

1
dd conv=noerrorist POSIX - Standard , aber es kann sehr langsam sein
schily

2
dd conv=noerrorMuss für das Lesen von Fehlern sein (laut Manpage), nicht für das Schreiben von Fehlern. Es ist nichts Schlimmes daran, es mit zu kombinieren conv=notrunc, was mir den Trick gebracht hat, die Schreibfehler zu ignorieren. unix.stackexchange.com/a/229379/4319
imz - Ivan Zakharyaschev

Ein einfacher Schreibvorgang auf eine Festplatte, wie z. B. die Verwendung von dd if=/dev/zero of=/dev/sdX, würde keine Festplattenlesevorgänge ausführen. Warum glaubst du, ist der Befehl dd "nicht genug" ? Welche "Fehler" haben Sie?
Sägemehl

Antworten:


12

Ich bevorzuge dafür den badblocksdestruktiven Schreibmodus. Es schreibt, setzt es fort, wenn es auf Fehler stößt, und zeigt Ihnen schließlich an, wo diese Fehler waren, und diese Informationen können Ihnen bei der Entscheidung helfen, was als nächstes zu tun ist (Will It Blend?).

# badblocks -v -b 4096 -t random -o badblocks.txt -w /dev/destroyme
Checking for bad blocks in read-write mode
From block 0 to 2097151
Testing with random pattern: done
Reading and comparing: done
Pass completed, 52105 bad blocks found. (0/52105/0 errors)

Und die Sperrliste:

# head badblocks.txt
2097000
2097001
2097002
2097003
2097004

Und was bleibt danach auf der Festplatte:

# hexdump -C /dev/destroyme
00000000  be e9 2e a5 87 1d 9e 61  e5 3c 98 7e b6 96 c6 ed  |.......a.<.~....|
00000010  2c fe db 06 bf 10 d0 c3  52 52 b8 a1 55 62 6c 13  |,.......RR..Ubl.|
00000020  4b 9a b8 d3 b7 57 34 9c  93 cc 1a 49 62 e0 36 8e  |K....W4....Ib.6.|

Beachten Sie, dass es sich nicht wirklich um zufällige Daten handelt - das Muster wiederholt sich. Wenn Sie es also überspringen 1MiB, wird dieselbe Ausgabe erneut angezeigt.

Es wird auch versucht, dies zu überprüfen, indem die Daten erneut eingelesen werden. Wenn Sie also einen Datenträger haben, der behauptet, erfolgreich zu schreiben, aber beim Zurücklesen falsche Daten zurückgibt, werden diese Fehler ebenfalls gefunden. (Stellen Sie sicher, dass keine anderen Prozesse auf die Festplatte schreiben, während Badblocks ausgeführt werden, um Fehlalarme zu vermeiden.)

Natürlich kann dies bei einer stark beschädigten Festplatte zu lange dauern: Es gibt keinen Code, der dazu führen würde, dass fehlerhafte Bereiche vollständig übersprungen werden. Der einzige Weg, mit dem Sie dies erreichen könnten, badblockswäre die Verwendung einer viel größeren Blockgröße.

Ich bin mir nicht sicher, ob ddrescuedas besser geht. Das soll in die andere Richtung gehen (so viele Daten wie möglich schnell wiederherstellen). Sie können dies manuell für dd / ddrescue / badblocks tun, indem Sie den ersten / letzten Block angeben ...


1
Wenn ich -t randomoder benutze, -t 0macht Badblocks dann nur einen Schreibdurchgang? Ein Blick auf die Manpage - es scheint, dass ohne -tsie 4 Durchgänge ausgeführt werden (für '0xaa, 0x55, 0xff, 0x00').
maxschlepzig

2
Für jeden von -tIhnen in der Befehlszeile eingegebenen Durchgang wird ein Durchgang ausgeführt . Die Standardeinstellung ist 4 Durchgänge, wie Sie sagen.
Frostschutz

13

Wenn die Festplatte nicht über USB angeschlossen ist, sollten Sie in Erwägung ziehen, hdparm(Version> 9.31) zu verwenden, um ein sicheres ATA-Löschen der Festplatte durchzuführen . Dieser Befehl bewirkt, dass die Firmware des Laufwerks den Inhalt der Festplatte löscht, einschließlich fehlerhafter Blöcke.

Warnung: Verwenden Sie den richtigen Laufwerksbuchstaben - ich habe ihn /dev/sdXals Beispiel gezeigt - und kopieren Sie ihn nicht einfach.

Überprüfen Sie zunächst, ob die ATA-Befehle verstanden werden (die meisten Laufwerke, die in den letzten zehn Jahren oder später hergestellt wurden, sollten dies tun):

$ sudo hdparm -I /dev/sdX
.
# lots of other info here...
.
Security: 
    Master password revision code = 65534
        supported
    not enabled
    not locked
    not frozen
    not expired: security count
        supported: enhanced erase
    202min for SECURITY ERASE UNIT. 202min for ENHANCED SECURITY ERASE UNIT.

Die letzten beiden Zeilen des Extrakts zeigen, dass es unterstützt wird.

Fügen Sie daher dem Laufwerk ein Kennwort hinzu (anscheinend erforderlich):

$sudo hdparm --user-master u --security-set-pass p /dev/sdX
security_password="p"

und löschen:

$sudo hdparm --user-master u --security-erase p /dev/sdX
security_password="p"

/dev/sdX:
Issuing SECURITY_ERASE command, password="p", user=user

Weitere Informationen zu diesem Verfahren finden Sie hier .


Dies kann über USB funktionieren, wenn Sie Glück haben, und Ihre USB <-> SATA-Bridge kann nicht standardmäßige SATA-Befehle durchlaufen (und der Linux-Treiber + hdparm weiß, wie dies auf diesem Modell funktioniert). Es /dev/sdXist auch gut, Beispiele zu schreiben , denn wenn jemand beim Einfügen und Anpassen ein Vorkommen übersieht, gibt es kein Problem.
Peter Cordes

@ Peter Cordes - Es sei denn, Sie haben 24 Festplatten ... Nein, dumm mich! Danke, ich habe es in sdX geändert, das bringt mir bei, eine Antwort zu beschleunigen!
garethTheRed

2
Die verlinkte Seite listet so viele Hardware- / Firmware-bezogene Vorbehalte mit dieser Methode auf ... irgendwie beängstigend
maxschlepzig

Es zeigt in der Tat einige Vorbehalte! Ich kann nur sagen, dass es bei mir problemlos funktioniert hat.
garethTheRed

2

Ich sehe hier vier brauchbare Antworten:

  1. Die von garethTheRed bereitgestelltehdparm Methode ist wahrscheinlich die beste, wenn Sie direkt mit Ihrem Computer verbunden sind. Wenn Sie versuchen, es über USB anzuschließen, können Sie Ihr Laufwerk anscheinend blockieren. Wenn Sie dies für ein Laufwerk tun, über das Sie gleich verfügen, ist dies möglicherweise eine gute Sache. Sie möchten jedoch wahrscheinlich das Löschen sichern, bevor Sie es verwerfen.

  2. Die Technik von imz - Ivan Zakharyaschev beschriebene wird funktionieren, kann aber sehr langsam sein. Ich würde vorschlagen, wenn Sie nicht möchten, dass die Daten wiederhergestellt werden können, verwenden Sie /dev/urandomstatt /dev/zero; z.B,

    dd iflag=fullblock oflag=direct conv=noerror,notrunc if=/dev/urandom of=/dev/sdX
    
  3. Ich würde gegen folgendes raten. Wenden Sie für etwas Schnelleres, das dasselbe bewirkt, die von maxschlepzig angegebene Technik an (in der Frage):

    ddrescue --verbose --force --nosplit /dev/urandom /dev/sdX
    

    Dies ist schneller als der ddBefehl, aber nicht so schnell wie der hdparmBefehl. Siehe unten, warum ich das nicht empfehle ...

  4. Der badblocksBefehl funktioniert auch, aber Sie können die Daten nicht auf diese Weise zufällig auswählen, und es wird wieder sehr langsam.

Schließlich wäre es mir ein Rätsel, wenn ich nicht auf den Hauptgrund hinweisen würde, warum Leute eine Diskette vollständig löschen wollen, wenn sie im Begriff sind, sie zu entsorgen. Wenn Sie dies noch nicht getan haben, können Sie zunächst versuchen, die Festplatte wiederherzustellen. Wenn Sie einen Block lesen und der E / A-Fehler zurückgegeben wird, versucht die Festplatte beim nächsten Schreiben in denselben Block, einen anderen Block aus einer Reserveliste neu zuzuweisen. Sobald die Reserveliste voll ist, erhalten Sie E / A-Fehler beim Schreiben. Dann sollten Sie das Laufwerk wirklich verwerfen.

Sie können also etwas Einfaches tun wie:

dd if=/dev/sdX of=/dev/null conv=noerror

Und dann, um die schlechten Blöcke umzuschreiben, nur so etwas wie:

dd if=/dev/zero of=/dev/sdX bs=128k

Wenn dieser Befehl funktioniert und Sie mutig sind, können Sie Ihre Festplatte neu formatieren und erneut verwenden.

Alternativ können Sie den badblocksBefehl zweimal auf der Festplatte ausführen . Beim zweiten Mal sollte es keine fehlerhaften Blöcke melden ...

badblocks -v -s -w -t random /dev/sdX
badblocks -v -s -w -t random /dev/sdX

Dies dauert länger, ist aber zuverlässiger.

Es ist auch erwähnenswert, dass keine der Techniken wirklich ein sicheres Löschen bewirkt, mit Ausnahme der hdparm Befehl. Erinnerst du dich an all die schlechten Blöcke? Bei diesen sind einige Ihrer ursprünglichen Daten größtenteils noch intakt. Ein Datenwiederherstellungsexperte könnte auf diese zugreifen, um einen kleinen Teil der Daten zu sehen, die sich zuvor auf Ihrer Festplatte befanden.

In Bezug auf ddrescue und warum ich davon abrate, habe ich das folgende Gegenmittel:

Das Problem ist, dass ddrescure zu gut darin ist, Fehler zu ignorieren. Ich hatte eine Festplatte, die durchweg mit einer Schreibgeschwindigkeit von etwa 102 GB abfiel, und fing an, bei 238 GB Schreibfehler zu erzeugen. Ich war ziemlich beeindruckt, dass ddrescue weiterhin mit konstanter Geschwindigkeit durch die Festplatte lief und sogar keine Fehler meldete. 17 Stunden später, als es bei den 1300 GB war, als ich zufällig bemerkte, dass die Laufwerksanzeige selbst aufhörte zu blinken. Eine schnelle Überprüfung ergab, dass das gesamte USB-Gehäuse offline gegangen war. Ich zog die Festplatte aus der Ladestation. Ich bemerkte, dass ddrescue nur freudig mitteilte, dass es immer noch fehlerfrei kopiert wurde, selbst mit der Festplatte in meinen Händen. Ich steckte die Festplatte in einen anderen Computer und stellte fest, dass es sich nun um einen Ziegelstein handelte.

Ich beschuldige ddrescue nicht, das Laufwerk zu einem Ziegelstein gemacht zu haben. Die Festplatte war defekt und würde zu einem Ziegel werden. Ich finde nur störend, dass ddrescue nicht einmal die Anzahl der Schreibfehler angibt, die ignoriert werden. Bei dieser Verwendung lässt ddrescue den Eindruck entstehen, dass es unabhängig von allen Schreibfehlern vollständig erfolgreich war. Tatsache ist, dass es nicht möglich gewesen sein sollte, im Abschnitt mit der Verlangsamung mit voller Geschwindigkeit weiterzumachen. Der Grund dafür, dass der Abschnitt langsam war, ist, dass viele Blöcke vom Laufwerk verschoben wurden, was beim Zugriff auf diesen Abschnitt viele Suchanfragen verursachte. Dies ist wahrscheinlich der Zeitpunkt, an dem die Ausgabe von ddrescue fiktiv wurde.


1
"Um sicher zu löschen, müssen Sie denselben Block mehrmals mit zufälligen Daten überschreiben." - Können Sie Ihre Behauptung mit einem Verweis begründen (dh einem von Experten geprüften Artikel, in dem die Wiederherstellung von auf Null gesetzten Daten auf modernen Festplatten dargestellt wird)? Auch die Festplattenfirmware ist eine Blackbox. Woher wissen Sie, dass der sichere Löschbefehl von ATA nicht nur als Schreiben-Null-Muster für jeden Sektor implementiert ist?
Maxschlepzig

Genau das Gegenteil. Es sieht so aus, als ob es im Jahr 2006 eine Reihe von Studien gab, die zeigten, dass bei modernen Laufwerken keine Mehrfachschreibvorgänge mehr erforderlich sind, da moderne Laufwerke die Daten so dicht speichern, dass ein einziger Schreibvorgang genauso effektiv ist.
user6856

1
dd conv=notrunc

hat wahrscheinlich den Trick für mich getan.

Das erwähnte

dd conv=noerror

muss zum lesen fehler sein (laut manpage). Es ist nicht schlecht, beides zu kombinieren.

Mein vollständiger Befehl zum Nullsetzen einer Festplatte sah folgendermaßen aus:

dd iflag=fullblock oflag=direct conv=noerror,notrunc if=/dev/zero of=/dev/sda

In bs=manchen Fällen kann auch das Hinzufügen einer Benutzerdefinition erwünscht sein.


1

Eine schnelle und ausgereifte Methode ist zu verwenden sdd .

Wenn Sie nur alle Inhalte zerstören möchten, rufen Sie Folgendes an:

sdd -inull bs=1m of=/dev/rdsk/cXdXtXp0 -noerror

Verwenden Sie immer die "Raw" -Disketten-Treiber-Schnittstelle.

Wenn Sie eine Festplatte reparieren und so viel wie möglich vom alten Inhalt behalten möchten, rufen Sie Folgendes an:

sdd if=/dev/rdsk/cXdXtXp0 of=/dev/rdsk/cXdXtXp0 bs=1m -noerror

Dadurch werden alle nicht lesbaren Blöcke auf 512-Byte-Ebene durch Nullen ersetzt. Sie können die Anzahl der erneuten Versuche über änderntry=# Die Standardeinstellung ist 2.

Beachten Sie, dass sddist schneller alsdd im Fehlerfall, da zuerst versucht wird, mit der angegebenen Blockgröße zu lesen, und im Fehlerfall mit 512 Bytes gelesen wird. Bei Lesefehlern führt sdd zufällige Suchvorgänge und Dummy-Lesevorgänge durch, um die Firmware des Laufwerks zu beruhigen.

Die erweiterten Funktionen zur Fehlerbehebung wurden in den 1980er Jahren entwickelt, als ich für den zweitgrößten OEM von Sun-Microsystems arbeitete.

Sdd-Quellcode ist in den Schily-Tools enthalten:

http://sourceforge.net/projects/schilytools/files/

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.