Czy nieoczekiwana utrata zasilania może zaszkodzić instalacji systemu Linux?

22

Tworzę aplikację na wbudowanej płycie Linux (uruchamia Debiana) np. Raspberry Pi, Beagle Board / Bone lub olimex. Płytki działają w środowisku, w którym nieoczekiwanie odcięto elektryczność (umieszczenie zasilacza itp. Jest bardzo skomplikowane) i zdarzałoby się to codziennie kilka razy. Zastanawiam się, czy nieoczekiwane przerwy w dostawie prądu spowodowałyby awarię / problem w systemie operacyjnym Linux? Jeśli jest to coś, o co powinienem się martwić, co sugerowałbyś, aby zapobiec uszkodzeniom systemu operacyjnego w wyniku nieoczekiwanych przerw w dostawie prądu?

PS. Aplikacja musi zapisać niektóre dane na nośniku pamięci (karcie SD), myślę, że nie byłoby odpowiednie montowanie ich jako tylko do odczytu.

Przełom
źródło
1
Trzymaj się z dala od ext2 (użyj ext3 lub wyższej) w systemach plików, które często modyfikujesz, i powinieneś być w większości w porządku.
LawrenceC
O ile nie jesteś bardzo ostrożny w określaniu kart SD, karty nie gwarantują niczego, jeśli niespodziewanie odetniesz zasilanie. Karta może być w trakcie ruchu wyrównywania zużycia, co prowadzi do dziwnej, nieoczekiwanej korupcji - która może nawet znajdować się w innej partycji!
derobert
Nie wiem dokładnie, jak to zrobić, ale możesz rozważyć wykorzystanie transakcji kluczowych aplikacji. W ten sposób możesz mieć swój aktualny plik i kopię zapasową. Zastosujesz transakcje do bieżącego pliku, a jeśli to się nie powiedzie, możesz przywrócić bieżący plik z kopii zapasowej i ponownie zastosować transakcje. Jeśli przełączasz się między bieżącym a tworzeniem kopii zapasowej za pomocą dowiązań symbolicznych lub zamiany nazw plików, może się to zdarzyć bardzo szybko, ze znacznie mniejszym prawdopodobieństwem błędu niż w przypadku kopiowania. Po udanej aktualizacji bieżący plik staje się kopią zapasową, a kopia bieżąca.
Joe
Nieprzerwany. To prawie działa. Nowy bieżący plik wymagałby również zastosowania do niego transakcji wymagających podwójnego przetworzenia transakcji, więc jestem pewien, że jest lepszy sposób. W każdym razie może być znacznie szybsze i bezpieczniejsze niż kopiowanie całego pliku, jeśli jest duży.
Joe

Odpowiedzi:

14

Nieoczekiwane przerwy w zasilaniu mogą spowodować uszkodzenie danych systemu plików - np. Jeśli proces rozpoczął zapis do pliku, ale jeszcze go nie zakończył, plik może zostać zapisany tylko w połowie. A teraz wyobraź sobie, że nastąpi przerwa w zasilaniu, gdy będziesz w połowie aktualizacji jądra ...

Jak napisał L0b0, pomoże system plików z kronikowaniem, ponieważ będzie on w stanie śledzić, co faktycznie zostało zrobione. W uzupełnieniu do informacji wikipedia że l0b0 związane, może być zainteresowany w /unix/12699/do-journaling-filesystems-guarantee-against-corruption-after-a-power-failure także .

Jako programista oczywiście musisz dokładnie przemyśleć, jak radzić sobie z zapisywaniem do plików, aby stało się procesem atomowym (tj. Jest to w pełni wykonane lub wcale, ale nigdy w połowie wykonane). To dość złożony problem.

Jenny D.
źródło
10
Ogólnym procesem w kodzie ochrony przed zakłóceniami zapisu powodującymi uszkodzenie pliku jest to, że zamiast bezpośrednio modyfikować plik.nazwa, zamiast tego piszesz całkowicie nowy plik nazwa_pliku.nazwa, a następnie używasz komend delete / rename w celu zastąpienia starej wersji plikiem nowy. Musisz dodać kod czyszczenia, aby odzyskać po przerwaniu na każdym kroku; ale takie podejście zawsze pozostawia dobrą kopię pliku na dysku. Może to wpłynąć na Twój projekt, ponieważ źle aktualizuje pojedyncze duże pliki lub często wprowadza zmiany w jednym pliku.
Dan Neely
11

Aby zminimalizować możliwość uszkodzenia systemu operacyjnego, najlepiej jest mieć oddzielne partycje „systemowe” i „dane” na karcie SD. W ten sposób możesz zamontować partycję „systemową” tylko do odczytu i użyć wysoce odpornego FS na partycji „danych”.

Ponadto większość z tych płyt ma bardzo niskie zapotrzebowanie na moc, dlatego możliwe jest tworzenie kopii zapasowej baterii. Płytę „LiPo rider” dla Raspberry Pi można wykorzystać jako podstawowy zasilacz UPS zapewniający czyste wyłączenie po utracie zasilania.

Stu
źródło
5

To zależy od tego

  1. czy korzystasz z systemu plików kronikowania i
  2. jak dobrze aplikacje są w stanie poradzić sobie z przerwanym przetwarzaniem.

Rozważmy na przykład aplikację, która przetwarza plik i zapisuje wyniki podczas ich obliczania (jedna linia wyjściowa na linię wejściową) do innego pliku. Jeśli zasilanie zostanie odcięte podczas przetwarzania, a ta sama aplikacja zostanie uruchomiona po ponownym uruchomieniu, nie może po prostu ponownie uruchomić przetwarzania od początku pliku wejściowego - oznaczałoby to, że plik wyjściowy zawierałby duplikaty informacji.

Może być bardzo trudno powiedzieć coś konkretnego o hipotetycznym złożonym systemie, ale wydaje się, że najbardziej stabilne oprogramowanie Linux potrafi całkiem dobrze poradzić sobie z awariami.

l0b0
źródło
1

Ponieważ nikt nie wspomniał o żadnym konkretnym systemie plików: bardziej nowoczesne systemy plików (ext3, ext4, NTFS) są w stanie obsługiwać awarie znacznie lepiej niż starsze systemy plików (ext2, ext, fat32) z powodu kronikowania .

Zakładając, że dysk twardy nie ulega awarii i nie kłamie , całkowita awaria zasilania nie powinna uszkodzić systemu plików. Poszczególne zapisywane pliki mogą być nadal uszkodzone, więc jeśli byłeś w trakcie aktualizacji systemu operacyjnego, gdy wystąpiła awaria zasilania, nadal można go obniżyć.

BlueRaja - Danny Pflughoeft
źródło