DoA路由器Linux启动挂死问题排查:如何获取详细控制台日志及U-Boot诊断方法
看起来你碰到了Linux启动到应用阶段后挂死自动重启的棘手问题,结合你描述的U-Boot正常、RS232串口能交互的情况,咱们从获取更详细启动日志和U-Boot层面诊断两个方向来梳理解决方案:
一、获取Linux启动阶段的详细控制台日志
你之前尝试的console=yes参数不对,内核识别的console参数需要指定具体的串口设备和波特率,还要加上能输出早期内核日志的参数,具体步骤如下:
查看当前bootargs参数
在U-Boot命令行输入:printenv bootargs先确认当前的启动参数配置,重点看是否有正确的console设置。
修改bootargs开启详细日志
输入以下命令调整参数(注意替换波特率为你Putty使用的数值,比如115200;root设备要对应你的路由器存储,比如SD卡可能是/dev/mmcblk0p2,NAND可能是/dev/mtdblock2,如果不确定可以先保留原root参数,只加console和debug相关):setenv bootargs console=ttyS0,115200 earlyprintk debug ${bootargs}console=ttyS0,115200:指定串口0为控制台,波特率匹配你的串口工具earlyprintk:让内核在启动早期就把日志输出到串口,不会等到初始化后期才输出debug:开启内核的调试日志,输出更多细节
保存参数并重启测试
saveenv boot这时候你应该能看到比之前多得多的启动日志,甚至能定位到挂死前执行的最后一个步骤,比如某个应用初始化失败、文件系统挂载问题等。
额外检查U-Boot的stdout设置
如果还是看不到完整日志,确认U-Boot的输出设备是否是串口:printenv stdout如果输出不是
serial,执行以下命令修改:setenv stdout serial saveenv
二、U-Boot内可用的诊断命令
除了日志,你还可以在U-Boot里做一些硬件和镜像的诊断,排除硬件故障或镜像损坏的可能:
内存完整性检查
如果U-Boot支持memtest命令(大部分版本都支持),可以测试指定范围的内存:memtest 80000000 100000上面的命令是测试从
0x80000000开始的1MB内存(0x100000字节),如果有错误会直接提示。如果没有memtest,可以用mw写入数据再用md读取对比:mw 80000000 deadbeef 1000 # 往0x80000000写入1000个deadbeef值 md 80000000 100 # 读取该地址内容,检查是否和写入一致存储设备校验
如果你是从MMC/SD卡加载内核,先检查存储设备状态:mmc info然后读取几个扇区测试读写是否正常:
mmc read 81000000 0 10 # 从MMC第0扇区读16个扇区到0x81000000 md 81000000 100 # 读取内容确认是否正确内核镜像与DTB校验
加载内核和DTB后,计算校验和和官方提供的对比,排除镜像损坏:# 计算内核镜像MD5(加载后filesize变量会自动设置为镜像大小) md5sum 81000000 ${filesize} # 计算DTB的MD5(根据你的日志,DTB结束地址是0x90006411,大小是0x6412字节) md5sum 90000000 0x6412PCIe状态检查
你的日志里出现了PCIe0: pcie@3400000 Root Complex: no link,可以用U-Boot命令检查PCIe枚举情况:pci enum如果枚举不到设备,可能是PCIe硬件连接问题,或者需要在U-Boot里添加PCIe初始化参数。
看门狗排查
挂死重启可能是看门狗超时触发的,先检查U-Boot里的看门狗设置:printenv watchdog如果有开启的看门狗参数,暂时关闭测试:
setenv watchdog 0 saveenv boot如果不再重启,说明是看门狗配置问题,比如内核初始化看门狗的时机太晚导致超时。
备注:内容来源于stack exchange,提问作者Mihail Dobrolitsky




