web-dev-qa-db-ja.com

カーネルトレースにより、障害が発生したSDカードの状態を定義しますか?

一連の失敗する、または失敗する可能性のあるSDカードがあります。次のdmesg出力のいずれかを提供します。

完全に死んだもの(/dev/mmcblk0にリストしないでください):

[  +0,000010] mmc0: error -110 whilst initializing SD card 
[  +2,819983] mmc0: card never left busy state

障害のあるもの(まだマウントされている場合があります):

[Jun16 06:28] mmc0: new high speed SDHC card at address 0001
[  +0,000339] mmcblk0: mmc0:0001 00000 3.68 GiB 
[  +0,002835]  mmcblk0: p1 p2 p3 p4
[ +10,256689] mmcblk0: timed out sending r/w cmd command, card status 0x900
[ +11,264358] mmcblk0: timed out sending r/w cmd command, card status 0x900
[  +0,000016] print_req_error: I/O error, dev mmcblk0, sector 7716736
[ +10,239972] mmcblk0: timed out sending r/w cmd command, card status 0x900
[  +0,000018] print_req_error: I/O error, dev mmcblk0, sector 7716736
[  +0,000008] Buffer I/O error on dev mmcblk0, logical block 964592, async page read
[ +10,239931] mmcblk0: timed out sending r/w cmd command, card status 0x900
[  +0,000009] print_req_error: I/O error, dev mmcblk0, sector 81792
[Jun16 06:29] mmcblk0: timed out sending r/w cmd command, card status 0x900
[  +0,000020] print_req_error: I/O error, dev mmcblk0, sector 1066880
[ +10,240219] mmcblk0: timed out sending r/w cmd command, card status 0x900
[  +0,000011] print_req_error: I/O error, dev mmcblk0, sector 2101120

私がerror -110で得た最高のものは、 timeout のようなものですが、SDCardで実際に何が起こったのかはほとんどわかりません。

これがどのようになってきたかの背景

私が取り組んでいる組み込みデバイスの一部(一見ランダム)でSDカードがこれらの状態になってしまい、それが不良SDカードの問題なのか、それともコントローラードライバーに何か問題があるのか​​を理解しようとしていますカードを腐敗させています。

カードの約5%が完全に死亡しました。他のカードに期待できるかどうかを確認しようとしています。

SDカードに強制的に問題を再現させようとしましたが、テスト中のもの(同じブランド、同じタイプの同じソフトウェアを搭載したデバイス)は、数百GBのデータが継続的に書き込まれた後も摩耗の痕跡を示していません。テストの一部として。そのために stressdisk を使用します。

私はデバイスが突然電力を失った可能性のある頻度を追跡していません。電源は通常の2A AC-DCアダプターであり、デバイスの他のすべてのニーズに対して問題なく機能しています。

更新

質問はhelps me prevent failed SD cards in the futureではなくusing Linux to diagnose what is the current state of the SDcardsのように終了または回答するよう提案されているようです。

それでは言い換えてみましょう:

LinuxでSDカードの障害を分析するための最も徹底的な方法は何ですか?

  • MMCサブシステムのデバッグログを有効にして詳細を取得することは可能ですか?
  • card status 0x900とは何ですか?
  • カードが失敗し始めていることを示すために、ユーザー空間からSDバスまたはSDバス通信を傍受することは可能ですか?

これは他のものよりもハードウェア/ユースケースの問題のようです。ここではLinuxのスキルよりも常識のほうが重要かもしれません。カード、MySQL/Apache /コンパイルのもの... syslog /頻繁なシステム更新で重いI/Oをしていますか? -Rui F Ribeiroによるコメント

上記について詳しく説明します。しかし、私は最初の点に同意し、これが最初に尋ねる質問であったことに同意します。


  • MMCサブシステムのデバッグログを有効にする必要がありますか?
  • 何が起こっているのかを嗅ぐことができるユーザースペースツールはありますか?
  • エラーコードをよりわかりやすくするにはどうすればよいですか?

失敗の原因による唯一の自信は、「履歴」と、一般的な結果から得られたものであり、低レベルのコマンドによる特定のエラーではありません。いずれにせよ、実装によって異なる可能性があります。

SSDを使用していても、妥当なブランドのI/Oエラーの代わりに 不正なデータが返されました があったと思います。これは確かに、多くのSSDで既知の障害モードの1つです。 [ 201 ] [ 2017 ]。 (おそらく、より管理しやすい一連の障害モードを望んでいる現代のファイルシステムとデータベースの実装に精通している人々にはおそらく驚くべきことです)。ここでリンクする論文は、返されるデータに焦点を当てていることに注意してください。既に測定したデッドドライブ/不良セクターの区別を除いて、報告されたエラーではこれ以上区別されませんでした。

SSDの障害は、「一度修復」された「売り手が改造​​した」ラップトップで発生し、再び障害を示し始めました-リンクされた論文のように、ドライブへの電源の中断を引き起こした可能性があります。また、安定した電圧レベルを提供できなかった可能性もあります。

それが悪いSDカードの問題なのか、それともカードを破損させているコントローラードライバーに問題があるのか​​を理解しようとしています。

優れた主電源を備えた優れたハードウェアは、優れたSDカードを破壊する傾向はありません-あなたがそれにあまりにも多くの負荷をかけない限り。ワークロードは非常に重要な変数です、あなたが[最初に]言及しなかった。これらのメモリカードは比較的小さく、通常は安価なハードウェアであり、メディアファイルを格納する比較的要求の少ない使用のために設計されています(したがって、MMC、「MultiMediaCard」)。特に安価なものは、「ウェアレベリング」(ホットスポットの論理ブロックからの負荷を多数の物理ブロックに再分散すること)に必ずしも優れているとは限りません。

