我有一系列失败/有时失败的 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 future
与using Linux to diagnose what is the current state of the SDcards
.
让我试着改写一下:
在 Linux 上分析 SD 卡故障的最彻底方法是什么?
- 是否可以为 MMC 子系统启用调试日志以获取更多信息?
- 什么是
card status 0x900
? - 是否可以从用户空间嗅探 SD-bus 或 SD-bus 通信以获取卡开始出现故障的迹象?
我可以在上面展开。但我同意第一点,我同意这是第一个要问的问题。
我对故障归因的唯一信心更多来自“历史”和我得到的一般结果,而不是来自低级命令的特定错误。无论如何,这可能会因实现而异。
即使使用来自合理品牌的 SSD,我相信我已经返回了错误的数据来代替 I/O 错误。这无疑是许多 SSD 中已知的故障模式之一。[ 2013 年][ 2017 年]。(对于熟悉当代文件系统和数据库实现的人来说可能会感到惊讶,他们通常希望有一组更易于管理的故障模式)。请注意,我在此处链接的论文侧重于返回的数据;除了您已经测量过的死驱动器/坏扇区区别之外,他们在报告的错误中没有任何区别。
我的 SSD 故障出在“卖家翻新”的笔记本电脑上,该笔记本电脑已经“修复”过一次,并且开始再次出现故障 - 就像链接的文件中一样,可能导致驱动器断电。它也可能无法提供稳定的电压电平。
具有良好主电源的良好硬件不会破坏良好的 SD 卡 -除非您对其施加过多负载。工作量是一个非常重要的变量
,你[最初]没有提到. 这些存储卡相对较小,通常是廉价硬件,设计用于存储媒体文件的要求相对不高的用途(因此 MMC,“MultiMediaCard”)。特别便宜的不一定非常擅长“磨损均衡”(将热点逻辑块的负载重新分配到大量物理块上)。我已经通过快速 hack 测量了工作量,安排了一个每日 cron 作业来运行
tunefs -l /dev/mmcblk0p4 | grep writes >> /var/log/writes.log
。但是,如果我们将工作量放在一边,从您目前提供的信息中考虑可能的控制器端问题是正确的。由于来自袖珍设备的写入,我在 SD 卡上重复出现了坏扇区,可能是当它的电池电量不足时。这是一张来自同名品牌的卡片。这些扇区是可恢复的,我仍在使用同一张卡。我在这张卡上也遇到过某种短暂的初始化失败,我认为它也与坏扇区有关(一旦我克服了初始化失败),但我可能记错了。
我从您的 [原始] 问题中得到的印象是,这是一项小规模操作,并且使用不同的卡、控制器和工作负载运行严格的测试矩阵将是矫枉过正。在工作量之后,您控制的第一个变量是卡。
写在 2018 年,有一个全球知名品牌可以被认为是 sd 卡的“规范”——
查看结果:https ://www.amazon.com/s/field-keywords=sd+card
- 并且您希望有许多可以考虑的零售渠道......至少足够可靠以进行比较。(请记住,各种流行的在线零售商充当“市场”以及销售自己的商品)。
官方 Raspbery PI 硬件也可能是可接受的。即 SD 卡,正式出售用于在小型板计算机上运行 Linux,据报道它运行良好。(比媒体文件要求更高的工作量)。
作为一个广泛的刷子,如果你得到一张比你严格需要的更快的卡,我也认为这可能是一个更高的耐力等级。(鉴于速度等级往往比耐力更容易获得)。
如果您控制/测量这两个变量,那么您可以将判断重点放在其余相关硬件上。
请注意,在最一般的情况下,如果您认为设备写入错误,您可以尝试清除此故障:
如果你有像你一样好的原生 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 错误。也许在戴尔上,错误处理超时设置不正确。戴尔:
Sheevaplug: