Bezpiecznie używaj kart SD, gdy w każdej chwili może dojść do awarii zasilania

10

Pracujemy nad małym wbudowanym systemem Linux (wersja 2.6.35) z niewielkim wewnętrznym urządzeniem NAND dla systemu operacyjnego i aplikacji (250-500 Meg) oraz kartą SD z kartami SDHC SD 8 Gb do przesyłania danych.

Moc urządzenia można odłączyć w dowolnym momencie.

System musi przechowywać dane na kartach SD. Te dane są bardzo ważne ... to cały cel systemu. Systemy są zwykle całkowicie odłączone od dowolnej sieci w zdalnych lokalizacjach, a dane są pobierane przez sneakernet co 4-8 tygodni.

Obecnie mamy po prostu VFAT na kartach SD. Było tak głównie dlatego, że pierwsi klienci testowi mogli łatwo skopiować dane ręcznie na swoje laptopy Win7.

Jednak martwię się teraz, że to tylko kwestia czasu, zanim awaria zasilania w niewłaściwym czasie spowoduje utratę danych.

Jaki jest najlepszy sposób skonfigurowania takiego systemu, aby zapobiec utracie danych? JFFS2 brzmi tak, jak chciałbym, jeśli chodzi o sposób zapisywania danych (a potrzeby w zakresie wydajności wcale nie są wysokie), ale użycie block2mtd wydaje się dość kludgy, itp. Nie jestem również pewien, w jaki sposób będzie współdziałać poziomowanie zużycia karty z tym.

Jak najlepiej to zrobić?

EDYTOWAĆ

Zastanawiam się teraz nad opuszczeniem systemu plików VFAT i jednoczesnym przydzielaniem plików wielkości dziennej, wypełnionych 0xFF, co powinno znacznie ograniczyć narażenie na awarie cyklu zasilania. Mógłbym wtedy dołączyć tylko rekordy w tych wstępnie przygotowanych blokach i mam nadzieję, że karty SD nie są tak głupie, że wymazaliby / zużywały poziom zapisu do regionów 0xFF.

Mogę używać noatime, ale czy istnieje odpowiednik nomtime VFAT, aby zapobiec zapisom w zmodyfikowanym polu czasu? Potrzebuję jakiegoś sposobu, aby w ogóle zapobiec aktualizacjom metadanych, dopóki nie zostanie utworzony plik nowego dnia.

EDYCJA 2

Ktoś na wymianie stosu elektroniki przypomniał mi, że istnieją również dane ECC w NAND, więc nie ma sposobu, aby zapobiec potrzebie kasowania.

Czy więc JFFS2 przez block2mtd byłby odpowiedni w tej sytuacji?

EDYCJA 3

Gorzej niż myślałem. Karty SD, które mam, usuwają bloki danych, nawet jeśli zapisujesz dokładnie taką samą zawartość na dysku. Bloki kasowania mają rozmiar 64 KB i są zbyt duże, aby całkowicie opóźnić zapisywanie. Będę przechowywać do 128 KB danych w pamięci flash NAND (którą mogę kontrolować zachowanie zapisu), w pewnego rodzaju dzienniku, a następnie zapisz bloki 128 KB w pliku wyrównanym do 128 KB na partycji VFAT na karcie SD (w jeśli inne karty SD mają blokady usuwania 128 KB).

darron
źródło
1
„mam nadzieję, że karty SD nie są tak głupie…” <--- ROFLOL. Raczej nie!
derobert,
Dopóki nie znajdziesz pełnego rozwiązania problemu, którego używasz, użyj syncpolecenia po każdym zapisie na karcie SD, zapisuje on bity natychmiast po ich zmianie / utworzeniu bez przechowywania ich w pamięci RAM, dzięki czemu Twoje zmiany będą przynajmniej na karcie i nie przejdzie przez utratę mocy.
Hanan N.
syncprawdopodobnie pogorszyłoby sprawę, ponieważ zwiększa ułamek czasu, gdy metadane są w trakcie aktualizacji.
Ben Voigt,

Odpowiedzi:

5

Sposób na rozwiązanie tego problemu polega na rozwiązaniu problemu „zasilanie może zostać odcięte w dowolnym momencie”. Czy nie można dodać nawet minuty energii baterii?

Alternatywnie, możesz użyć dwóch kart SD. Zapisz dane na jednej karcie, zsynchronizuj, napisz na drugiej. Każdy blok danych wymagałby sumy kontrolnej i numeru bloku, ale nawet przy dość pechowych awariach zasilania jedna z kart powinna mieć rację.

