Zapobiegaj uszkodzeniu danych na dysku ext4 / Linux po utracie zasilania


9

Mam wbudowane płyty z biosami American Megatrends z wbudowanym linuksem jako system operacyjny. Problem, który mam, polega na tym, że przemysłowe lampy błyskowe zostaną uszkodzone w wyniku utraty zasilania. Mam je sformatowane jako ext4. Ilekroć tak się dzieje, zwykle mogę naprawić flash za pomocą fsck, ale nie będzie to możliwe w naszych wdrożeniach. Słyszałem, że wyłączenie buforowania zapisu powinno pomóc, ale nie wiem, jak to zrobić. Czy jest jeszcze coś, co powinienem zrobić?

Więcej informacji

Napęd to moduł pamięci flash 4 GB. Mam jedną partycję, która jest ext4. System operacyjny jest zainstalowany na tej partycji, a grub jest moim programem ładującym.

fdisk -l pokazuje / dev / sda jako mój moduł flash z / dev / sda1 jako moją partycją podstawową.

Po utracie zasilania zwykle nie mogę zrobić tego całkowicie za pomocą skryptów inicjujących rozruch.

Kiedy montuję dysk na innym komputerze, uruchamiam fsck / dev / sda1. Zawsze pokazuje wiadomości takie jak

"zero datetime on node 1553 ... fix (y)?"

Naprawiam je i ładuje się dobrze do następnej utraty zasilania.

Kiedy jutro przyjdę do biura, opublikuję rzeczywistą wydajność fdisk -l

To wszystko, co wiem o tym, jak działa system. Nie jestem facetem od systemów, jestem inżynierem oprogramowania, który ma zwyczaj wpadania w kłopoty, które są poza jego opisem stanowiska. Wiem, jak formatować dyski, instalować program ładujący, pisać oprogramowanie i hakować w systemie operacyjnym.

Oto dane wyjściowe z dumpe2fs

#sudo dumpe2fs /dev/sda1
dumpe2fs 1.41.12 (17-May-2010)
Filesystem volume name:   VideoServer
Last mounted on:          /
Filesystem UUID:          9cba62b0-8038-4913-be30-8eb211b23d78
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      ext_attr resize_inode dir_index filetype extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash 
Default mount options:    (none)
Filesystem state:         not clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              245760
Block count:              977949
Reserved block count:     48896
Free blocks:              158584
Free inodes:              102920
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      239
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Flex block group size:    16
Filesystem created:       Fri Feb  4 15:12:00 2011
Last mount time:          Sun Oct  2 23:48:37 2011
Last write time:          Mon Oct  3 16:34:01 2011
Mount count:              2
Maximum mount count:      26
Last checked:             Tue Oct  4 07:44:50 2011
Check interval:           15552000 (6 months)
Next check after:         Sun Apr  1 07:44:50 2012
Lifetime writes:          21 GB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:           256
Required extra isize:     28
Desired extra isize:      28
Default directory hash:   half_md4
Directory Hash Seed:      249d2b79-1e20-49a3-b324-6cb631294a63
Journal backup:           inode blocks

Odpowiedzi:


6

Pamięć podręczna zapisu zwykle nie ma nic wspólnego z BIOS-em, przeważnie nie ma opcji przełączania ustawień pamięci podręcznej dysku. W Linuksie używanie hdparm -W 0powinno pomóc.

Ustawienie jest trwałe, więc jeśli nie masz hdparma do zabawy w systemach produkcyjnych, powinieneś być w stanie wyłączyć pamięć podręczną zapisu na dysku w innym systemie i ponownie zainstalować dysk.

BTW: Poparłbym pomysł, aby nie zapisywać głównego systemu plików (aby twój system mógł uruchomić się w rodzaju „trybu odzyskiwania” i pozwolić na zdalny dostęp, nawet jeśli z jakiegoś powodu nie można zamontować zapisywalnego systemu plików). A jeśli możesz zmienić projekt sprzętu, rozważ użycie urządzeń mtd zamiast dysków IDE / SATA z systemem plików obsługującym pamięć flash, takim jak jffs2 . Używamy tej kombinacji z kilkoma urządzeniami wbudowanymi (głównie w terenie rozwiązania routera VPN w terenie) od kilku lat z dobrymi wynikami.

Aktualizacja: źródłem problemu wydaje się być to, że używasz systemu plików ext4 z wyłączonym kronikowaniem - has_journalbrakuje go na Filesystem featuresliście. Po prostu zamknij wszystkie usługi, sprawdź, czy coś jeszcze ma otwarte pliki lsof +f -- /, zamontuj ponownie partycję główną tylko do odczytu mount -o remount,ro /, włącz dziennik tune2fs -O has_journal /dev/sda1i ustaw tryb dziennika „zamówiony” jako domyślną opcję montowania tune2fs -o journal_data_ordered /dev/sda1- będziesz musiał ponownie uruchom fsck (najlepiej z systemu ratunkowego) i ponownie podłącz root / restart po tej operacji.

Dzięki tym ustawieniom metadane mogą zostać odzyskane z dziennika nawet w przypadku nagłej awarii zasilania. Rzeczywiste dane są również konsekwentnie zapisywane na dysku, chociaż możesz zobaczyć dane z kilku sekund przed utratą zasilania podczas uruchamiania. Jeśli nie jest to do zaakceptowania, możesz rozważyć użycie tune2fs -o journal_data /dev/sda1opcji montowania z systemem plików - obejmowałoby to wszystkie dane zapisane na dysku w dzienniku - to oczywiście dałoby lepszą spójność danych, ale kosztem obniżenia wydajności i wyższego poziomu zużycia na dysku SSD.


