Jak zignorować błędy zapisu podczas zerowania dysku?


19

Powiedz, że chcesz wyzerować uszkodzony dysk twardy. Chcesz zastąpić jak najwięcej zerami. Czego nie chcesz: proces przerywa się przy pierwszym błędzie zapisu. Jak to zrobić?

AFAICS, zwykły ddzapewnia tylko opcję ignorowania błędów odczytu. Tak więc coś w tym rodzaju

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

nie wystarcza.

ddrescue wydaje się być lepszym w ignorowaniu błędów - ale jaka byłaby optymalna linia poleceń?

Moja próba z GNU ddrescue:

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

1
dd conv=noerrormoże być rozszerzeniem GNU, nie jestem pewien. W każdym razie powinno wystarczyć. Warto jednak przyjrzeć się odpowiedzi SATA Tell-the-Drive-to-Erass-Era na wymazanie całych dysków.
Peter Cordes,

1
@PeterCordes, strona podręcznika GNU dddokumentów noerrorjako „kontynuuj po błędach odczytu” ...
maxschlepzig

1
dd conv=noerrorjest standardem POSIX, ale może być bardzo powolny
schily

2
dd conv=noerrormusi być do odczytu błędów (według strony podręcznika), a nie do pisania błędów. Nie ma nic złego w połączeniu go conv=notrunc, co pomogło mi zignorować błędy zapisu. unix.stackexchange.com/a/229379/4319
imz - Ivan Zakharyaschev

Prosta operacja zapisu na HDD, taka jak używanie dd if=/dev/zero of=/dev/sdX, nie wykona odczytów dysku. Jak myślisz, dlaczego polecenie dd „nie wystarczy” ? Jakie „błędy” występują?
trociny

Odpowiedzi:


12

Wolę do tego badblocksw trybie niszczenia. Pisze, kontynuuje to, gdy napotyka błędy, a na koniec informuje, gdzie były te błędy, a te informacje mogą pomóc ci zdecydować, co dalej (Czy to się połączy?).

# 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)

I lista bloków:

# head badblocks.txt
2097000
2097001
2097002
2097003
2097004

A co pozostało na dysku:

# 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.|

Uwaga: to nie są tak naprawdę losowe dane - wzorzec jest powtarzalny, więc jeśli pominiesz 1MiB, zobaczysz ponownie ten sam wynik.

Spróbuje również zweryfikować, odczytując dane z powrotem, więc jeśli masz dysk, który twierdzi, że zapisywanie zakończyło się powodzeniem, ale zwraca nieprawidłowe dane podczas odczytu, znajdzie również te błędy. (Upewnij się, że żadne inne procesy nie zapisują na dysk podczas działania badblocks, aby uniknąć fałszywych alarmów).

Oczywiście w przypadku mocno uszkodzonego dysku może to potrwać zbyt długo: nie ma kodu, który spowodowałby, że pomijałby całkowicie uszkodzone obszary. Jedynym sposobem na osiągnięcie tego badblocksbyłoby użycie znacznie większego rozmiaru bloku.

Nie jestem pewien, czy ddrescueto się poprawi; ma to zrobić w drugą stronę (jak najszybciej odzyskać jak najwięcej danych). Możesz to zrobić ręcznie dla dd / ddrescue / badblocks, określając pierwszy / ostatni blok ...


1
Jeśli używam -t randomlub -t 0- czy złe bloki, to po prostu wykonaj jedno przejście zapisu? Patrząc na stronę man - wygląda na to, że bez -tniej robi 4 przejścia (dla „0xaa, 0x55, 0xff, 0x00”).
maxschlepzig

2
Robi jedno przejście dla każdego -t, co podajesz w wierszu poleceń. Domyślnie 4 przejścia, jak mówisz.
frostschutz

13

Jeśli dysk nie jest podłączony przez USB, rozważ użycie hdparm(wersja> 9.31), aby wykonać bezpieczne wymazywanie dysku ATA . To polecenie powoduje, że oprogramowanie układowe napędu czyści zawartość dysku, w tym uszkodzone bloki.

Ostrzeżenie: Użyj poprawnej litery dysku - pokazałem /dev/sdXjako przykład - nie kopiuj / wklej.

