Istnieje kilka istniejących tematów dotyczących tego problemu, ale to, czego szukam, jest nieco inne. Mam kartę SD na wbudowanym Linuksie i cierpi na utratę zasilania. Być może będę w stanie zmodyfikować sprzęt w pewnym momencie, poprawnie zamknąć itd. Ale teraz chciałbym znaleźć system plików, który przetrwałby utratę zasilania bez kłopotów. Utrata danych jest dopuszczalna. Wolałbym nie stracić więcej niż plik, który obecnie piszę, ale wolałbym to wszystko stracić niż stawić czoła „niemożności zamontowania”, „poczekać 10 minut fsck” lub „nie mogę utworzyć nowego plik z powodu tego i-węzła coś coś błąd ”. Program MUSI być kontynuowany!
Staram się to zapewnić. Używam komponentów klasy przemysłowej, mam watchdogi sprzętowe, watchdogi programowe, wewnętrzne, zewnętrzne, init restartujący programy, demony stale sprawdzające pamięć, deskryptory plików i tak dalej, mam watchdogi oglądające moje watchdogi, które z kolei są obserwowane przez inne watchdogi ... Ale nie mogę zagwarantować, że karta SD jest w stanie zamontować i działać?
Teraz moim najlepszym założeniem jest użycie JFS na karcie SD, włączenie fsck i fsck.jfs w mojej instalacji. (Dodanie 600kb + zjadanie pamięci RAM i flash. Co jest złe.) I uruchamiaj fsck przy każdym uruchomieniu (może dodając dużo czasu rozruchu. Co jest nieco złe.) To wydaje się trochę smutne.
Czy ktoś wie o lepszym sposobie lub lepszym systemie plików?
AKTUALIZACJA: e2fsprogs-libs (zależność od jfsutils) wydaje się być piekielnie trudny do skompilowania w mojej dystrybucji. Zajrzę do ZFS (nie jest to jednak natywne dla mojej dystrybucji. I wydaje się, że robi wiele, czego nie potrzebuję.)
AKTUALIZACJA 2: Więcej informacji o moim systemie i moich testach: Pamięć na karcie SD jest dodatkowym, opcjonalnym miejscem do przechowywania. Karty SD to microSD klasy przemysłowej 2 Gb-8 Gb. Karta SD jest montowana przez mój rc za pomocą polecenia mount -t. Opcje „noatime”, ale nie „synchronizacja”. Moja dystrybucja to niestandardowy uClinux o smaku urządzeń analogowych, z jądrem 3.10 i zajętym 1.21. Moja podstawowa pamięć to spi flash z jffs2. Nigdy nie miałem z tym żadnych problemów. Nie wiem nawet, czy jest dostępny plik fsck.jffs2. Z drugiej strony Nand flash ... ale to inna historia. Karta SD służy do przechowywania danych pomiarowych. Program „monitor” dołącza wyniki do pliku i ma strategiczne miejsca synchronizacji. Gdy plik przekroczy określony rozmiar, zostanie utworzony nowy. Po osiągnięciu określonej liczby plików najstarszy plik zostanie usunięty. Jeśli bieżący plik pomiarowy zostanie utracony z powodu utraty zasilania, nie będzie to katastrofą. Pliki mają zwykle 50-100 kb, a 1 wynik to zwykle 1 kb. To tylko wstępna faza rozwoju. Nic nie jest naprawione. Po raz pierwszy mam do czynienia z systemami plików innymi niż Flash w systemach osadzonych. (Mam ext4 na moich serwerach x86).
Zacząłem od tłuszczu. Domyślny system plików. (Uznałem, że fabryki mogą mieć powód, aby to wybrać. A jeśli coś działa, nie obchodzi mnie to tak bardzo.) Nigdy nie widziałem problemów z utratą zasilania w moich wbudowanych urządzeniach VATF. Wystąpiły jednak problemy z FAT w WinCE. Jednak gdy mój program „monitorujący” osiągnął 100-200 plików, odmówił utworzenia. Wygląda na to, że FAT ma specjalny problem z limitem plików w katalogu głównym i nieco większy w podkatalogach. Muszę być w stanie stworzyć 500-1000 plików w 1 reż. Więc vfat nie zrobi.
Potem przełączyłem się na ext2. Jednak nie wstawiłem fsck podczas uruchamiania. (Nie wiedziałem, że muszę to zrobić.) W ciągu jednego dnia mój program „monitorujący” nie był w stanie utworzyć większej liczby plików z powodu błędu „coś iodź coś”. Nieszczęście!
Moje obecne rozwiązanie to ext2 z „e2fsck -y” podczas uruchamiania. Jak dotąd wydaje się to obiecujące. Ale e2fsck i cała koncepcja „fsck at startup” mnie dokucza. Sam e2fsck wydaje ponad 350kb mojej podstawowej pamięci flash i pamięci RAM. (Kiedy nie jest uruchomiony.) Co oznacza, że to mój największy program. Jest większy niż zajęty. To prawie rywalizuje z moim jądrem.
Zastanawiałem się nad ext3. Zapisał metadane, które nie zaszkodziłyby. Wątpię jednak, na ile to pomoże. Myślę, że z moimi małymi plikami i kontrolowanymi synchronizacjami powinienem być objęty? Ma uporządkowaną sekwencję zapisu. Oznacza to, że dane są w pewnym stopniu rejestrowane. Może to jednak prowadzić do niedeterministycznych opóźnień. Co jest złe w mojej sytuacji. (Prawdopodobnie nie jest to problem.) Ma również funkcję zaplanowanej synchronizacji. Na przykład. zatwierdzać co 5 sekund. Myślę, że to zakłóca moje własne synchronizacje. Zbyt wiele zapisów jest złe dla kart SD. Nawet przemysłowe. Nie mogę znaleźć żadnej dokumentacji dotyczącej tego, jak to wyłączyć. A ext3 nadal wymaga uruchamiania fsck przy każdym uruchomieniu! Ale ext3 wciąż jest możliwe.
Ext4. Naprawi wiele problemów z wydajnością ext3. Jednak tak naprawdę nie potrzebuję wydajności. Wydaje się, że moja dystrybucja nie ma wbudowanego pliku mkfs.ext4 i fsck.ext4. Być może to nie jest problem. To może jednak. Na przykład. e2progs-libs (zależność od jfsutils) wydaje się mieć wiele problemów z kompilacją.
JFS, XFS, BRFSS. Wszystko obsługiwane przez moje jądro. Obecnie nie jest zawarty w moim skrzynce narzędziowej przestrzeni użytkownika. Wszystko wydaje się być dość dużymi, złożonymi systemami. I wszystkie wydają się wymagać odpowiednika „fsck” przy starcie?
Zastanawiałem się także nad rzuceniem własnego systemu plików: zawsze pisz 2 kopie tabeli plików. Podczas przemierzania wybiera ten z poprawnym CRC i najnowszym numerem sekwencyjnym. Wykonaj 2-etapową sekwencję zapisu. Przydziel tymczasowo, napraw przy zatwierdzeniu. Nie wymaga fsck. Obawiam się, że może to być trochę naiwne.
AKTUALIZACJA3: BTW, natura systemów wbudowanych (przynajmniej tego) polega na tym, że są one autonomiczne, bez opieki, poza zasięgiem i muszą działać przez lata. Przerażają mnie programy takie jak fsck, które mogą wymagać interakcji człowieka.