私はRaspberry Pi用のPiカーネル5.10.92(64ビット)ベースのカスタムbuildroot Linuxカーネルを使用しています。私はこのイメージを2つの異なるメーカーのマイクロSDカードにフラッシュし、カスタマイズされたPi CM4 PCBAにインストールしました。
一部のSDカードは数週間使用して起動できなくなります。 SDカードをLinuxシステムに挿入して実行すると、dmesg
次のようになります。
sd 2:0:0:1: [sdd] 61069312 512-byte logical blocks: (31.3 GB/29.1 GiB)
sd 2:0:0:1: [sdd] Write Protect is on
sd 2:0:0:1: [sdd] Mode Sense: 23 00 80 00
sdd: sdd1 sdd2 sdd3 sdd4
注:ハードウェアの使用により、オペレーティングシステムは12時間ごとに自動的に再起動します。 U-bootは、デュアルパーティション(A / B)フェイルオーバーシナリオを有効にするpiブートローダのターゲットです。環境(CONFIG_ENV_IS_IN_MMC=y
)、、CONFIG_ENV_SIZE=0x4000
)CONFIG_ENV_OFFSET=0x1000000
を確認し、イメージレイアウトは次のとおりです。最初の4MBはu-bootの環境ブートパーティション(fat32)用に予約されています。 Rootfs A(ext4) Rootfs B(ext4) 永続データパーティション(ext4)
別のLinuxシステムで各パーティションを個別にマウントしようとすると、ブートパーティション(/dev/sdd1
)が読み取り専用としてマウントされます。他の3つのext4
パーティションについては、dmesg
以下が表示されます。
EXT4-fs (sdd2): INFO: recovery required on readonly filesystem
EXT4-fs (sdd2): write access unavailable, cannot proceed (try mounting with noload)
このオプションを使用してインストールしても、noload
デバイスはFAT32ブートパーティションのように書き込み禁止および読み取り専用マウントとして報告され続けます。
ブロックデバイス全体が読み取り専用になる原因が何であるかを理解しようとしています。現在、より多くのSDカードでこの問題を再現するための一貫した方法が見つからなかったので、この問題を再現するための提案をいただきありがとうございます。同じ時間以上問題なく使用された他のSDカードもあります。
答え1
SDカードのメモリコントローラがメディアに書き込めなくなったと思いました。
最も可能性の高い原因は、摩耗レベルのブロックが不足していることです。
フラッシュメモリは、本質的に別々に充電されないか充電されたままにすることができる大規模コンデンサのアレイです。コンデンサに電荷が蓄積されているかどうかは、蓄積されたビットを表します。
コンデンサを「放電」するには、より高い電圧が必要です。
SDカードはNAND型フラッシュメモリで構成されており、ブロック削除操作のみをサポートしています。その結果、以下のようにシングルバイトへの書き込みが行われます(詳細な説明はここ):
- このバイトのブロック全体をSDカードの内部RAMに読み込みます。
- フルフラッシュブロックの削除
- RAMのブロック内のバイトを修正し、
- 結果をFlashのブロックに書き換える
今問題は、これらの消去/書き込みサイクルが活発に行われていることです。ダウングレード記憶細胞。同じセルに対して無限に頻繁にこれを行うことはできません!残念ながら、ファイルシステムがそのようなことをする傾向があります。私のファイルシステムには、ファイル名、日付、属性が格納される明示的なブロックがあり、私のプログラムは他のプログラムよりも特定のファイルの場所に頻繁に書き込むことができます。フラッシュを強調します!
これでこれを行う簡単な方法があります。ブロック全体を削除する方法をご存知ですか?この時点では、元のブロックを再使用しても実質的な利点はありません。他の消去ブロックも同様です。そのため、頻繁に記録されないブロックのみを使用します。次に、論理ブロックが格納されている場所をテーブルに表示します。
それウェアレベリングフラッシュメモリデバイスの寿命を大幅に延ばします。しかし、限界があります。ログ、バックアップ、データベース(特にストレージ内の小さなチャンクを更新するデータ)など、大量のデータを定期的に作成する場合は、いくら小さくしてもキャッシュしない限り、チャンク全体の更新です。更新の実行マルチタスク書き込みは、コンデンサが十分に「漏れ」(読み取り電圧を十分に信頼できなくなる)し、保存されたデータを失います。 SDカードコントローラは、これらの問題を防ぐのに十分に役立ちます。データを書き込んでそのデータを失うことは、保存できないことを知っているよりも悪いです。
新しいSDカードを購入したい場合があります。将来的には、次のようないくつかの作業を行うことができます。
- 書き込み圧力を下げる
- ファイルシステムへのファイルアクセス時間の保存を無効にする
- 保存する必要のないログは作成しないでください。
- ランダムな上書き/安定したアップデートリポジトリは、システムブートSDカードではなくUSB経由で接続されたSSDに属します。
- 私はこれがCM PCBAであると言ったことを完全に知っています。したがって、「単にUSBデバイスを追加する」には約30ユーロで、240GBの外部SSDよりもコストがかかることがあります。
- メモリコントローラに自由を与える
- nvmeまたはSATA経由で接続されたSSDの場合は、これを使用して
fstrim
ext4ファイルシステムに空き容量を作成した後、SDカードのどのブロックが未使用と見なされるかをフラッシュコントローラに通知できます。これは再利用可能なブロックヒープに直接移動されます。
- nvmeまたはSATA経由で接続されたSSDの場合は、これを使用して