Linux-Kernel

通過核心跟踪定義故障 SD 卡的狀態?

  • April 30, 2022

我有一系列失敗/有時失敗的 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是它是一種超時,但很少說明 SDCard 實際發生了什麼。

這是如何形成的背景

SD卡最終在我正在處理的某些(看似隨機的)嵌入式設備上處於這些狀態,我試圖了解這是不是SD卡壞的問題,或者控制器驅動程序是否有問題正在將牌推向腐敗。

大約 5% 的牌已經完全失效,我正在嘗試看看其他牌是否會出現這種情況。

我試圖強制 SD 卡重現該問題,但被測試的那些(相同品牌、相同類型的設備和相同的軟體)在連續寫入數百 GB 數據後沒有顯示任何磨損痕跡作為測試的一部分。我為此使用了壓力磁碟

我不知道設備突然斷電的頻率,電源是一個正常的 2A AC-DC 適配器,可以滿足設備的所有其他需求。

更新

似乎建議以helps me prevent failed SD cards in the futureusing Linux to diagnose what is the current state of the SDcards.

讓我試著改寫一下:

在 Linux 上分析 SD 卡故障的最徹底方法是什麼?

  • 是否可以為 MMC 子系統啟用調試日誌以獲取更多資訊?
  • 什麼是card status 0x900?
  • 是否可以從使用者空間嗅探 SD-bus 或 SD-bus 通信以獲取卡開始出現故障的跡象?

這似乎更像是一個硬體/案例問題而不是其他問題。我敢打賭,在這裡,常識可能比 Linux 技能更重要。您是否在卡片中進行繁重的 I/O,MySQL/Apache/編譯的東西…系統日誌/頻繁的系統更新?——Rui F Ribeiro 評論

我可以在上面展開。但我同意第一點,我同意這是第一個要問的問題。


  • 我應該為 MMC 子系統啟用一些調試日誌嗎?
  • 是否有可以嗅探正在發生的事情的使用者空間工具?
  • 如何使錯誤程式碼更有意義?

我對故障歸因的唯一信心更多來自“歷史”和我得到的一般結果,而不是來自低級命令的特定錯誤。無論如何,這可能會因實現而異。

即使使用來自合理品牌的 SSD,我相信我已經返回了錯誤的數據來代替 I/O 錯誤。這無疑是許多 SSD 中已知的故障模式之一。[ 2013 年][ 2017 年]。(對於熟悉當代文件系統和數據庫實現的人來說可能會感到驚訝,他們通常希望有一組更易於管理的故障模式)。請注意,我在此處連結的論文側重於返回的數據;除了您已經測量過的死驅動器/壞扇區區別之外,他們在報告的錯誤中沒有任何區別。

我的 SSD 故障出在“賣家翻新”的筆記型電腦上,該筆記型電腦已經“修復”過一次,並且開始再次出現故障 - 就像連結的文件中一樣,可能導致驅動器斷電。它也可能無法提供穩定的電壓電平。

我試圖了解這是否是 SD 卡損壞的問題,或者控制器驅動程序是否有問題導致卡損壞。

具有良好主電源的良好硬體不會破壞良好的 SD 卡 -除非您對其施加過多負載。工作量是一個非常重要的變數~~, 你沒有$$ originally $$提到~~. 這些儲存卡相對較小,通常是廉價硬體,設計用於儲存媒體文件的要求相對不高的用途(因此 MMC,“MultiMediaCard”)。特別便宜的不一定非常擅長“磨損均衡”(將熱點邏輯塊的負載重新分配到大量物理塊上)。

我已經通過快速 hack 測量了工作量,安排了一個每日 cron 作業來執行tunefs -l /dev/mmcblk0p4 | grep writes >> /var/log/writes.log

但是,如果我們將工作量放在一邊,從您目前提供的資訊中考慮可能的控制器端問題是正確的。由於來自袖珍設備的寫入,我在 SD 卡上重複出現了壞扇區,可能是當它的電池電量不足時。這是一張來自同名品牌的卡片。這些扇區是可恢復的,我仍在使用同一張卡。我在這張卡上也遇到過某種短暫的初始化失敗,我認為它也與壞扇區有關(一旦我克服了初始化失敗),但我可能記錯了。

我有一系列失敗/有時失敗的 SD 卡。

我從你那裡得到的印象$$ original $$問題是這是一個小規模的操作,使用不同的卡、控制器和工作負載執行嚴格的測試矩陣將是多餘的。

在工作量之後,您控制的第一個變數是卡。

寫在 2018 年,有一個全球知名品牌可以被認為是 sd 卡的“規範”——

查看結果:https ://www.amazon.com/s/field-keywords=sd+card

  • 並且您希望有許多可以考慮的零售渠道……至少足夠可靠以進行比較。(請記住,各種流行的線上零售商充當“市場”以及銷售自己的商品)。

官方 Raspbery PI 硬體也可能是可接受的。即 SD 卡,正式出售用於在小型板電腦上執行 Linux,據報導它執行良好。(比媒體文件要求更高的工作量)。

作為一個廣泛的刷子,如果你得到一張比你嚴格需要的更快的卡,我也認為這可能是一個更高的耐力等級。(鑑於速度等級往往比耐力更容易獲得)。

如果您控制/測量這兩個變數,那麼您可以將判斷重點放在其餘相關硬體上。


失敗的(偶爾仍然可以安裝)

請注意,在最一般的情況下,如果您認為設備寫入錯誤,您可以嘗試清除此故障:

  1. 如果需要,可以恢復哪些數據
  2. 然後停止嘗試讀取壞塊。只需重新創建整個格式(分區表+文件系統)。
  3. 但是,如果您不確定並認為該設備可能仍在死亡,您可能還想對其進行測試。

如果你有像你一樣好的原生 MMC 硬體,你可以使用 Linux 命令blkdiscard作為一種更有效的方法來測試擦除設備的所有塊,然後再“重新格式化”它。但是與用零覆蓋整個驅動器時測試錯誤相比,效率是唯一的優勢,即dd bs=1M if=/dev/zero of=/dev/mmcblk0. (除了避免任何需要寫入已擦除的塊外,blkdiscard理論上還可以在之後提供更“如新”的性能,並通過給予設備更多的自由度來增加耐用性)。

(如果這是一個 SATA 驅動器 - 有一個專用的“安全擦除”命令來丟棄整個邏輯驅動器內容(請參閱 參考資料man hdparm)。但是我不知道任何等效的 MMC 命令。某些 SSD 供應商利用此命令來重置他們的塊映射表,作為它們無法以等效blkdiscard序列恢復“新”性能的解決方法。注意此命令不一定測試全驅動器擦除。在某些情況下,它只會擦除內部加密密鑰)。

既然你問我的錯誤是什麼樣的

我的 SanDisk micro-SD 卡最近又開始播放了。下面的具體錯誤似乎是由於片狀連接造成的。在迷信地吹過所有金屬墊之後,通過將 micro-SD 移除並重新插入 micro-SD 到 SD 適配器來解決此問題。

在我的戴爾 Latitude E5450 筆記型電腦(sdhci-pci核心驅動程序,Fedora Linux 核心版本大約 v4.17)上的讀卡器中,它無法初始化卡。在我的 SheevaPlug(與此問題相同的硬體和軟體詳細資訊)上,這張卡似乎已經能夠初始化,但它顯示 IO 錯誤。也許在戴爾上,錯誤處理超時設置不正確。

戴爾:

[    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

Sheevaplug:

[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
...

引用自:https://unix.stackexchange.com/questions/450476