You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

DoA路由器Linux启动挂死问题排查:如何获取详细控制台日志及U-Boot诊断方法

DoA路由器Linux启动挂死问题排查:如何获取详细控制台日志及U-Boot诊断方法

看起来你碰到了Linux启动到应用阶段后挂死自动重启的棘手问题,结合你描述的U-Boot正常、RS232串口能交互的情况,咱们从获取更详细启动日志U-Boot层面诊断两个方向来梳理解决方案:

一、获取Linux启动阶段的详细控制台日志

你之前尝试的console=yes参数不对,内核识别的console参数需要指定具体的串口设备和波特率,还要加上能输出早期内核日志的参数,具体步骤如下:

  1. 查看当前bootargs参数
    在U-Boot命令行输入:

    printenv bootargs
    

    先确认当前的启动参数配置,重点看是否有正确的console设置。

  2. 修改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:开启内核的调试日志,输出更多细节
  3. 保存参数并重启测试

    saveenv
    boot
    

    这时候你应该能看到比之前多得多的启动日志,甚至能定位到挂死前执行的最后一个步骤,比如某个应用初始化失败、文件系统挂载问题等。

  4. 额外检查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 0x6412
    
  • PCIe状态检查
    你的日志里出现了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

火山引擎 最新活动