Jak sprawić, aby dysk nie był odwzorowany w oczekiwaniu na nieczytelne sektory

10

Mam dysk z niektórymi nieczytelnymi sektorami, według smartd. Jaki byłby najłatwiejszy sposób, aby dysk odwzorował je i przestał narzekać smartd?

Dzisiaj dostaję dwa z nich co godzinę:

10 września 23:15:35 hylton smartd [3353]: Urządzenie: / dev / sdc, 1 Obecnie nieczytelne (oczekujące) sektory

System jest systemem x86 z systemem Ubuntu Linux 9.10 (jaunty). Dysk jest częścią grupy LVM. Oto jak smartctl identyfikuje dysk:

Rodzina modeli: rodzina Serial ATA drugiej generacji Western Digital Caviar
Model urządzenia: WDC WD5000AAKS-00TMA0
Numer seryjny: WD-WCAPW4207483
Wersja oprogramowania układowego: 12.01C01
Pojemność użytkownika: 500,107,862,016 bajtów
dkagedal
źródło
2
Ten problem sam się rozwiązał; dysk zaczął narzekać głośniej, więc go wymieniłem.
dkagedal

Odpowiedzi:

15

Oczekiwany nieczytelny sektor to taki, który zwrócił błąd odczytu i który dysk oznaczył do ponownego mapowania przy pierwszej możliwej okazji. Nie można jednak wykonać ponownego mapowania, dopóki nie wydarzy się jedna z dwóch rzeczy:

  1. Sektor został ponownie odczytany
  2. Sektor został przepisany

Do tego czasu sektor pozostaje w toku. Masz więc dwa odpowiednie sposoby radzenia sobie z tym:

  1. Próbuj ponownie przeczytać sektor, dopóki nie odniesiesz sukcesu
  2. Zastąp ten sektor nowymi danymi

Oczywiście (1) nie jest destrukcyjny, więc prawdopodobnie powinieneś spróbować najpierw, chociaż pamiętaj, że jeśli dysk zaczyna poważnie zawodzić, to ciągłe czytanie ze złego obszaru prawdopodobnie spowoduje jego szybszą awarię . Jeśli masz wiele oczekujących sektorów i innych błędów i zależy Ci na danych na dysku, zalecamy wyłączenie go z użycia i użycie doskonałego narzędzia ddrescue do odzyskania jak największej liczby danych. Następnie wyrzuć dysk.

Jeśli dany sektor zawiera dane, na których Ci nie zależy, lub które można przywrócić z kopii zapasowej, zastąpienie go jest prawdopodobnie najszybszym i najprostszym rozwiązaniem. Następnie możesz wyświetlić ponownie przydzielone i oczekujące liczby dla dysku, aby upewnić się, że sektor został załatwiony.

Jak dowiedzieć się, co odpowiada sektorowi w systemie plików? Znalazłem doskonały artykuł na Smartmontools stronie internetowej, tutaj , choć to dość techniczny i jest specyficzny dla ext2 / 3/4 i plików Reiser systemów.

Prostszym podejściem, którego użyłem na jednym z moich własnych dysków (Mac), jest find / -xdev -type f -print0 | xargs -0 ...odczytanie każdego pliku w systemie. Zanotuj oczekującą liczbę przed uruchomieniem tego. Jeśli sektor znajduje się w pliku, otrzymasz komunikat o błędzie z narzędzia, którego użyłeś do odczytu plików (np. Md5sum), wskazujący ścieżkę do niego. Następnie możesz skoncentrować się na ponownym czytaniu tylko tego pliku, dopóki nie zostanie on pomyślnie odczytany. Często rozwiązuje to problem, jeśli jest to rzadko używany plik, który musiał zostać ponownie przeczytany kilka razy. Jeśli błąd zniknie lub nie wystąpią żadne błędy w odczycie wszystkich plików, sprawdź oczekującą liczbę, aby sprawdzić, czy zmniejszyła się. Jeśli tak, problem został rozwiązany przez czytanie.

