停電時のext4 / Linuxドライブでのデータ破損を防止


9

私は、OSとしてlinuxを組み込んだAmerican Megatrends biosを実行する組み込みボードをいくつか持っています。私が抱えている問題は、産業用フラッシュIDEが電力損失で破損することです。私はそれらをext4としてフォーマットしています。これが発生するときはいつでも、通常fsckでフラッシュを修正できますが、私たちの展開ではこれは不可能です。書き込みキャッシュを無効にすると効果があると聞きましたが、その方法がわかりません。また、他に何かすべきことはありますか?

より詳しい情報

ドライブは4GB IDEフラッシュモジュールです。ext4のパーティションが1つあります。OSはそのパーティションにインストールされ、grubは私のブートローダーです。

fdisk -lは/ dev / sdaをフラッシュモジュールとして表示し、/ dev / sda1をプライマリパーティションとして表示します。

停電後は、通常、起動初期化スクリプトで完全に行うことはできません。

ドライブを別のPCにマウントするとき、fsck / dev / sda1を実行します。常に次のようなメッセージが表示されます

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

私はそれらを修正し、次の停電まで正常に起動します。

明日オフィスに着いたら、fdisk -lの実際の出力を投稿します。

これが、システムがどのように機能するかについて私が知っているすべてです。私はシステムの専門家ではありません。職務内容の範囲外の窮地に陥る傾向のあるソフトウェアエンジニアです。ドライブのフォーマット、ブートローダーのインストール、ソフトウェアの作成、オペレーティングシステムのハッキングの方法を知っています。

これは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

回答:


6

通常、書き込みキャッシュはBIOSとは関係ありません。ほとんどの場合、そこにディスクキャッシュ設定を切り替えるオプションはありません。Linuxでは、を使用すると問題hdparm -W 0が解決します。

この設定は永続的であるため、実稼働システムでhdparmをいじって操作できない場合は、別のシステムのディスク書き込みキャッシュを無効にして、ディスクを再接続できるはずです。

ところで、私は書き込み不可能なルートファイルシステムのアイデアを2番目に考えます(システムが一種の「回復モード」で起動し、書き込み可能なファイルシステムが何らかの理由でマウントできない場合でもリモートアクセスを許可します)。また、ハードウェア設計を変更できる場合は、jffs2などのフラッシュ対応ファイルシステムでIDE / SATAディスクの代わりにmtdデバイスを使用することを検討してください。私たちはこの組み合わせをいくつかの組み込みデバイス(主にフィールドでのVPNルーターソリューション)と数年間使用してきており、良い結果が得られています。

更新:問題の原因は、ジャーナリングを無効にしてext4ファイルシステムを実行していることです- リストにhas_journalありませんFilesystem features。すべてのサービスをシャットダウンし、を使用して開いているファイルがあるかどうかを確認しlsof +f -- /、でルートパーティションを読み取り専用で再マウントし、を使用しmount -o remount,ro /てジャーナルを有効にtune2fs -O has_journal /dev/sda1し、デフォルトのマウントオプションとして「順序付き」ジャーナルモードを設定します。tune2fs -o journal_data_ordered /dev/sda1再使用する必要があります。 fsckを(できればレスキューシステムから)実行し、この操作の後にルートを再マウント/再起動します。

これらの設定を行うと、突然の電源障害が発生した場合でも、メタデータをジャーナルから回復できることが保証されます。実際のデータも一貫してディスクに書き込まれますが、起動時に停電が失われるまでに数秒のデータが表示される場合があります。これが受け入れられない場合はtune2fs -o journal_data /dev/sda1、ファイルシステムでマウントオプションを使用することを検討してください。これには、ジャーナルのディスクに書き込まれたすべてのデータが含まれます。これにより、データの一貫性が向上しますが、パフォーマンスが低下し、摩耗レベルが高くなります。 SSDに。


それで、書き込みキャッシュは私の問題ですか、それとも何か他のものですか?
ジョナサンヘンソン