Najpierw sprawdź, czy rozumie polecenia ATA (większość dysków wyprodukowanych w ciągu ostatniej dekady lub więcej powinna):

$ 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.

Ostatnie dwa wiersze wyciągu wskazują, że jest on obsługiwany.

Dlatego dodaj hasło do dysku (najwyraźniej wymaganie):

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

i usuń:

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

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

Więcej informacji na temat tej procedury można znaleźć tutaj .


Może to działać przez USB, jeśli masz szczęście, a Twój mostek USB <-> SATA może przechodzić przez niestandardowe polecenia SATA (a sterownik Linux + hdparm wie, jak to zrobić w tym modelu). Również do pisania przykładów /dev/sdXjest dobre, ponieważ jeśli ktoś pominie wystąpienie tego podczas wklejania i dostosowywania, nie będzie problemu.
Peter Cordes,

@Peter Cordes - Chyba że masz 24 dyski ... Nie, głuptasie! Dzięki, zmieniłem go na sdX, który nauczy mnie przyspieszać odpowiedź!
garethTheRed


Rzeczywiście pokazuje sporo ostrzeżeń! Mogę tylko powiedzieć, że zadziałało to dla mnie bez żadnych problemów.
garethTheRed

2

Widzę tutaj cztery praktyczne odpowiedzi:

  1. hdparmMetoda wysłane przez garethTheRed jest prawdopodobnie najlepiej, jeśli są podłączone bezpośrednio do komputera. Najwyraźniej jednak, jeśli spróbujesz podłączyć go przez USB, możesz zepsuć dysk. Jeśli robisz to dla dysku, który zamierzasz się pozbyć, może to być dobra rzecz. Prawdopodobnie jednak chcesz zabezpieczyć usuwanie przed odrzuceniem.

  2. Technika zgłoszona przez imza - Iwana Zakharyascheva będzie działać, ale może być bardzo powolna. Sugerowałbym, jeśli nie chcesz, aby dane można było odzyskać, użyj /dev/urandomzamiast /dev/zero; na przykład,

    dd iflag=fullblock oflag=direct conv=noerror,notrunc if=/dev/urandom of=/dev/sdX
    
  3. Odradzałbym następujące. Aby uzyskać coś szybszego, który robi to samo, skorzystaj z techniki zgłoszonej przez maxschlepzig (w pytaniu):

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

    Będzie to szybsze niż ddpolecenie, ale nie tak szybkie jak hdparmpolecenie. Zobacz poniżej, dlaczego nie polecam tego ...

  4. badblocksKomenda będzie również działać, ale nie można losowe dane w ten sposób, i znów będzie bardzo powolny.

Na koniec byłbym niedoceniony, gdybym nie wskazał najważniejszego powodu, dla którego ludzie chcą całkowicie wymazać dysk, ponieważ zamierzają go wyrzucić. W takim przypadku, jeśli jeszcze tego nie zrobiłeś, możesz najpierw spróbować odzyskać dysk. Jeśli odczytasz blok i zwróci błąd we / wy, to następnym razem, gdy napiszesz w tym samym bloku, dysk spróbuje ponownie przydzielić inny blok z listy rezerwowej. Gdy lista rezerwowa zostanie zapełniona, podczas zapisywania wystąpią błędy we / wy. Właśnie wtedy naprawdę powinieneś wyrzucić dysk.

Możesz więc zrobić coś prostego, na przykład:

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

A następnie, aby przepisać złe bloki, po prostu coś takiego:

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

Jeśli to polecenie działa, jeśli jesteś odważny, możesz sformatować dysk i użyć go ponownie.

Alternatywnie możesz uruchomić badblockspolecenie na dysku dwa razy. Za drugim razem nie powinien zgłaszać żadnych złych bloków ...

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

To potrwa dłużej, ale jest bardziej niezawodne.

Warto również zauważyć, że żadna z technik tak naprawdę nie wykonuje bezpiecznego wymazywania, z wyjątkiem hdparmpolecenia. Pamiętasz te wszystkie złe klocki? Wciąż mają one w części nienaruszone niektóre z oryginalnych danych. Ekspert ds. Odzyskiwania danych może uzyskać do nich dostęp, aby zobaczyć niewielką część tego, co poprzednio znajdowało się na dysku twardym.

