Używam małej uClibc
i busybox
opartą systemu osadzonego na urządzeniu x86. Korzystam z initramfs, ale również instaluję ext3
katalog niestandardowy na kompaktowym urządzeniu flash w trybie IDE, którego używam do przechowywania trwałych danych rejestrowania pomiarów utworzonych przez niestandardową pisaną aplikację c ++. Wybrałem ext3
system plików, ponieważ jest on zalecany ze względu na bezpieczeństwo przed utratą zasilania podczas korzystania z napędów CF w trybie IDE w kilku książkach, które przeczytałem ( Budowanie systemów Linux wbudowanych przez Karima Yaghmoura i Embedded Linux Primer autorstwa Christophera Hallinana). Jest to szczególnie ważne, a dane mają kluczowe znaczenie.
Jednak ze względu na niektóre komentarze w moim poprzednim pytaniu Mylę się z tym, jak przywrócić uszkodzone pliki ext3, jeśli wystąpi przerwa w zasilaniu podczas zapisu pliku , wydaje się, że w rzeczywistości ten system plików nie oferuje gwarancji bezpieczeństwa przed uszkodzeniem danych z powodu zasilania utrata. Więc chciałbym wiedzieć, czy
- Czy to
ext3
właściwie najlepszy wybór dla tej konfiguracji? - Czy utrata zasilania podczas operacji zapisu na dysku powoduje jedynie uszkodzenie części danych, które okresowo dołączam do pliku, czy może uszkodzić cały plik?
- Czy dane, które nie są zapisywane w momencie utraty zasilania, są całkowicie bezpieczne? W szczególności, czy istnieje ryzyko, że mój
initramfs.cpio
plik może zostać uszkodzony również? - Czy jest jakaś metoda, której mogę użyć w kodzie aplikacji do ochrony danych (tj. Utworzenie dodatkowej partycji i zapisanie moich danych do obrazów lustrzanych, aby zawsze były 2 kopie) - szybkość nie jest prawdziwym problemem dla mojej aplikacji tak kosztowne operacje kopiowania są dopuszczalne.
Widziałem i czytałem odpowiedzi na to pokrewne pytanie: Czy systemy plików kronikowania gwarantują zapobieganie uszkodzeniom po awarii zasilania? , ale nie obejmuje niektórych rzeczy, które mnie dezorientują.
Zdaję sobie sprawę, że zadaję wiele pytań, ale wydaje się, że pomimo przeczytania dużej ilości materiałów, zasadniczo nie zrozumiałem ryzyka dla moich danych w przypadku utraty zasilania.
źródło
Wydaje mi się, że to, co implementacja systemu plików może osiągnąć w przypadku nagłej utraty zasilania, jest ograniczone - w rzeczywistości jest to sprzężenie ze sprzętem, więc co dzieje się między czasem, w którym wysyła dane / instrukcje do sprzętu, a czasem dostaje odpowiedź jest poza kontrolą. Gdyby istniał system plików, który mógłby obejść ten problem, słyszałbyś o tym.
Z tego powodu strategia ochrony danych krytycznych najbardziej skorzysta na decyzjach podejmowanych na poziomie sprzętowym , np. Przy użyciu zasilacza awaryjnego. Prawdopodobnie nie jest to wykonalne w twojej sytuacji.
Powiedziałeś, że wydajność nie jest tak naprawdę dużym problemem, więc rozważnie ją wykorzystaj
fsync()
.Od lat używam systemów plików extN osobiście i na serwerach internetowych o niskim natężeniu ruchu i podobnie jak Alexios nie widziałem dużej korupcji z powodu awarii zasilania (chociaż, szczerze mówiąc, serwery mają UPS i nie pamiętam jeden z nich schodzi w tę stronę). Znacznie poważniejszym problemem jest uszkodzenie spowodowane awarią sprzętu, które różne systemy plików mogą (ponownie) być w stanie coraz bardziej poradzić sobie z tym problemem, ale (ponownie) jest to zasadniczo poza ich kontrolą i nie mogą temu zapobiec.
Czasami widziałem pliki utracone lub obcięte do zera. Przypuszczam, że istnieje spora szansa, że uda się je jakoś odzyskać; nie było to dla mnie konieczne, ponieważ zostały utworzone kopie zapasowe. Przez większość czasu
fsck
wydaje się, że coś jest nie tak .Myślę, że ryzyko jest naprawdę bardzo niskie po awarii zasilania, z wyjątkiem tego, że uszkodzenie pamięci flash może być uzależnione od wzrostu mocy, który może towarzyszyć awariom zasilania - z którym nie mam doświadczenia, ale mam nadzieję, że pomyślałeś o i zbadałem to.
Warto powtórzyć punkt o fsync () . Obiekty C ++ / iostream nie mają na to metody (:: flush i :: sync nie są fsync), ale wystarczy deskryptor pliku.
źródło
sync
opcji w/etc/fstab
pliku, ponieważ rozumiem, że to wymusza synchroniczne wykonanie zapisu. Zakładam, że oznacza to, że kiedy mój kod zapisu pliku powróci, dane zostaną fizycznie zapisane na dysku. Zrozumiałem, że montowanie zsync
zasadniczo robi to samo, co wywoływaniefsync(my_filedescriptor)
po zapisie. Czy rozumiem to poprawnie?fsync()
w punktach, które uważasz za odpowiednie , i tak nie zaszkodzi , i czyni system bardziej niezawodnym (np. Jeśli urządzenie jest swobodnie montowane bez zestawu synchronizacji itp.).ZFS jest zdecydowanie systemem plików chronionym przed uszkodzeniem z założenia i prawdopodobnie jedynym. Nie jestem jednak pewien dostępności implementacji ZFS (opartych na bezpiecznikach lub natywnych) dla platform opartych na uClinux.
źródło
Istnieje co najmniej jeden komercyjny system plików, który wykonuje ogromną pracę, upewniając się, że system plików prawie nie może zostać uszkodzony z powodu awarii zasilania i że jedyne dane, które ryzykujesz utratą, to dane dodawane w momencie zaniku zasilania.
Wadą jest to, że jest bardzo droga, z drugiej strony oferują świetne wsparcie. Ze względu na koszty, to naprawdę tylko opcja dla wysokich stawek i / lub produktów o dużej objętości. Podobnie jak krytyczne urządzenia wbudowane np. W wydobycie ropy i gazu, które muszą zapewnić integralność systemu w „niepewnych” warunkach pracy (np. Częste przerwy w dostawie prądu itp.).
Sprawdź DataLight (firma) i / lub produkt „ Reliance NITRO ”. (Reliance to ich dziedzictwo i bezpieczne, ale niezbyt skuteczne rozwiązanie, zastąpione przez Reliance NITRO ). Nawet jeśli nie masz pieniędzy na korzystanie z tego systemu, mają kilka całkiem dobrych artykułów omawiających działanie ich systemu, dlaczego jest on bardziej niezawodny niż np. Ext3 i ext4.
Przepraszam, jeśli to brzmiało jak reklama, chciałem tylko wskazać opcje.
źródło