The*_*eer 6 debugging linux-kernel sd-card
我有一系列失败/有时失败的 SD 卡。它们要么提供以下dmesg输出之一:
完全死掉的(不要在 处列出/dev/mmcblk0):
[ +0,000010] mmc0: error -110 whilst initializing SD card
[ +2,819983] mmc0: card never left busy state
Run Code Online (Sandbox Code Playgroud)
失败的(偶尔仍然可以安装):
[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
Run Code Online (Sandbox Code Playgroud)
我得到的最好的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 卡故障的最彻底方法是什么?
card status 0x900?这似乎更像是硬件/用例问题而不是其他问题。我敢打赌,常识在这里可能比 Linux 技能更重要。您是否在卡中进行大量 I/O、MySQL/Apache/编译……系统日志/频繁的系统更新?-- 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,据报道它运行良好。(比媒体文件要求更高的工作量)。
总的来说,如果你得到一张比你严格需要的速度更快的卡,我也认为这是一个潜在的更高耐力等级。(鉴于速度等级往往比耐力更容易获得)。
如果您控制/测量这两个变量,那么您可以将判断重点放在其他相关硬件上。
失败的(偶尔仍然可以安装)
请注意,在大多数情况下,如果您认为某个设备写入错误,您可以尝试清除此故障:
如果您像您一样拥有不错的本机 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 笔记本电脑(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
Run Code Online (Sandbox Code Playgroud)
雪娃插头:
[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
...
Run Code Online (Sandbox Code Playgroud)