Twoim podstawowym problemem będzie wyrównanie zużycia na kartach SD, które AFAIK zależy od dostawcy karty (a może nawet partii, mogą to zmienić za każdym razem). Prawdopodobnie nie obsługuje prawidłowo przerwy w dostawie prądu. W zależności od tego, co robi, może to nie tylko oznaczać uszkodzenie bloku, do którego piszesz.

  1. Załóżmy banalnie małe karty - 3 (flashowe) bloki. Blok 1 otrzymał więcej zapisów niż 2 lub 3. Wywołam bloki fizyczne numerem, a logiczne bloki A, B, C listem. W tej chwili A = 1, B = 2, C = 3.
  2. Wystawiasz zapis do bloku A. Karta SD jest jak aha! potrzebujemy tutaj wyrównywania zużycia, w przeciwnym razie blok 1 zużyje się przed 2 i 3. Decyduje się zamienić blok 1 i 2.
  3. Odczytuje blok 1 do pozycji RAM i (na karcie SD, a nie systemowej RAM). Aktualizuje część, którą chcesz zmienić.
  4. Odczytuje blok 2 do pozycji RAM ii
  5. Kasuje blok 1
  6. Zapisuje pozycję RAM ii do bloku 1.
  7. Aktualizuje tabelę mapowania, aby powiedzieć B = 1
  8. Usuwa blok 2.
  9. Zapisuje pozycję RAM i do bloku 2.
  10. Aktualizuje tabelę mapowania, aby powiedzieć A = 2

Oczywiście „aktualizacja tabeli mapowania” nie zawsze jest banalna. Kolejność 5–10 może być inna (jeśli wszystkie się zakończą, to nie ma znaczenia, no cóż, wymazywanie musi oczywiście nastąpić przed zapisem). Ale zdarza się awaria zasilania, możesz skończyć z nie tylko uszkodzonym A (jak się spodziewasz), ale także B. Lub, jeśli awaria zasilania wystąpi podczas aktualizacji mapowania, kto wie, jakie uszkodzenie spowoduje.

derobert
źródło
1
Jednostki te muszą żyć w stosunkowo trudnych warunkach przez wiele lat, a po zainstalowaniu zostaną wysłane do różnych krajów, do których wolelibyśmy nie kwalifikować baterii. Prawdopodobnie porzucilibyśmy MMC / SD i zbudowaliśmy własne rozwiązanie NAND-flash przed użyciem baterii.
darron,
Cóż, w naszym przypadku rozwiązanie „napraw moc” może zostać odcięte w dowolnym momencie ”sprowadza się do„ powstrzymania kierowców ciężarówek przed zaśnięciem za kierownicą i wjechania w nasze urządzenia ”. „Wjechała w nie ciężarówka” to właściwie najczęstszy rodzaj awarii.
SF.
1
Minuta mocy baterii nie powinna być potrzebna. Ilość energii potrzebna do bezpiecznego odmontowania karty SD powinna znajdować się w zakresie, który może przechowywać kondensator.
Ben Voigt,
4

Coś podobnego zostało omówione w electronic.stackexchange.com: Jak chronić kartę SD przed nieoczekiwanymi awariami zasilania?

Boczną odpowiedzią, która działa w połączeniu z rozwiązaniami programowymi, jest spojrzenie na sprzęt (na ESE było też pytanie, ale nie mogę go teraz znaleźć; nie chodziło wyłącznie o karty SD, tylko o utratę zasilania przez urządzenia i jak to wykryć i podjąć działania).

Krótko mówiąc: możesz nie mieć zasilania z baterii, ale twój zasilacz ma dość duże kondensatory, aby wygładzić zasilanie. Zasadniczo moc nie tylko gaśnie. Napięcie maleje. Prawdopodobnie istnieje obwód ochronny / obwód zabezpieczający przed przepięciami, który zapewnia sygnał RESET w systemie wbudowanym, gdy napięcie spadnie poniżej pewnego punktu. Płyty główne komputerów PC też je mają i reagują na sygnał „POWEROK” z zasilacza. Oznacza to, że gdy nastąpi zanik zasilania, komputer zostanie mocno zatrzymany na kilka milisekund, zanim napięcie spadnie poniżej bezpiecznych poziomów. W tym czasie urządzenia peryferyjne, takie jak karty SD, są nadal zasilane, ale z komputera nie dochodzą już żadne transakcje.