Jeśli pliku nie można odczytać pomyślnie po wielu próbach (np. 20), musisz zastąpić plik lub blok w pliku, aby umożliwić przemieszczenie sektora przez dysk. Możesz użyć ddrescue na pliku (a nie na partycji), aby zastąpić tylko jeden sektor, kopiując do pliku tymczasowego, a następnie kopiując ponownie. Zauważ, że samo usunięcie pliku w tym momencie jest złym pomysłem, ponieważ zły sektor przejdzie na darmową listę, gdzie będzie trudniej go znaleźć. Całkowite nadpisanie go również jest złe, ponieważ sektory ponownie przejdą na darmową listę. Musisz przepisać istniejące bloki. notruncOpcja ddjest jednym ze sposobów, aby to zrobić.

Jeśli nie wystąpią żadne błędy, a liczba oczekujących operacji nie spadła, sektor musi znajdować się na liście swobodnej lub w części infrastruktury systemu plików (np. Tabela i-węzłów). Możesz spróbować wypełnić całe wolne miejsce cat /dev/zero >tempfile, a następnie sprawdzić liczbę oczekujących. Jeśli spadnie, problem znajdował się na liście darmowych i teraz zniknął.

Jeśli sektor znajduje się w infrastrukturze, masz poważniejszy problem i prawdopodobnie wystąpią błędy po prostu przechodząc przez drzewo katalogów. Myślę, że w tej sytuacji jedynym sensownym rozwiązaniem jest sformatowanie dysku, opcjonalnie użycie ddrescue do odzyskania danych, jeśli to konieczne.

Uważnie obserwuj napęd. Realokacja sektorów jest bardzo dobrym kanarkiem w kopalni węgla , potencjalnie dając wczesne ostrzeżenie o awarii napędu. Podejmując wczesne działania, możesz zapobiec katastrofalnej i bardzo bolesnej osuwisk. Nie sugeruję, że kilka realokacji sektorów wskazuje, że należy odrzucić dysk. Wszystkie współczesne dyski wymagają pewnej realokacji. Jeśli jednak dysk nie jest bardzo stary (<1 rok) lub otrzymujesz częste nowe alokacje (> 1 / miesiąc), zalecamy jak najszybsze jego zastąpienie.

Nie mam dowodów empirycznych, aby to udowodnić, ale moje doświadczenie sugeruje, że problemy z dyskiem można zmniejszyć, od czasu do czasu czytając cały dysk, albo ddz dysku surowego, albo czytając każdy używany plik find. Prawie wszystkie problemy z dyskami, których doświadczyłem w ciągu ostatnich kilku lat, pojawiły się najpierw w rzadko używanych plikach lub na maszynach, które nie są często używane. Ma to również heurystyczny sens, ponieważ jeśli sektor jest często odczytywany ponownie, napęd ma szansę na przeniesienie go, gdy po raz pierwszy wykryje niewielki problem z tym sektorem, zamiast czekać, aż sektor będzie całkowicie nieczytelny. Dysk nie jest w stanie nic zrobić z sektorem, chyba że host w jakiś sposób uzyska do niego dostęp, czytając go lub pisząc lub przeprowadzając jeden z testów SMART.

Chciałbym eksperymentować z pomysłem codziennej lub cotygodniowej pracy crona, która odczytuje cały dysk. Obecnie używam macierzy RAID „biednego człowieka”, w której mam drugi dysk twardy w komputerze i co wieczór tworzę kopię zapasową dysku głównego. Pod pewnymi względami jest to w rzeczywistości lepsze niż dublowanie RAID, ponieważ jeśli pomyłam i usunę plik przez pomyłkę, mogę natychmiast pobrać wczorajszą wersję z dysku kopii zapasowej. Z drugiej strony uważam, że sprzętowy kontroler RAID wykonuje wiele dobrej pracy w tle, monitorując, zgłaszając i naprawiając problemy z dyskami w miarę ich pojawiania się. Mój obecny skrypt tworzenia kopii zapasowych używa, rsyncaby uniknąć kopiowania danych, które nie uległy zmianie, ale ze względu na potrzebę ponownego przeczytania wszystkich sektorów może lepiej byłoby skopiować wszystko lub mieć osobny skrypt, który co tydzień odczytuje cały dysk.

