通过内核跟踪定义故障 SD 卡的状态?

通过内核跟踪定义故障 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就是它是暂停某种程度,但很少说明 SDCard 实际发生了什么。

这是如何发生的背景

SD 卡最终在我正在处理的某些(看似随机的)嵌入式设备上处于这些状态,我试图了解这是否是 SD 卡损坏的问题,或者控制器驱动程序是否可能存在问题正在将牌推向腐败。

大约 5% 的卡牌已经完全死亡,我正在尝试看看其他卡牌是否也出现这种情况。

我尝试强制 SD 卡重现该问题,但接受测试的 SD 卡(相同品牌、相同类型的设备、相同软件)在连续写入数百 GB 数据后没有显示任何磨损痕迹作为测试的一部分。我用压力盘为了那个原因。

我不知道设备突然断电的频率,电源是一个常规的 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 总线通信以获取卡开始出现故障的指示?

答案1

这看起来更像是一个硬件/用例问题而不是其他问题。我敢打赌,常识可能比 Linux 技能更重要。您是否在卡、MySQL/Apache/编译等方面进行大量 I/O...syslog/频繁的系统更新? ——鲁伊·F·里贝罗 (Rui F Ribeiro) 评论

我可以对上面的内容进行扩展。但我同意第一点,我同意这是要问的第一个问题。


  • 我应该为 MMC 子系统启用一些调试日志吗?
  • 有没有一个用户空间工具可以嗅探正在发生的事情?
  • 如何使错误代码更有意义?

我对失败归因的唯一信心更多地来自于我得到的“历史”和一般结果,而不是来自低级命令的具体错误。无论如何,不​​同的实现可能会有所不同。

即使有一个SSD,来自一个合理的品牌,我相信我已经拥有了返回错误数据代替 I/O 错误。这无疑是许多 SSD 已知的故障模式之一。 [2013年][2017年]。 (对于熟悉当代文件系统和数据库实现的人来说可能会感到惊讶,他们通常希望有一组更易于管理的故障模式)。请注意,我在此处链接的论文重点关注返回的数据;除了您已经测量过的死驱动器/坏扇区区别之外,他们没有对报告的错误进行任何更多区分。

我的 SSD 故障发生在一台“卖家翻新”的笔记本电脑上,该笔记本电脑已经被“修复”过一次,并且开始再次显示故障 - 可能会导致驱动器电源中断,就像链接的文件中一样。它也可能无法提供稳定的电压水平。

我试图了解这是否是 SD 卡损坏的问题,或者控制器驱动程序是否存在问题导致卡损坏。

良好的硬件和良好的电源不会损坏良好的 SD 卡 -除非你给它施加了太多的负担。工作量是一个非常重要的变量,你[最初]没有提到。这些存储卡相对较小,通常是廉价的硬件,设计用于存储媒体文件的要求相对较低的用途(因此 MMC,“MultiMediaCard”)。特别便宜的不一定非常擅长“磨损均衡”(将热点逻辑块的负载重新分配到大量物理块上)。

我通过快速 hack 来测量工作负载,安排每日 cron 作业运行tunefs -l /dev/mmcblk0p4 | grep writes >> /var/log/writes.log

但是,如果我们将工作负载放在一边,那么根据您目前提供的信息,您可以正确地考虑可能存在控制器端问题。由于袖珍设备的写入(可能是在电池电量不足时),我的 SD 卡上重复出现了坏扇区。这是一张来自同名品牌的卡片。这些扇区是可恢复的,我仍在使用同一张卡。我在这张卡上也遇到过某种短暂的初始化失败,我思考它也与坏扇区相关(一旦我克服了初始化失败),但我可能记错了。

我有一系列出现故障/有时出现故障的 SD 卡。

我从你的[原始]问题中得到的印象是,这是一个小规模的操作,使用不同的卡、控制器和工作负载运行严格的测试矩阵将是矫枉过正的。

在工作负载之后,您控制的第一个变量是卡。

写在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 适配器即可解决此问题。

在我的 Dell Latitude E5450 笔记本电脑(内核驱动程序、Fedora Linux 内核版本大约 v4.17)上的读卡器中sdhci-pci,无法初始化卡。在我的 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

谢瓦普拉格:

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

相关内容