ええと、どうやって知る必要がありますか、結局はあなたのシステムです:-)使用するファイルシステムのマウントオプション(エクステントを有効にしましたか?データの種類/ジャーナルモードの種類)と、破損の種類について詳しく説明する必要がありますより詳細な分析については、(fsck出力が最適です)を参照してください。
the-wabbit

わかりました。私はあなたが知っている無力なソフトウェアエンジニアです:)。詳細を教えてください。1分以内に詳細をいくつか追加します。
ジョナサンヘンソン

エクステントが何であるかわかりません。ジャーナルモードとは何なのかわかりません。
ジョナサンヘンソン

ああ、分かった。の出力の最初の行dumpe2fs /dev/sda1(またはこのシステムのデバイス/パーティション名)を投稿するだけです-それらにはすべての関連情報が含まれているはずです。また、/ etc / fstabからのルートファイルシステムのマウントオプションも役立つはずです。
the-wabbit

5

書き込みキャッシュの提案は良い出発点ですが、これはアーキテクチャの設計上の欠陥のように思えます。組み込みシステムでは、まれな状況を除いて、内蔵フラッシュをR / Wにマウントしないでください。実際には、ほとんどの作業をメモリファイルシステムで実行し、ユーザーコマンドまたは定期的な間隔で変更をRWフラッシュに同期します。組み込みシステムが通常の操作中にrwモードで通常のファイルシステム(ext4など)を使用することは非常にまれです。多くのストレージスペースが必要なアプリケーション要件がある場合は、システムパーティションを異なるものにして、データパーティションを起動の一部としてfsckできるように設計することを検討してください。

出発点が必要な場合は、ディスクレスLinuxシステムのセットアップ方法を見てみましょう。

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

そこから始めましょう。一般的な考え方は、システムのバイナリとデータを読み取り専用でマウントできるため、ファイルシステムが破損しないということです。ただし、特定の領域に書き込むことができるようにする必要があるため、通常はファイルシステム/ tmp、/ var / tmpに何かが必要です。特定のものが書き込み可能である必要がある場合でも、パーティションをr + wとしてマウントするスクリプトを作成し、変更をコミットしてから、読み取り専用に戻ります。

これの非常に優れた例は、Cycladesハードウェアとその組み込みLinuxです。構成を変更するたびに、実際に構成を再バンドルしてフラッシュに書き込む保存スクリプトを実行する必要があります。


アプリケーションで編集する必要がある構成ファイル、/ etc / networks、およびホスト名ファイルがあります。私に推奨事項を教えてもらえますか?たとえば、そのようなタイプのパーティションと、別のタイプの構成ファイル用に別のパーティションなどが必要ですか?私はこれらのことについて本当に知りません。私はソフトウェアを書き、魔法のように魔法のように正確に知ることが期待されています(* nixソフトウェアを書くのに十分な知識がないのですが、専任のシステム担当者ほどは知りません)。
ジョナサンヘンソン

確かに、私は答えを更新していくつかの情報を追加しました。これは非常に多くのLinux内部を扱っているため、1つの質問で扱うにはかなり複雑なトピックです。アプリケーションの要件を理解し、信頼できるソリューションを構築する前に、ディスクレス/ pxe /組み込みシステムを実行したことがある人を試して契約することをお勧めします。
多項式

最悪の場合、システムパーティション(書き込み不可)と2つの構成パーティションを使用できます。プライマリパーティションが読み取り不可能または不完全な場合は、セカンダリから起動し、プライマリを再フォーマットして、セカンダリをコピーします。重複しない操作でプライマリとセカンダリを更新します。
David Schwartz、

わかりました、私は私の答えを更新しました。私はおそらくあなたの助言を取り入れ、これを私の大学院プログラムの古い教授に持っていきます。それまでの間、少なくともお尻をフライパンに入れない、より良い位置に私を導く迅速で汚れたものはありますか?
ジョナサンヘンソン、2011年

書き込みキャッシュをオフにするか、定期的に「同期」を実行すると、短期的にはおそらく役立つでしょう。
多項式
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.