web-dev-qa-db-ja.com

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

最近、お客様との関係はかなり不快でした。リモートセンシングデータを表示するために使用されるRaspberry Piベースの「キオスク」(データ収集サーバーからの自己更新Webページを表示するキオスクモードのブラウザーよりも優れたもの)が原因で起動できませんでしたファイルシステムの破損。 Ext4、手動のfsckが必要、システムは明日の重要なプレゼンテーションの一部となり、サービスがすぐに必要になります。もちろん、お客様がシステムを一晩オフにするときにシステムを適切にシャットダウンするように要求することはできません。システムはそのような虐待に単に耐えなければならない。

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

Linuxで使用可能なファイルシステムは、予期しない電源障害の破損に対して最も優れた耐性を提供し、SDにインストールするために yaffs2 のような不可能なループを飛び越える必要がありません。

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

38
SF.

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

メリット:

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

これを行う方法は次のとおりです:

私は自分のRaspberryPiをArchARM linuxで実行し、カードは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を変更する必要があります。したがって、古いファイルシステムでシステムを実行したまま、次のことを行う必要があります。

ラズベリーは通常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の組み合わせにより、これはかなり難解なものになります。すべてのピースを組み合わせるのに少し時間がかかりましたが、ここにあります。

17
lockheed

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

RAMディスク

RPiのイメージが変更されない場合、変更が行われないように思える場合、何も書き込もうとしない(または書き込もうとしない)場合 RAMにアンパック として作成されたルートファイルシステムを使用してみてください。ここでの考え方は、起動時に圧縮されたルートファイルシステムがあり、RAMに解凍されるということです。すべての変更はRAMディスクに発生するため、SDカードへの書き込みは実質的にゼロであり、起動時の読み取りのみです。これにより、ドライブへの読み取り/書き込みが削減され、ドライブの寿命が維持されます。これは CDからlinuxをブートする の場合と同様であり、 linuxがブートするとき の最初に起こることの1つです。

10
MDMoore313

別の方法で、読み取り専用のファイルシステムを使用します。 SDカードで読み書き可能なルートファイルシステムを使用している場合、Raspberry Piを十分に安定させることができません。カーネルのコマンドライン(ro)でルートを起動するか、システム全体を含むpiggybackでinitramfsを使用できます。

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

10
wbx

さて、ここで発生している問題は、ext *などの「最新の」ファイルシステムを使用すると、SDカードが消耗する可能性があることです。 1年以内に発生する私の経験から、または次の年にハイエンドを取得した場合。

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

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

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

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

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

しかし、最終的には、強力なログ記録が有効になっているため、寿命が数年を超えるSDカードは見つかりませんでした。

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

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

注:私の経験では、ビーグルボーンでAngstrom Linuxを使用しており、20のセンサーデバイスのトライアルランを行っています。そのシステムのロギングは、systemdのジャーナルシステムを使用して非常に冗長でした。

7
zmo

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

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

Linuxのバージョンによっては、jfsファイルシステムが信頼できない場合でも、他のオプションとしてjfsを検討することもできます。 jfsを使用すると、ext4を使用した場合よりも破損が発生しにくくなります。 Jfsは、マウント時間とファイルシステムチェック時間が短いです。

4
gbudan