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).
źródło
sync
polecenia 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.sync
prawdopodobnie pogorszyłoby sprawę, ponieważ zwiększa ułamek czasu, gdy metadane są w trakcie aktualizacji.Odpowiedzi:
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.
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.
źródło
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).
źródło
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)
źródło
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.
źródło