1. Pamięć flash
Czy zależy to od typu dysku (tradycyjne dyski twarde vs. dyski półprzewodnikowe) lub jakiejkolwiek innej zmiennej, o której być może nie wiem? Czy to się dzieje (jeśli tak się dzieje) tylko w systemie Linux, czy jest to obecne w innych systemach operacyjnych?
Gdy masz wybór, nie powinieneś pozwolić, aby pamięć flash przestała działać bez czystego wyłączenia.
W przypadku taniego magazynu, takiego jak karty SD, można spodziewać się utraty całych bloków wymazywania (kilka razy większych niż 4KB), utraty danych, które mogłyby należeć do różnych plików lub istotnych struktur systemu plików.
Niektóre drogie dyski SSD mogą twierdzić, że oferują lepsze gwarancje w przypadku awarii zasilania. Jednak testy innych firm sugerują, że wiele drogich dysków SSD tego nie robi. Warstwa, która ponownie mapuje bloki w celu „wyrównywania zużycia”, jest złożona i zastrzeżona. Możliwe awarie obejmują utratę wszystkich danych na dysku.
Stosując nasze ramy testowe, testujemy 17 towarowych dysków SSD od sześciu różnych dostawców, używając łącznie ponad trzech tysięcy cykli wtrysku błędów. Nasze wyniki eksperymentalne ujawniają, że 14 z 17 testowanych urządzeń SSD wykazuje zaskakujące zachowania w przypadku awarii zasilania, w tym uszkodzenie bitu, odcięte zapisy, niemożliwe do zapisania zapisy, uszkodzenie metadanych i całkowita awaria urządzenia.
2017: https://dl.acm.org/citation.cfm?id=2992782&preflayout=flat
2013: https://www.usenix.org/system/files/conference/fast13/fast13-final80.pdf?wptouch_preview_theme=enabled
2. Wirujące dyski twarde
Wirujące dyski twarde mają różne właściwości. Ze względów bezpieczeństwa i prostoty zalecam założenie, że mają one taką samą praktyczną niepewność jak pamięć flash.
Chyba że masz konkretne dowody, których wyraźnie nie masz. Nie mam danych porównawczych dotyczących obracania dysków twardych.
Dysk twardy może pozostawić jeden niekompletnie zapisany sektor ze złą sumą kontrolną, co w późniejszym czasie spowoduje błąd odczytu. Ogólnie mówiąc, ten tryb awarii dysków twardych jest całkowicie oczekiwany; natywne systemy plików Linux zostały zaprojektowane z myślą o tym. Mają one na celu zachowanie kontraktu fsync()
w obliczu tego rodzaju awarii zasilania. (Naprawdę chcielibyśmy, aby gwarantowano to na dyskach SSD).
Jednak nie jestem pewien, czy systemy plików Linux osiągają to we wszystkich przypadkach, czy też jest to w ogóle możliwe.
Następny rozruch po tym typie błędu może wymagać naprawy systemu plików. W systemie Linux możliwe jest, że naprawa systemu plików zada kilka pytań, których nie rozumiesz, gdzie możesz nacisnąć tylko Y i mieć nadzieję, że to się rozwiąże.
2.1 Jeśli nie wiesz, czym jest umowa fsync ()
Umowa fsync () jest źródłem zarówno dobrych, jak i złych wiadomości. Najpierw musisz zrozumieć dobre wieści.
Dobra wiadomość: fsync()
jest dobrze udokumentowana jako poprawny sposób zapisywania danych pliku, np. Po naciśnięciu przycisku „zapisz”. I jest szeroko rozumiane, że np. Edytory tekstu muszą zamieniać istniejące pliki za pomocą atomu rename()
. Ma to na celu upewnienie się, że zawsze zachowujesz stary plik lub otrzymujesz nowy plik (który był fsync()
edytowany przed zmianą nazwy). Nie chcesz pozostać z częściowo zapisaną wersją nowego pliku.
Zła wiadomość: przez wiele lat wywołanie fsync () w najpopularniejszym systemie plików Linuxa mogło skutecznie zawiesić cały system na dziesiątki sekund. Ponieważ aplikacje nie mogą nic na to poradzić, bardzo często optymistycznie używa się rename () bez fsync (), co wydaje się względnie niezawodne w tym systemie plików.
Dlatego istnieją aplikacje, które nie używają poprawnie fsync ().
Następna wersja tego systemu plików na ogół unikała zawieszenia fsync () - w tym samym czasie, gdy zaczęła polegać na prawidłowym użyciu fsync ().
To wszystko jest całkiem złe. Zrozumienia tej historii prawdopodobnie nie pomaga lekceważący ton i inwolucja, z której korzystało wielu sprzecznych twórców jądra.
Obecna rozdzielczość to obecny najpopularniejszy system plików Linux domyślnie obsługuje wzorzec rename () bez wymagania fsync ()implementuje „kompatybilność błędów dla błędów” z poprzednią wersją. Można to wyłączyć za pomocą opcji montowania noauto_da_alloc
.
To nie jest pełna ochrona. Zasadniczo opróżnia oczekujące operacje we / wy w czasie zmiany nazwy (), ale nie czeka na zakończenie operacji we / wy przed zmianą nazwy. Jest to jednak znacznie lepsze niż np. 60-sekundowe okno zagrożenia! Zobacz także odpowiedź na Które systemy plików wymagają fsync () w celu zapewnienia bezpieczeństwa w razie awarii podczas zamiany istniejącego pliku na rename ()?
Niektóre mniej popularne systemy plików nie zapewniają ochrony. XFS odmawia tego. I UBIFS nie wdrożył go albo, widocznie to może być zaakceptowane, ale wymaga dużo pracy, aby to możliwe. Ta sama strona wskazuje, że UBIFS ma kilka innych problemów „TODO” w zakresie integralności danych, w tym utraty zasilania. UBIFS to system plików używany bezpośrednio w pamięci flash. Wyobrażam sobie, że niektóre trudności, o których wspomina UBIFS z pamięcią flash, mogą być związane z błędami SSD.