私はクイックハックでワークロードを測定し、毎日のcronジョブを実行するようにスケジュールしましたtunefs -l /dev/mmcblk0p4 | grep writes >> /var/log/writes.log

しかし、ワークロードを脇に置いた場合、これまでに提供した情報からコントローラー側の問題の可能性を検討するのは正しいことです。ポケットデバイスからの書き込みが原因でSDカードの不良セクターが繰り返し発生しました。おそらく、バッテリーが少なくなったときです。ワンネームブランドのカードです。セクターは回復可能であり、私はまだ同じカードを使用しています。また、このカードで一時的な初期化の障害が発生しました。思う不良セクターにも関連している(初期化の失敗を過ぎた後) )、しかし、私は覚えていない可能性があります。

一連の失敗する、または失敗する可能性のあるSDカードがあります。

[元の]質問から得られる印象は、これは小規模な操作であり、さまざまなカード、コントローラー、およびワークロードで厳密なテストマトリックスを実行するのはやり過ぎだということです。

ワークロードの後、最初に制御する変数はカードです。

2018年に書いた、SDカードの「正規」と見なすことができるグローバルネームブランドが1つあります-

結果を参照してください: https://www.Amazon.com/s/field-keywords=sd+card

-そして、うまくいけば、考えられる小売チャネルがたくさんあるでしょう...少なくとも比較の目的には十分信頼できる。 (人気のあるさまざまなオンライン小売業者は、自分の商品を販売するだけでなく、「市場」としても機能することを思い出してください)。

公式のRaspbery PIハードウェアも受け入れられる可能性があります。つまり小さなボードコンピュータ上でLinuxを実行するために正式に販売されたSDカードで、正常に動作すると報告されています。 (メディアファイルよりも厳しいワークロードであること)。

広い範囲のブラシとして、必要以上に速いカードを入手した場合、私はそれを潜在的に高い耐久性の評価だと考えています。 (速度定格は持久力よりもはるかに利用可能になる傾向があることを考えると)。

これら2つの変数を制御/測定すると、関連するハードウェアの残りの部分に判断を集中できます。


障害のあるもの(時々まだマウントされる可能性があります)

最も一般的なケースでは、デバイスが正しく書き込まれていないと思われる場合は、この障害をクリアしようとする可能性があります。

  1. 必要に応じて、どのデータを回復できるか
  2. 次に、不良ブロックの読み取りを停止します。フォーマット全体を再作成するだけです(パーティションテーブル+ファイルシステム)。
  3. しかし、確信が持てず、デバイスがまだ故障していると思われる場合は、おそらくそれもテストする必要があります。

ナイスネイティブMMCのようなハードウェアがある場合、Linuxコマンドblkdiscardをより効率的なものとして使用できます「再フォーマット」する前にデバイスのすべてのブロックの消去をテストする方法ですが、ドライブ全体をゼロで上書きするときのエラーのテスト、つまりdd bs=1M if=/dev/zero of=/dev/mmcblk0。 (消去されたブロックをwriteする必要性を回避するだけでなく、blkdiscardは理論的にはより「新品同様」のパフォーマンスを提供できますその後、デバイスにもう少し自由度を与えることにより、耐久性を高めます)。

(これがSATAドライブの場合-論理ドライブの内容全体を破棄するための専用の「セキュア消去」コマンドがあります(man hdparm)。ただし、同等のMMCコマンドはわかりません。特定のSSDベンダーは、このコマンドを利用して、ブロックマッピングテーブルをリセットしました。同等のblkdiscardシーケンス。このコマンドは必ずしもフルドライブの消去をテストするのではないことに注意してください。暗号化キー)。

あなたは私のエラーがどのように見えるか尋ねたので

私のSanDiskマイクロSDカードが最近再び再生されました。以下の特定のエラーは不安定な接続が原因であるようです。これは、すべての金属パッドに迷いをかけた後、micro-SDを取り外してmicro-SDからSDアダプターに再挿入することで解決しました。

Dell Latitude E5450ラップトップのリーダー(sdhci-pciカーネルドライバー、Fedora Linuxカーネルバージョン(v4.17年頃)、カードの初期化に失敗していました。 SheevaPlug(ハードウェアとソフトウェアの詳細は この質問 と同じ)で、このカードは初期化できたようですが、IOエラーが表示されました。おそらくDellでエラー処理のタイムアウトが正しく設定されていません。

デル:

[    2.436566] mmc0: Unknown controller version (3). You may experience problems.
[    2.449019] mmc0: SDHCI controller on PCI [0000:01:00.0] using ADMA
...
[509227.374012] mmc0: error -84 whilst initialising SD card
[509227.621510] mmc0: error -84 whilst initialising SD card
[509227.865472] mmc0: error -84 whilst initialising SD card
[509228.142120] mmc0: error -84 whilst initialising SD card

シーバプラグ:

[6076613.118617] mmcblk0: mmc0:aaaa SC16G 14.8 GiB 
[6076613.295811] mmcblk0: error -110 transferring data, sector 0, nr 8, cmd response 0x900, card status 0x0
[6076613.545740] mmcblk0: error -110 transferring data, sector 0, nr 8, cmd response 0x900, card status 0x0
[6076613.555301] mmcblk0: retrying using single block read
[6076613.728413] mmcblk0: error -110 transferring data, sector 0, nr 8, cmd response 0x900, card status 0x0
[6076613.737965] blk_update_request: I/O error, dev mmcblk0, sector 0
[6076613.912043] mmcblk0: error -110 transferring data, sector 1, nr 7, cmd response 0x900, card status 0x0
[6076613.921599] blk_update_request: I/O error, dev mmcblk0, sector 1
...
6
sourcejedi