Jest bardzo prawdopodobne, że karta SD ma wystarczająco dużo czasu, aby dokończyć wszelkie oczekujące transakcje, w tym wyrównywanie zużycia, zanim skończy się jej moc. Poprawa zasilania za pomocą wystarczająco dużego kondensatora lub użycie jednego w pobliżu karty SD może to zapewnić, ale zawsze możesz eksperymentować z platformą taką, jaka jest. Jest całkiem prawdopodobne, że zachowuje moc przez wystarczająco dużo czasu.

Jeśli aspekt sprzętowy problemu nie występuje, możesz rozwiązać problemy tylko z oprogramowaniem. Pomysły deroberta dotyczące używania dwóch kart do redundancji nie są złe, a użycie standardowego systemu plików, takiego jak VFAT, zmniejsza ryzyko pomylenia algorytmów wyrównywania zużycia karty.

W każdym razie może się zdarzyć, że nie będziesz miał aż takiego problemu. Zakładając, że blok na karcie przetrwa 100 zapisów (konserwatywny - ale staraj się uzyskać karty dobrej jakości!), A używając kart 8 GB, będziesz musiał napisać 800 GB, zanim pierwszy blok umrze (oczywiście statystycznie).

Alexios
źródło
Pytanie zaczęło się, ponieważ już zdarzało mi się ogromne uszkodzenie karty SD po zdarzeniach braku zasilania. Właściwie dość często. Może 1 na 20 przypadków awarii zasilania było katastrofalne, a być może 1 na 4 spowodował przynajmniej NIEKTÓRE uszkodzenia. W końcu przeszedłem do przechowywania danych z wewnętrznej pamięci flash NAND i kopiowania do SD o północy (operacja około 1 sekundy). Szukam ulepszeń w przyszłości. Na szynie mam już czapki o wartości 400uF ... najwyraźniej ... chyba nie jest właściwie obsługiwane.
darron
To dość wysoki wskaźnik zapadalności! Czas wziąć sondy oscyloskopowe i zobaczyć, jak to działa, jak myśli. Chociaż jest prawdopodobne, że możesz obejść to w oprogramowaniu, najlepszym sposobem na zużycie energii jest upewnienie się, że nie masz problemów ze sprzętem. Może mógłbyś zabezpieczyć swoje zakłady i zapytać również na stronie electronic.stackexchange.com ?
Alexios
@darron, z jakim rozwiązaniem miałeś problem z pamięcią karty SD? Nadal piszesz do NANDFlash, a potem kopiujesz raz dziennie? Mam projekt z kartą SD jako głównym RFS (bez osobnego NANDFlash) i widzę problemy z uszkodzeniem danych, zarówno z nagłymi awariami zasilania, jak i bez nich.
fred basset
4

Mieliśmy problem z tym, że nasz główny system plików ext2 został uszkodzony w wyniku nieoczekiwanej awarii zasilania. Po pierwsze, uruchamiamy system z mocowaniem root tylko do odczytu. Ponieważ potrzebowaliśmy pamięci do zapisu (ale nie rejestrowaliśmy danych), skonfigurowaliśmy drugą partycję jako zapisywalną. Aby zminimalizować uszkodzenia FS spowodowane niespodziewaną awarią zasilania, stworzyliśmy partycję ext3, nawet jeśli spowoduje to co najmniej dwa razy więcej fizycznych zapisów na karcie. Ta kombinacja (ale przyznaję, że nasze drugie zapisy partycji są rzadsze w porównaniu z rejestratorem danych) wydaje się działać bez problemu. Jak dotąd. (Systemy zainstalowane przez około 30 miesięcy w profesjonalnych obiektach)

Dave Kitchen
źródło
3

Dla bezpieczeństwa danych w środowisku z możliwością odcięcia zasilania i ogólnym bezpieczeństwem danych powinieneś rozważyć jeszcze więcej punktów.

NIE UŻYWAJ ŻADNYCH komórek MLC do przechowywania, tylko SLC ma wystarczający czas retencji danych. Wtedy te karty SLC mogą mieć inteligentne oprogramowanie układowe, niektóre nie mogą w żadnym stanie zostać uszkodzone przez utratę zasilania. Rozpoznają odcięcie zasilania poprzez pomiar i zapewniają, że ostatni blok jest zapisany w całości.

Te karty są droższe i nieco wolniejsze niż komórki MLC. Zobacz dostawców takich jak swissbit dla kart.

Rotesmofa
źródło