资讯详情

资讯详情

eMMC随机读写错误排查实战:从文件系统损坏到硬件问题,那些容易踩的坑

做嵌入式产品的人大概都遇到过这样的问题产品用着用着突然出现数据丢失——配置文件没了、日志文件坏了、数据库打不开。或者文件系统挂载失败系统起不来。或者读写eMMC时报I/O错误时好时坏重启后可能恢复也可能彻底无法启动。这些问题很多都和eMMC有关。eMMC是嵌入式产品的硬盘系统和数据都存在里面一旦eMMC出问题产品就无法正常工作。但eMMC相关的问题排查起来不容易——可能是文件系统的问题可能是写入方式的问题可能是eMMC寿命到了可能是硬件信号的问题也可能是兼容性的问题。很多人排查时东试一下西试一下找不到根本原因问题反复出现。这篇文章从实际排查的角度讲清楚eMMC相关问题的现象分类、排查思路和步骤、常见原因和解决方案、实际案例、以及怎么预防。不讲复杂的理论只讲实际排查中能用得上的方法和经验。一、eMMC相关问题的现象分类在讲排查之前先把eMMC相关的问题现象分分类不同的现象对应不同的原因排查方向也不同。1.1 数据丢失数据丢失是最常见的现象之一表现为- 配置文件丢失或内容为空- 日志文件损坏或丢失- 数据库文件损坏无法打开- 应用数据丢失- 某个目录下的文件全部消失数据丢失通常和写入方式、突然断电、文件系统损坏有关。1.2 文件系统损坏文件系统损坏表现为- 挂载文件系统失败提示wrong fs type, bad option, bad superblock- 挂载后只读remount-ro无法写入- 文件系统出现大量错误dmesg里有EXT4-fs error、I/O error- fsck修复后仍有问题或者修复后数据丢失- 目录项损坏出现乱码文件名或无法删除的文件文件系统损坏通常和突然断电、频繁异常关机、eMMC硬件错误有关。1.3 随机读写错误随机读写错误表现为- 读写eMMC时偶尔报I/O错误时好时坏- dmesg里有mmc0: error -110 whilst initialising MMC card、mmc_blk_err_irq等错误- 读取某个文件时偶尔失败重试又成功- 写入数据后读回来数据不对位翻转- 性能时好时坏有时候读写速度骤降随机读写错误通常和eMMC健康状态坏块、寿命、硬件信号电源、信号完整性、温度有关。1.4 启动失败启动失败表现为- 系统无法从eMMC启动bootloader提示找不到eMMC- 内核启动时挂载根文件系统失败进入initramfs或panic- 启动过程中卡死在某个阶段- 有时候能启动有时候不能启动随机启动失败启动失败可能是eMMC硬件问题、bootloader配置问题、文件系统损坏、兼容性问题。1.5 性能骤降性能骤降表现为- eMMC的读写速度突然变得很慢从几十MB/s降到几MB/s甚至几百KB/s- 系统卡顿操作响应慢- 写入操作特别慢甚至卡住- 重启后可能恢复但用一段时间又变慢性能骤降通常和eMMC写满、GC垃圾回收压力大、寿命快到了、温度过高有关。1.6 eMMC无法识别eMMC无法识别表现为- 系统完全看不到eMMC/dev/mmcblk0不存在- bootloader提示no mmc card- 重新上电后可能恢复也可能一直无法识别- 换一颗eMMC就正常eMMC无法识别通常是硬件问题焊接、电源、信号、eMMC彻底损坏、兼容性问题。二、排查思路和步骤遇到eMMC相关问题不要一上来就换芯片或改硬件按照从易到难、从软件到硬件的顺序排查能少走很多弯路。第一步收集信息确认现象先把问题的现象搞清楚收集足够的信息1. 问题现象是数据丢失、文件系统损坏、读写错误、启动失败、性能骤降还是eMMC无法识别具体表现是什么2. 出现时机什么时候出现的是刚出厂就有还是用了一段时间后出现是随机出现还是固定条件下出现3. 出现频率偶尔出现还是经常出现大概多久出现一次4. 环境条件出现问题时的环境温度、电压、负载情况是高温下出现还是常温下也出现5. 产品信息产品型号、eMMC品牌型号和容量、SoC平台、内核版本、文件系统类型、eMMC使用了多久、总写入量大概多少6. 日志信息dmesg日志、系统日志、应用日志有没有相关的错误信息信息收集得越详细排查越有方向。很多人排查时跳过这一步凭感觉猜原因结果走了很多弯路。第二步检查文件系统文件系统问题是最常见的也是最容易排查的先查文件系统。1. 检查挂载状态用mount命令看文件系统是否正常挂载是不是只读挂载remount-ro。如果是只读挂载说明文件系统有错误内核为了保护数据自动改成只读。2. 检查dmesg日志看dmesg里有没有文件系统相关的错误比如EXT4-fs error、ext4_lookup、I/O error、bad block等。3. 检查文件系统状态用fsck检查文件系统注意要先卸载文件系统或者在只读模式下检查。ext4用e2fsckf2fs用fsck.f2fs。看有没有坏的inode、坏块、目录项错误。4. 检查磁盘空间和inode用df -h看磁盘空间是不是满了用df -i看inode是不是用完了。磁盘满了或inode用完了都会导致写入失败看起来像是eMMC问题。5. 检查文件系统日志ext4的日志journal是否正常有没有日志恢复的记录。突然断电后ext4会自动恢复日志如果日志损坏可能导致文件系统无法挂载。如果是文件系统问题修复文件系统fsck、重新格式化、恢复数据就可以解决。但要找到文件系统损坏的根本原因比如突然断电、频繁异常关机否则问题会反复出现。第三步检查eMMC健康状态文件系统没问题接下来检查eMMC本身的健康状态。eMMC有内部的健康信息可以通过EXT_CSD寄存器读取。1. 读取寿命估算Life Time Estimation用mmc-utils读取eMMC的寿命估算值。值从0x010%至10%使用到0x0A90%至100%使用0x0B表示超过100%。如果寿命估算值很高比如0x08以上说明eMMC快到寿命了可能出现各种问题。2. 读取预坏块计数Pre EOL Information预坏块计数有三个等级0x01正常、0x02警告10%至80%备用块被用、0x03紧急超过80%备用块被用。如果到了警告或紧急级别说明eMMC的坏块很多快不行了。3. 读取设备健康状态Device Health StatuseMMC 5.1支持更详细的健康状态信息。4. 检查坏块数量有些eMMC可以通过特殊命令读取坏块数量。坏块数量快速增加说明eMMC在快速老化。5. 做读写测试用dd、fio、mmc-utils等工具做读写测试看有没有读写错误读写速度是否正常。可以写一个大文件然后读回来校验md5sum对比看有没有数据错误。Linux下读取eMMC健康信息的命令读取EXT_CSD寄存器mmc extcsd read /dev/mmcblk0读写测试写1GB数据然后读回来校验dd if/dev/zero of/mnt/emmc/testfile bs1M count1024md5sum /mnt/emmc/testfile重新读回来对比dd if/mnt/emmc/testfile of/dev/null bs1M如果eMMC健康状态不好寿命快到了、坏块多那就是eMMC老化了需要更换eMMC并且优化使用方式减少写入、留空闲空间延长新产品的寿命。第四步检查写入方式和使用习惯eMMC健康状态还行接下来检查写入方式和使用习惯。很多eMMC问题不是eMMC本身的质量问题而是使用方式不对导致的。1. 检查写入量估算eMMC的总写入量和寿命对比。如果写入量很大比如每天写几百MB甚至几GB而eMMC是消费级TLC寿命短可能寿命快到了。2. 检查是否频繁小写入看应用是不是在频繁写小文件比如每秒写一次状态文件、频繁写日志、频繁更新配置。频繁小写入会导致写放大很大eMMC寿命急剧缩短还会导致GC压力大、性能下降。3. 检查是否写满eMMCeMMC是不是写得很满空闲空间少于10%写满后GC效率下降性能骤降磨损不均容易出问题。4. 检查临时文件是否写入eMMC临时文件日志、缓存、临时数据是不是都写到eMMC里了应该放到tmpfs内存文件系统不写入eMMC。5. 检查是否有掉电情况产品是不是经常突然断电比如直接拔电源、断电重启突然断电是文件系统损坏和数据丢失的主要原因。6. 检查挂载参数文件系统挂载时有没有加noatime不更新访问时间减少写入有没有加discard支持TRIM提高GC效率如果是写入方式或使用习惯的问题优化使用方式就可以解决减少写入、合并小写入、临时文件放tmpfs、留足够空闲空间、加掉电保护、优化挂载参数。第五步检查硬件软件和使用方式都没问题接下来检查硬件。硬件问题比较难排查但也是常见原因。1. 检查电源- 测量eMMC的电源电压VCC、VCCQ确认在规格范围内。- 测量电源纹波用示波器差分探头地线尽量短测纹波不能太大通常小于50mV峰峰值。- 检查上电时序eMMC的电源上电顺序和复位时序是否符合规格。- 检查电源IC的负载能力eMMC读写时电流变化大电源IC能不能提供足够的瞬态电流。2. 检查信号完整性- 用示波器测量eMMC的时钟、命令、数据线的波形看有没有过冲、下冲、振铃、边沿缓等问题。- 检查PCB走线eMMC的信号线有没有等长、阻抗控制、完整参考平面。- eMMC的速率HS200/HS400越高对信号完整性要求越高。如果高速模式下不稳定可以尝试降速比如降到HS200或DDR52看是否稳定。3. 检查焊接- eMMC是BGA封装检查有没有虚焊、连锡、锡珠。- 用X射线检查BGA焊点特别是问题板子。- 温度循环后BGA焊点可能出现疲劳裂纹导致接触不良随机出现问题。4. 检查温度- 测量eMMC芯片的实际温度看是不是超过了规格上限消费级0至70度工业级-25至85度或-40至85度。- 高温下eMMC的性能下降、寿命缩短、数据保持时间缩短。如果温度过高要加强散热。5. 检查干扰- eMMC的信号线附近有没有高频干扰源比如DC-DC、时钟、射频。- 电源和地有没有做好有没有地弹。如果是硬件问题针对性地解决优化电源、改善信号完整性、重新焊接、加强散热、减少干扰。第六步检查兼容性和软件硬件也没问题最后检查兼容性和软件。1. 检查eMMC是否在SoC的支持列表里有些eMMC型号和SoC存在兼容性问题需要确认eMMC在SoC的支持列表里。2. 检查内核驱动版本内核的mmc驱动版本是不是太老有没有已知的bug。升级内核或mmc驱动版本看问题是否解决。3. 检查eMMC固件版本eMMC控制器的固件版本是不是最新的有没有已知的bug。有些eMMC厂商会发布固件更新修复bug。4. 检查设备树配置设备树dts里eMMC的配置是不是正确比如总线宽度、时钟频率、驱动强度、是否支持HS400等。配置不对可能导致不稳定。5. 检查电源管理配置系统的电源管理 suspend/resume、频率调节是不是影响了eMMC的稳定性。比如suspend时eMMC断电resume时重新初始化可能出问题。6. 换一颗eMMC测试换一颗不同品牌或型号的eMMC看问题是否复现。如果换了就好说明是eMMC本身的问题或兼容性问题。三、常见原因和解决方案下面总结eMMC相关问题的常见原因和对应的解决方案方便对照排查。3.1 文件系统损坏原因- 突然断电写入过程中断电文件系统元数据损坏- 频繁异常关机直接拔电源、硬复位- eMMC硬件错误位翻转、坏块导致文件系统数据损坏- 文件系统本身的bug比较少见解决方案- 用fsck修复文件系统ext4用e2fsck -ff2fs用fsck.f2fs- 如果修复不了备份数据后重新格式化- 根本解决加掉电保护硬件大电容、用带日志的文件系统ext4/f2fs、关键数据写入后调用fsync、避免突然断电3.2 数据丢失原因- 写入过程中断电数据没写完- 文件系统损坏导致文件目录项丢失- 应用写入方式有问题写了一半崩溃、没有fsync、原子写入没做好- eMMC位翻转数据内容错误- 误删除或应用bug导致数据被覆盖解决方案- 从备份恢复数据如果有备份- 检查应用写入逻辑确保关键数据用原子写入先写临时文件写完rename、写入后fsync- 加掉电保护避免写入中断电- 如果是eMMC位翻转检查ECC是否开启、eMMC健康状态是否正常3.3 随机读写错误原因- eMMC坏块多读取坏块时出错- eMMC寿命快到了错误率增加- 电源纹波大导致读写错误- 信号完整性不好高速模式下数据错误- 温度过高eMMC错误率增加- 兼容性问题SoC和eMMC配合不好解决方案- 检查eMMC健康状态如果坏块多或寿命快到了更换eMMC- 降低eMMC速率从HS400降到HS200或DDR52看是否稳定。如果降速后稳定说明是信号完整性问题需要优化PCB- 检查电源纹波优化电源设计- 检查温度加强散热- 升级内核驱动和eMMC固件- 换用经过验证的eMMC品牌型号3.4 性能骤降原因- eMMC写满了空闲空间少GC效率下降- 频繁随机小写入GC压力大写放大大- eMMC寿命快到了坏块多读写变慢- 温度过高eMMC编程时间变长性能下降- TLC eMMC的SLC缓存满了写入速度从高速降到TLC原生速度- 文件系统碎片多虽然eMMC的物理碎片影响不大但文件系统元数据碎片可能影响性能解决方案- 清理空间留至少20%至30%的空闲空间- 优化写入方式减少随机小写入合并成大写入、顺序写入- 检查eMMC健康状态如果寿命快到了更换eMMC- 加强散热降低eMMC温度- 用f2fs文件系统对eMMC友好GC效率高- 挂载时加discard参数支持TRIM提高GC效率3.5 启动失败原因- eMMC无法识别硬件问题、eMMC损坏- bootloader配置错误分区表、启动参数- 根文件系统损坏无法挂载- 内核镜像损坏- 上电时序不对eMMC初始化失败- 温度过低或过高eMMC初始化失败解决方案- 检查eMMC是否能被识别bootloader和内核阶段- 如果eMMC能识别但无法启动检查bootloader配置、分区表、内核镜像、根文件系统- 重新烧录系统看是否能启动- 如果eMMC无法识别检查硬件电源、焊接、信号换一颗eMMC测试- 检查上电时序和温度3.6 eMMC无法识别原因- eMMC硬件损坏彻底坏了- 电源问题电压不对、上电时序不对、电源IC坏了- 焊接问题BGA虚焊、连锡- 信号完整性问题时钟或数据线有问题eMMC无法初始化- 复位信号问题复位一直拉低eMMC不工作- 兼容性问题极少数情况解决方案- 测量eMMC的电源电压和复位信号确认正常- 用示波器测量eMMC的时钟确认有时钟输出- 重新焊接eMMC或用X射线检查焊点- 换一颗eMMC测试判断是eMMC坏了还是板子问题- 检查PCB设计电源、信号、复位四、实际案例讲几个实际的eMMC问题排查案例方便理解。案例一工业网关频繁丢配置文件问题某工业网关产品现场使用3至6个月后频繁出现配置文件丢失的问题重启后需要重新配置。常温下测试复现不了。排查过程1. 检查文件系统ext4没有明显损坏。2. 检查应用写入逻辑发现配置文件每次修改都是直接打开原文件写入没有用临时文件rename的原子写入方式。3. 检查现场环境发现现场经常突然断电工业环境电源不稳定。4. 分析写入配置文件过程中突然断电文件写了一半内容损坏或为空导致配置丢失。5. 检查eMMC是消费级TLC eMMC没有掉电保护功能。解决方案1. 修改应用写入逻辑配置文件用原子写入先写临时文件config.tmp写完后fsync然后rename替换原文件config.json。rename是原子操作要么成功要么失败不会出现写了一半的情况。2. 硬件加大电容1000μF断电后提供足够能量让eMMC完成正在进行的写入。3. 换用工业级eMMCpSLC支持掉电保护。4. 配置文件定期备份丢失后可以从备份恢复。结果修改后现场再也没有出现配置文件丢失的问题。经验关键文件的写入必须用原子写入工业产品必须有掉电保护。突然断电是嵌入式产品数据丢失的头号原因。案例二eMMC用了一年后性能骤降、随机死机问题某工业HMI产品用了约一年后出现性能骤降操作卡顿、读写慢、随机死机的问题。重启后暂时恢复用一段时间又出现。排查过程1. 检查文件系统ext4没有明显损坏。2. 检查磁盘空间32GB的eMMC用了28GB空闲空间只有4GB不到15%。3. 读取eMMC健康状态寿命估算值0x0760%至70%使用预坏块计数0x02警告。4. 检查写入量产品的应用每天频繁写日志和历史数据估算每天写入约500MB一年写入约180GB。eMMC是消费级TLC写放大约3倍实际NAND写入约540GB寿命消耗快。5. 分析eMMC写满了寿命消耗大频繁写入导致GC压力大性能骤降坏块增多导致随机读写错误系统死机。解决方案1. 清理空间删除不需要的历史数据和日志空闲空间恢复到10GB以上30%以上。2. 优化应用日志先写到内存tmpfs每小时批量写入一次历史数据只保留最近3个月更早的自动删除或归档。3. 文件系统从ext4换成f2fs对eMMC更友好GC效率更高。4. 挂载参数加noatime和discard。5. 新产品换用工业级pSLC eMMC寿命更长。6. 加入eMMC健康监控寿命到80%时告警。结果优化后性能恢复正常没有再出现随机死机。eMMC寿命消耗速度大幅下降。经验eMMC不能写满至少留30%空闲空间。频繁写入会大幅缩短eMMC寿命要减少写入、批量写入。消费级TLC eMMC不适合频繁写入的工业产品。案例三低温下eMMC无法启动问题某户外工业产品常温下正常-20度以下无法启动bootloader提示找不到eMMC。恢复常温后又能正常启动。排查过程1. 低温下测量eMMC电源电压正常。2. 低温下测量eMMC时钟有时钟输出。3. 检查eMMC型号是消费级eMMC0至70度。低温下eMMC的初始化时间变长bootloader的eMMC初始化超时时间太短导致初始化失败。4. 检查bootloader配置eMMC初始化超时时间是1秒。低温下eMMC初始化需要2至3秒超时了。5. 同时检查电源低温下电解电容ESR变大电源纹波增大也影响eMMC初始化。解决方案1. 换用工业级eMMC-40至85度低温下初始化时间有保证。2. 修改bootloader延长eMMC初始化超时时间到5秒增加重试次数。3. 电源输出电容从电解电容换成陶瓷电容X7R材质低温下ESR稳定。4. 低温测试验证-40度下能正常启动。结果修改后-40度低温下产品能正常启动稳定运行。经验工业产品必须用工业级元器件包括eMMC消费级元器件的温区不够。bootloader的初始化超时时间要留裕量考虑低温下元器件初始化慢的情况。电源电容要用宽温型号。五、怎么预防eMMC问题排查是事后补救最好的方法是从设计和使用阶段就预防eMMC问题。5.1 选型阶段1. 用工业级eMMC工业产品不要用消费级eMMC。工业级eMMC用SLC/pSLC寿命长几万至十万次擦写、宽温-40至85度、有掉电保护、供货周期长5至10年。虽然贵一些但比现场出问题的代价小得多。2. 选经过验证的品牌型号优先选用SoC平台验证过的eMMC品牌型号减少兼容性问题。不要用刚出的新型号新型号可能有未发现的bug。3. 容量留裕量不要选刚好够用的容量留至少30%的空闲空间。容量大的eMMC通常性能更好、寿命更长、OP空间更多。4. 确认ECC能力确认eMMC的ECC纠错能力TLC/QLC的eMMC需要强ECCBCH 40位以上或LDPC。5. 确认健康监控支持确认eMMC支持寿命估算和预坏块计数等健康监控功能方便后续监控。5.2 硬件设计阶段1. 电源设计eMMC的电源要稳定纹波小小于50mV峰峰值瞬态响应好。去耦电容要足够每个电源引脚旁边都要有0.1μF陶瓷电容。电源IC留30%以上负载裕量。2. 信号完整性eMMC的信号线要控制阻抗通常50欧姆单端等长同一组信号长度差控制在一定范围内有完整的参考平面间距满足3W原则。HS400模式对信号完整性要求高如果PCB设计能力有限可以用HS200模式。3. 掉电保护工业产品必须有硬件掉电保护加大电容或超级电容断电后提供足够能量让eMMC完成正在进行的写入。这是预防数据丢失和文件系统损坏的最有效方法。4. 复位设计eMMC的复位信号要符合规格上电时复位脉宽足够不要和其他芯片的复位混在一起。5. 散热设计eMMC要做好散热特别是高温环境下使用的产品。eMMC温度过高会导致性能下降、寿命缩短、数据保持时间缩短。6. 测试点预留eMMC的电源、时钟、数据线要预留测试点方便调试和测试。5.3 软件设计阶段1. 文件系统选择系统分区用ext4或f2fs。写入频繁的分区优先用f2fs对eMMC友好写放大小。不要用FAT32作为系统分区没有日志断电容易损坏。2. 挂载参数优化挂载时加noatime不更新访问时间减少写入、discard支持TRIM提高GC效率。3. 减少写入- 临时文件日志、缓存、临时数据放到tmpfs内存文件系统不写入eMMC。- 减少日志写入量降低日志级别日志先写内存定期批量写入。- 避免频繁修改小文件配置文件、状态文件合并修改批量写入。- 关闭不需要的后台写入自动更新、缓存、索引等。4. 原子写入关键文件配置、数据库、重要数据的更新用原子写入先写临时文件写完fsync然后rename替换原文件。5. 关键数据fsync关键数据写入后调用fsync或fdatasync确保数据真正写入eMMC而不是只在缓存里。6. 定期备份关键数据定期备份到多个位置比如eMMC的不同分区、外部存储、云端防止eMMC损坏导致数据丢失。7. 健康监控定期读取eMMC的寿命估算和预坏块计数设置阈值告警比如寿命80%、预坏块警告提前预警寿命快到时及时更换或备份。5.4 生产和测试阶段1. 来料检验eMMC来料要检验确认是正品、型号正确、不是remark的假片或拆机片。2. 专业贴片eMMC是BGA封装要用专业的机器贴片控制焊接温度曲线不要手工焊接。贴片后用X射线检查焊点质量。3. 老化测试产品出厂前做老化测试高温老化、长时间运行提前发现eMMC的早期失效浴缸曲线的早期失效期。4. 高低温测试做高低温测试验证eMMC在整个工作温区内都能稳定工作。5. 写入测试出厂前做eMMC读写测试确认没有坏块、读写正常、性能达标。六、总结eMMC相关的问题看起来复杂其实按照系统的排查步骤从软件到硬件、从易到难一步步查大多数问题都能找到原因。核心要点总结1. 先收集信息再排查把问题现象、出现时机、频率、环境、产品信息、日志都收集清楚排查才有方向。不要凭感觉猜。2. 排查顺序文件系统→eMMC健康→写入方式→硬件→兼容性先查最容易的文件系统、健康状态再查复杂的硬件、兼容性。3. 突然断电是数据丢失和文件系统损坏的头号原因工业产品必须有硬件掉电保护大电容 文件系统日志 关键数据原子写入和fsync。4. 频繁小写入是eMMC寿命的杀手频繁小写入导致写放大大可能到10倍以上寿命急剧缩短。要减少写入、合并小写入、批量写入、临时文件放tmpfs。5. eMMC不能写满至少留20%至30%空闲空间工业产品留30%至50%。写满后GC效率下降性能骤降磨损不均。6. 工业产品用工业级eMMCSLC/pSLC、宽温、长寿命、掉电保护、长供货周期。不要用消费级TLC eMMC做工业产品省的钱不够返修的。7. 健康监控不能少定期读取eMMC的寿命估算和预坏块计数提前预警不要等eMMC突然失效了才发现。8. 预防比排查重要从选型、硬件设计、软件设计、生产测试各个阶段做好预防比事后排查划算得多。最后一句话eMMC是产品的硬盘它的稳定可靠决定了产品的稳定可靠。理解它的脾气用对方式做好保护它才能陪产品走完整个生命周期。有eMMC相关的问题欢迎评论区交流。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →