Open misaka00251 opened 2 weeks ago
有猜测 6.6 内核版本的 lpi4a 不会出现这个问题,所以我觉得不大相关。/etc/hostname
内容没有放到 /etc/hosts
内,我先出一版镜像测试。
目前初步排查,发现Network Manager的超时等待问题发生在systemd的创建并启动各个Manager阶段,其中打印时间进度的代码所在函数在src/core/manager.c中找到。
虽然还未确定引发 timeout
改变的根本原因,但是可以顺着函数调用继续排查,争取在今日排查出超时原因,并且查找login输入用户名后的相关逻辑对应的代码。
在第一次启动时(或者在systemd启动时,NetworkManager开始等待前按下快捷键ctrl+alt+F9
进入systemd提供的shell),使用命令systemctl disable NetworkManager
禁用服务,再次启动时使用hdmi接口连接显示器,图形化登录界面可以正常登录然后进入了桌面。 然而使用串口终端,输入用户名之后仍然卡死。同时发现第一次启动时即使不登录,直接关机,二次启动时也会卡死。
总结一下情况: | 首次启动 | 二次启动 | 关闭NM后二次启动 | |
---|---|---|---|---|
串口终端 | 顺利登录 | 输入用户名后卡死 | 输入用户名后卡死 | |
图形界面 | 顺利登录 | 输入用户名密码后进入不了桌面,无法操作 | 顺利登录进入桌面,可以操作 |
接下来就尝试先用此方法进入系统桌面,然后排查journal信息。
调试方法
首次启动后,systemctl enable debug-shell.service
开启 systemd
的调试终端功能。荔枝派连接键鼠,HDMI 接口连接显示器,串口线连接 PC 的串口终端。之后就可以关机重启,此时有两种调试方法。
关闭 Network Manager
,则显示器中的图形化界面可以登录并进入桌面;串口终端中没有 Network Manager
的等待时间,但是 login 时还是卡死。此时图形界面的终端中 journalctl -f
查看实时日志。
不关闭 Network Manager
,则两个终端都无法顺利登录,且有等待时间。systemd
启动时,键盘快捷键 ctrl+alt+f9
直接进入调试终端,然后在调试终端中 journalctl -f
查看实时日志并对比串口终端中的情况。
结果
因此,目前已经可以顺利读取到出现问题时的日志,但是这两天读取日志之后还是没找到问题根源,journalctl
的日志不够详细。
目前仅知道 systemd
fork 出 NetworkManager
的进程后,NM
出现了错误,systemd
试图 kill 掉这个进程,但是每次 kill 之后发现进程未被杀死,然后就一直重复杀这个进程,直到 watchdog
检测到超时,结束这个过程。
目前仍旧没有找到导致 NetworkManager
错误的原因,我推测是某个网络硬件的初始化过程有问题。接下来的计划是阅读 NetworkManager
的相关源码,同时检查 openeuler
的初始化配置文件。
目前排查出使用 3 月的的 Linux SDK 生成的镜像不会出现这个问题,但使用最新的 Linux SDK 1.5.4 会出现这个问题。
上一版本 kernel: https://gitee.com/misaka00251/th1520-kernel/commit/c96750c24b57e1662092b83e5800c318d6c7d59f 目前出问题的 kernel: https://gitee.com/misaka00251/th1520-kernel/tree/lpi4a_240604/
终端输出 openeuler-riscv login:
等待输入用户名时,终端中的进程为 agetty
,此时如果不输入,该进程状态为 Sleep
,是正常的等待状态。
当输入用户名后,终端卡死,此时终端中的进程为 login
,状态为 Disk sleep
,大概率它在等待某个 I/O 或者 syscall 结束,因此导致该进程无法被其他任何进程通过 kill
杀死,这应该就是卡死的直接原因。
那么,要追究根本原因,就是搞清楚 login
中出现了什么 I/O 事件,以及该事件为什么没有正常结束。结合之前发现的内核的问题,接下来尝试排查 login
中和设备交互的过程。
重新过了一遍日志,筛选出5组可疑的报错信息。其中的第一个是和 mem 相关的错误,它在 kernel 刚启动时就报错。接下来依次排查这几个错误原因。
已定位到和 gpu 驱动有关,具体原因还未知。
Bump SDK version from 1.2.1 to 1.4.2, booted up with no problems: https://repo.tarsier-infra.isrc.ac.cn/openEuler-RISC-V/devel/20240626/v0.1/lpi4a_thead/
BTW, I updated defconfig.
范围再缩小些,跟这个驱动模块有关: 5.10.113-6.oe2403.riscv64/kernel/drivers/gpu-viv/galcore.ko
升级 SDK 至出问题的版本 w/ defconfig: https://repo.tarsier-infra.isrc.ac.cn/openEuler-RISC-V/devel/20240626/v0.2/lpi4a_thead/
我这边测试没有问题,需要找别的设备复现一下。
测试了https://repo.tarsier-infra.isrc.ac.cn/openEuler-RISC-V/devel/20240626/v0.2/lpi4a_thead/版本,测试没有问题,重启之后可以正常登录。
说明
问题背景: 镜像在重启后无法正常启动,点这里下载镜像体验。
所需技能: 靠你的 Linux 使用经验 debug。
其它:
已知不是 SELinux 的问题。启动选项添加 single 之后,无论启动多少次均可以通过
systemctl start NetworkManager
来启动 NetworkManager,不会遇到任何报错。有咨询过友商,友商认为是 openEuler 系统的问题,非 lpi4a 5.10 内核的问题。