Jeśli chodzi o ddrescue i dlaczego odradzam to, mam następujące antidotum:

Problem polega na tym, że zbyt dobre będzie ignorowanie błędów. Miałem dysk twardy, który konsekwentnie z dd spadał prędkość zapisu na poziomie około 102 GB i zacząłem generować błędy zapisu na poziomie 238 GB. Byłem pod dużym wrażeniem, że ddrescue nadal krąży po dysku ze stałą prędkością, nawet nie zgłaszając żadnych błędów. 17 godzin później, kiedy było na 1300 GB, kiedy zauważyłem, że samo światło dysku przestało migać. Szybka kontrola wykazała, że ​​cała obudowa USB przeszła w tryb offline. Wyciągnąłem dysk z bazy. Zauważyłem, że ddrescue z radością zgłosił, że nadal kopiuje bez błędów, nawet z dyskiem w moich rękach. Podłączyłem dysk do innej maszyny i stwierdziłem, że jest to teraz cegła.

Nie winię ddrescue za to, że dysk stał się cegłą. Napęd zawodził i stał się cegłą. Po prostu uważam, że niepokojący ddrescue nawet nie podaje liczby błędów, ile błędów zapisu ignoruje. W tym zastosowaniu ddrescue pozostawia wrażenie, że zakończyło się pełnym sukcesem, niezależnie od wszystkich błędów zapisu. Faktem jest, że nie powinno być w stanie kontynuować z pełną prędkością na odcinku ze spowolnieniem. Powodem, dla którego sekcja była powolna, jest to, że dysk przeniósł wiele bloków, powodując wiele poszukiwań podczas uzyskiwania dostępu do tej sekcji. Jest to prawdopodobnie punkt, w którym wyniki ddrescue stały się fikcyjne.


1
„Aby bezpiecznie usunąć, musisz wielokrotnie zastąpić ten sam blok losowymi danymi”. - czy możesz uzasadnić swoje roszczenie referencją (tj. recenzowanym artykułem, który pokazuje odzyskiwanie zerowanych danych na nowoczesnych dyskach twardych)? Ponadto oprogramowanie układowe dysku twardego to czarna skrzynka. Skąd wiesz, że polecenie bezpiecznego usuwania ATA nie jest tylko zaimplementowane jako wzór zapisu do zera dla każdego sektora?
maxschlepzig

Tylko na odwrót. Wygląda na to, że w 2006 r. Przeprowadzono szereg badań, które wykazały, że wiele zapisów starej szkoły nie jest już wymagane w przypadku nowoczesnych dysków, ponieważ nowoczesne dyski przechowują dane tak gęsto, że pojedynczy zapis jest równie skuteczny.
user6856,

1
dd conv=notrunc

prawdopodobnie zrobił dla mnie lewę.

Wspomniane

dd conv=noerror

musi być do odczytu błędów (według strony podręcznika). Nie ma nic złego w połączeniu tych dwóch.

Moje pełne polecenie zerowania dysku wyglądało następująco:

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

W bs=niektórych przypadkach może być potrzebne dodanie niestandardowego .


1

Jest to szybka i dojrzała metoda sdd.

Jeśli chcesz zniszczyć całą zawartość, zadzwoń:

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

Zawsze używaj „surowego” interfejsu sterownika dysku.

Jeśli chcesz naprawić dysk i zachować jak najwięcej starej zawartości, zadzwoń:

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

Spowoduje to zastąpienie wszystkich nieczytelnych bloków zerami na poziomie 512 bajtów. Możesz zmodyfikować liczbę ponownych prób poprzez try=#, domyślnie 2.

Zauważ, że sddjest szybszy niż ddw przypadku błędów, ponieważ najpierw próbuje odczytać dostarczony rozmiar bloku, aw przypadku błędów odczytuje 512 bajtów. Jeśli wystąpią błędy odczytu, sdd dokonuje losowych prób, a atrapa czyta, aby uspokoić oprogramowanie układowe napędu.

Funkcje ulepszonego odzyskiwania po błędzie zostały opracowane w latach 80., kiedy pracowałem dla drugiego największego producenta OEM Sun-Microsystems.

Kod źródłowy SDD jest zawarty w narzędziach Schily:

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.