組み込みLinux用の破損防止SDカードファイルシステム?


36

最近、お客様にかなり不快な状況がありました-リモートセンシングデータの表示に使用されるRaspberry Piベースの「キオスク」ファイルシステムの破損。Ext4、マニュアルfsckが必要です。システムは明日の重要なプレゼンテーションの一部となり、すぐにサービスが必要になります。もちろん、夜間に電源を切るときにシステムをうまくシャットダウンするように顧客に要求することはできません。システムは単純にそのような虐待に耐えなければなりません。

将来はそのような状況を避けたいので、これを防ぐファイルシステムにOSを移動したいと思います。MTDデバイス向けのファイルシステムがたくさんあります。SDカード(標準ブロックデバイス)で実行するには、深刻なフープジャンピングが必要です。破損に対する優れた耐性を誇る他のファイルシステム(ジャーナリングなど)もあります。私はまだ彼らの賛否両論の合理的な比較を見なければなりません。

Linuxで利用可能なファイルシステムは、予期しない停電時の破損に対する最高の耐性を提供し、SDにインストールするためにyaffs2のような不可能なフープをジャンプする必要はありません。

摩耗バランスはプラスですが、要件ではありません。SDカードは通常、完璧ではない場合、独自のメカニズムを備えていますが、システムは「フラッシュにやさしい」必要があります(NTFSなどのシステムは1か月以内にSDカードを殺すことができます)。


1
個人的には、私は反対に行き、おそらく電源を切るときに安全なシャットダウンに取り組みます。おそらく、シャットダウンを実行するのに十分な活力を提供するためにキャップを使用します。
スコットサイドマン

警告を無視して実際にシャットダウンするために必要なシステムサポートとともに、クリーンシャットダウンに十分な電力を提供するモジュールを誰かが設計するのを楽しみにしています。Pi、BeagleBone、その他の小さなLinuxマシンの賢明な仲間となるように思えますが、それらのマシンのユーザーにマークされた製品としては存在しないようです。
RBerteig

@ScottSeidman:これはRPiであり、非常に電力を消費します-15秒間5Vで800mAと考えてください。バッテリー全体のスーパーキャップに投資しない限り、コンデンサーではありません。
SF。

@RBerteig:再充電可能なバッテリー、充電、出力電圧を安定化するための適切な電子機器(おそらくバッテリー自身からのステップアップ)、シャットダウン信号の送信、シャットダウン完了後の出力電力のカット、入力電力が回復するまで自己シャットダウンするボックス-確かにそれはすべて実行可能ですが、それを大量に製造しないと、RPiのコストが約2倍になります(ただし、キオスクの場合、テレビセットは10倍高価になります...)
SF。

1
@SF。-powerfailファイルシステムに対する堅牢性には2つの問題があることに注意してください。1つ目は、FS自体が堅牢であること、2つ目は、基になるハードウェアがデータをディスクにフラッシュしないことです。見かけのパフォーマンスを向上させるために、近年、回転ディスクが横たわっていることを知っていますので、SDカードが同じことをしていないことを確認してください。
マイケルコーネ

回答:


17

単一のSDカードの破損に対する最良の耐性は、事前定義された期間ごとに自動スクラブを実行するRAID1モードのBTRFSによって提供されます。

メリット:

  1. ファイルシステムにRWする機能を保持
  2. 透過的な圧縮やスナップショットなど、RPiに非常に便利なオプションを備えた、最新のフル機能のファイルシステム
  3. (特に)フラッシュメモリを念頭に置いて設計されています

方法は次のとおりです。

ArchARM linuxでRaspberryPiを実行し、カードがSDリーダーにあるため、他のディストリビューションおよび/ devインターフェイスに合わせてこれらの手順を適宜変更します。

パーティションレイアウトの例を次に示します。

/dev/mmcblk0p1: fat32 boot partition
/dev/mmcblk0p2: to be used as btrfs partition
/dev/mmcblk0p3: to be used as btrfs partition (mirrored with the above)
/dev/mmcblk0p4 (optional): swap

btrfsをRAID1に追加するには、次のようにファイルシステムを作成します。

mkfs.btrfs -m raid1 -d raid1 /dev/mmcblk0p2 /dev/mmcblk0p3

次にrsync -aAXv、以前にバックアップしたシステムに移動します。

raid1のBTRFSから起動するには、initramfsを変更する必要があります。したがって、古いファイルシステムでシステムを実行している間に次のことを行う必要があります。

Raspberryは通常mkinitcpioを使用しないため、インストールする必要があります。次に、mkinitcpio.confのMODULES配列に「btrfs」を追加し、initramfsを再作成する必要があります

mkinitcpio -g /boot/initrd -k YOUR_KERNEL_VERSION

YOUR_KERNEL_VERSIONの代わりに入力する内容を知るには、次を実行します

ls /lib/modules

カーネルを更新する場合、再起動する前にinitramfsを再作成する必要があります。

次に、RPiのブートファイルを変更する必要があります。

cmdline.txtには、次のものが必要です。

root=/dev/mmcblk0p2 initrd=0x01f00000 rootfstype=btrfs

config.txtに追加する必要があります

initramfs initrd 0x01f00000

すべてを実行してbtrfs RAID1システムを正常に起動したら、systemdタイマー(推奨)またはcron(dcron)を使用して定期的なスクラブ(3〜7日ごと)を設定するだけです。

btrfs scrub start /

ファイルシステム上で実行され、すべてのファイルのチェックサムを比較し、破損が見つかった場合はそれらを修正します(正しいコピーに置き換えます)。

BTRFS RAID1、単一メディア、およびRaspberry Piの組み合わせにより、このかなり不可解なものが作成されます。すべてのピースをまとめるのに時間がかかりましたが、ここにあります。