Więc pamięć podręczna zapisu to mój problem, czy coś innego?
— Jonathan Henson

Cóż, skąd mam wiedzieć, że to w końcu twój system :-) Powinieneś podać kilka szczegółów na temat użytych opcji montowania systemu plików (czy włączono zakresy, jaki rodzaj danych / tryb dziennika?) I rodzaj korupcji, którą jesteś widzenie (najlepiej wyjście fsck) w celu bardziej szczegółowej analizy.
— the-wabbit

Ok dzięki. Jestem bezradnym inżynierem oprogramowania, którego znasz :). Zdobędę trochę szczegółów. Dodam kilka szczegółów w ciągu minuty.
— Jonathan Henson

Nie wiem, jakie są zakresy i nie jestem pewien, co to jest tryb dziennika.
— Jonathan Henson

O, rozumiem. Wystarczy zamieścić pierwsze wiersze danych wyjściowych dumpe2fs /dev/sda1(lub jakąkolwiek nazwę urządzenia / partycji dla tego systemu) - powinny one zawierać wszystkie istotne informacje. Pomogą również opcje montowania głównego systemu plików z / etc / fstab.
— the-wabbit

5

Sugestia pamięci podręcznej zapisu to dobry początek, ale brzmi to jak wada projektu architektonicznego. W systemie wbudowanym prawdopodobnie nie należy montować wewnętrznej lampy błyskowej R / W, z wyjątkiem rzadkich przypadków. Naprawdę powinieneś wykonywać większość pracy w systemie plików pamięci i synchronizować zmiany z powrotem do pamięci flash RW po wydaniu polecenia przez użytkownika lub w regularnych odstępach czasu. Naprawdę rzadko zdarza się, aby system osadzony używał zwykłego systemu plików (takiego jak ext4) w trybie rw podczas normalnej pracy. Jeśli jest jakieś wymaganie aplikacji, w którym potrzebujesz dużo miejsca do przechowywania, powinieneś rozważyć inną partycję systemową i zaprojektowanie jej w taki sposób, aby partycja danych mogła być fsck -y'ed w ramach uruchamiania.

Jeśli potrzebujesz kilku punktów wyjścia, przyjrzałbym się, jak ludzie konfigurują bezdotykowe systemy Linux:

http://frank.harvard.edu/~coldwell/diskless/

i zacznij od tego. Ogólny pomysł polega na tym, że pliki binarne i dane systemowe można montować tylko do odczytu, aby system plików nie został uszkodzony. Jednak musisz być w stanie pisać w niektórych obszarach, więc potrzebujesz czegoś, co zwykle pamięci system plików / tmp, / var / tmp. Nawet jeśli pewne rzeczy muszą być zapisywalne, wystarczy utworzyć skrypt, aby zamontować partycję jako r + w, a następnie zatwierdzić zmiany, a następnie wrócić do trybu tylko do odczytu.

Naprawdę doskonałym tego przykładem jest sprzęt Cyclades, jego osadzony linux i za każdym razem, gdy wprowadzasz zmiany w konfiguracji, musisz wykonać skrypt zapisu, który faktycznie ponownie konfiguruje i zapisuje je do pamięci flash.


Istnieją pliki konfiguracyjne, które muszą być edytowane przez aplikację, jak również / etc / networks i plik nazwy hosta. Czy możesz podać mi zalecenie, np. Potrzebujesz jednej partycji z takim i takim typem, a drugiej do plików konfiguracyjnych innego typu i tak dalej? Naprawdę nie mam pojęcia o tych rzeczach. Piszę oprogramowanie i magicznie oczekuje się ode mnie dokładnej wiedzy (nie, że nie wiem wystarczająco dużo, aby napisać oprogramowanie * nix, ale z pewnością nie wiem aż tyle, jak specjalista od systemów dedykowanych), jak sprzęt powinien działać przez mojego pracodawcę.
— Jonathan Henson

Jasne, zaktualizowałem odpowiedź, aby zawierała więcej informacji. Jest to dość skomplikowany temat do omówienia w jednym pytaniu, ponieważ dotyczy tak wielu wewnętrznych elementów systemu Linux. Być może warto spróbować zawrzeć umowę z kimś, kto stworzył systemy bezdyskowe / pxe / embedded, aby zrozumieć wymagania dotyczące aplikacji i stworzyć niezawodne rozwiązanie.
— wielomian

W najgorszym przypadku możesz użyć partycji systemowej (nigdy nie zapisywalnej) i dwóch partycji konfiguracyjnych. Jeśli partycja podstawowa jest nieczytelna lub niekompletna, uruchom komputer z pomocniczej, sformatuj ją i skopiuj do niej. Zaktualizuj główny i dodatkowy w nie nakładających się operacjach.
— David Schwartz

Ok, zaktualizowałem swoją odpowiedź. Prawdopodobnie skorzystam z twojej rady i przekażę ją mojemu staremu profesorowi ze studiów magisterskich. W międzyczasie, czy jest szybki i brudny, który przynajmniej zapewni mi lepszą pozycję, która nie obejmuje mojego tyłka na patelni?
— Jonathan Henson

Wyłączanie buforowania zapisu lub regularne synchronizowanie prawdopodobnie pomogłoby w krótkim okresie.
— wielomian
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.