Neil Mayhew
źródło
2
Jeśli wykonujesz kopie zapasowe (rsynchronizacja na dysk wewnętrzny nie ma znaczenia;)), wówczas wszystkie twoje dane są (ponownie) odczytywane w określonych odstępach czasu (w zależności od twojego harmonogramu tworzenia kopii zapasowych z przyrostem / przyrostem). RAID lub rsync nie zastępują kopii zapasowych. A przy okazji „wierzę”, że masz zbyt dużą wiarę w dostawców sprzętu RAID. ;)
maxschlepzig
@maxschlepzig: Masz rację. Mam również osobny system tworzenia kopii zapasowych. Jednak z mojego doświadczenia wynika, że ​​prawdopodobieństwo utraty danych z powodu awarii dysku znacznie przewyższa wszystkie inne ryzyka łącznie (kradzież, pożar itp.). Współczesne dyski twarde mają tak niską niezawodność, że w dzisiejszych czasach jestem całkowicie szalony. Więc mój drugi wewnętrzny napęd jest główną częścią mojej strategii.
Neil Mayhew
Przeczytałem i ponownie przeczytałem zawartość dysku, dd if=/dev/sda ...a sektory nadal oczekują, jakiś pomysł, dlaczego?
dmansfield
@dmansfield, jeśli nie wystąpiły żadne błędy, nie jestem pewien, dlaczego. Zauważyłem, że tylko wartość surowa jest dokładna w inteligentnym wyjściu, więc jeśli patrzysz tylko na wartość „gotową”, być może nie masz żadnych oczekujących sektorów.
Neil Mayhew
1

Użyj oprogramowania Data Lifeguard Diagnostic for DOS (bootowalnego CD) dostępnego na stronie Western Digital

AlexD
źródło
1
  1. Utwórz kopię zapasową danych
  2. Usuń to urządzenie z grupy LVM
  3. dd if=/dev/zero of=/dev/sdc bs=4k- spowoduje to usunięcie wszystkich danych na/dev/sdc
  4. Uwzględnij to ponownie w grupie LVM
  5. Przywróć kopię zapasową
maxschlepzig
źródło
3
0. Przygotuj kopię zapasową. :-)
Steven D
Jest to jednak błąd odczytu, więc czy nie wystarczy po prostu odczytać wszystkie sektory?
dkagedal
1
@dkagedal: Nie, oprogramowanie HD wykryło już, że nie może odczytać tego jednego sektora. Nie ma sposobu, aby go odzyskać (sam, prócz być może ponowić próbę, spróbować ponownie i mieć szczęście w pewnym momencie ... mam nadzieję, że nie są to uszkodzone dane, a następnie zwrócone), a tym samym ustawia ten błąd SMART. Ale jeśli oprogramowanie sprzętowe wykryje zapis w tym konkretnym sektorze, mapuje ten sektor z dala (i już go nie używa), a zamiast tego mapuje zapasowy (działający) sektor na ten adres.
maxschlepzig
@dkagedal: Czasami tylko jeden lub dwa dodatkowe odczyty przywrócą sektor. Innym razem nic go nie przywróci. Ponadto dysk decyduje wewnętrznie, czy ponownie mapować sektor, czy użyć go ponownie, na podstawie ważności pierwotnego błędu i czy może go z powodzeniem odczytać po zapisaniu w nim. Jedynym sposobem, aby to stwierdzić, jest sprawdzenie przeniesionej liczby dysków. Uważam, że dyski używają dość obszernego sumowania, aby mieć pewność, że podczas odczytu danych nie zostaną one uszkodzone, dzięki czemu można mieć pewność, że sektor nie został ponownie przydzielony.
Neil Mayhew