各起動後に「スクラブ」も追加する必要がありますか?
SF。

@SF。いいえ、必要ありません。X日ごとの定期的なスクラブで十分です。なるべく使用が少ない時間帯に。
ロッキード

申し訳ありませんが、理解できません。ファット/bootパーティションを保持している場合でも、initramfsを変更する必要がありますか?
ベックス

ベックス、はい。fat / bootパーティションではなく、btrfsのraid1機能に関係しています。
ロッキード

@@@更新:@@@今のところ、RAID1の代わりにdup-modeを使用することを試みることができます: "mkfs.btrfs --data dup --metadata dup"単一のドライブ上。
ロッキード

10

さまざまな理由から、フラッシュストレージの方が磁気ストレージよりも望ましいですが、このアプリケーションでは、主に可動部分がないために述べます。そうは言っても、「腐敗を防ぐ」ファイルシステムは存在しないと思いますが、堅牢なファイルシステム(ext4が1つ)が存在するほか、破損を軽減するための戦術もあります。

RAMディスク

RPIのイメージがいない場合は持っているものは何もしようとしません(あるいはしようとしなければならない)場合は、ディスクへの書き込みを変更するには、それがないように聞こえる、そしてように作成したルートファイルシステム使用してみてくださいRAMに展開します。ここでの考え方は、ブート時にRAMに展開される圧縮ルートファイルシステムがあるということです。すべての変更はRAMディスクに対して行われるため、SDカードへの書き込みは事実上ゼロであり、ブート時にのみ読み取りが行われます。これにより、ドライブの読み取り/書き込みが削減され、ドライブの寿命が維持されます。これは、CDからLinuxブートするときに行われることと似ており、Linuxのブート時に最初に発生することの1つです。


10

別の方法で、読み取り専用のファイルシステムを使用します。SDカードで読み取り/書き込みルートファイルシステムを使用する場合、ラズベリーpiを十分に安定させることはありません。kernel cmdline(ro)でルートをブートするか、システム全体を含むpiggybackでinitramfsを使用することができます。

どちらも私の手作りのビルドシステムOpenADKで作成できます。(http://www.openadk.org


ROファイルシステムは役立ちますが、問題を完全に解決するわけではありません。
ピスクヴォア

7

さて、あなたがここで抱えている問題は、ext *などの「最新の」ファイルシステムを使用すると、SDカードがすり減る可能性が高いことです。1年以内に起こる私の経験から、またはあなたがより高い端を取るならば来年。

問題は、現代のファイルシステムがデータの断片化を防ぐために常にブロックを移動していることです。これは、キャッシュにロードするときにすべてのデータを照合したい回転ディスクでは良いことです。欠点は、多くのI / Oが発生していないときに片付けが処理されているため、キャッシュできない書き込みが増えていることです。

また、多くのロギングを処理するときにも発生します。これは、組み込みデバイスをデバッグするときに行うことができます。ロギング書き込みは最悪の種類の書き込みです。これは、定期的に発生する小さな書き込みが多く、断片化が大量に発生するためです。

システムがセンサーのデータも処理していると言うように、それらが来るとすぐにフラッシュに保存する可能性が非常に高くなります。そして、それらはログデータと同じくらい悪いです。

私はあなたが遭遇しているのと同じ問題に取り組みました、そしてここに私の結論があります。「より堅牢」である、つまり他の書き込みよりも多くの書き込みを処理できるSDカードを探しましたが、SSDのベンチマークとは異なり、それに焦点を合わせた市場でのベンチマークは見つかりませんでした。それらはすべて速度のみに焦点を当てているため、メモリブロックごとの書き込み回数、およびSDCardで使用されている技術を知ることは不可能です。

しかし、私は「工業用」グレードのサンディスクが無名の寿命が長いことに気づきました。それは驚くことではありません、あなたがより多くを支払うとき、あなたはより多くを得ます。

しかし、最終的には、集中ログを有効にすると、寿命が数年を超えるSDカードは見つかりませんでした。

私が思いついた解決策は@BigHomieと@wbx 'の解決策です:読み取り専用のextXファイルシステムを使用します(ジャーナリングが不要になったため、古き良きext2にフォールバックすることさえできます)。セッション内でログを保持したり、一時ファイルを書き込んだりする場合は、いつでもRAMDISKを使用できます。

セッション用に編集できるように、読み取り専用部分内からデータをRAMディスクに取り込むのに役立つチュートリアルとスクリプトのみが存在します。

NB:私の経験では、BeagleboneでAngstrom Linuxを使用し、20台のセンサーデバイスを試用しています。そのシステムのロギングは、systemdのジャーナルシステムを使用して非常に冗長でした。


4

Linuxは多くのファイルシステムを提供します。ext4は、私が自信を持っているものです。疑わしい場合は、読み書き可能にマウントされるパーティションにext4を使用する必要があります。

ext2ファイルシステムは、はるかに脆弱です。これは、読み取り専用でマウントしたり、正しくマウント解除したりすることができるシステムに最適なファイルシステムです。ただし、ext2の電源障害により破損が発生する可能性が非常に高くなります。

一部のLinuxバージョンではjfsファイルシステムが信頼できない場合でも、もう1つのオプションとしてjfsを検討できます。jfsの場合、ext4よりも破損の可能性は低くなります。Jfsには、クイックマウント時間とファイルシステムチェック時間もあります。


2
はい、ext4は優れており、ほとんどのサーバーで使用しています。しかし、この質問は、SDカード上のルートシステムのファイルシステムに関するものです。これは異なる環境です。あなたのアドバイスは一般的なものですか、それともext4カードを使うことを本当にアドバイスしていますか?
ゲットリ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.