openeuler-riscv / oerv-team

OERV 实习生工作中心
6 stars 35 forks source link

[BONUS] 荔枝派 4a NetworkManager 引发的血案 #836

Open misaka00251 opened 2 weeks ago

misaka00251 commented 2 weeks ago

说明

问题背景: 镜像在重启后无法正常启动,点这里下载镜像体验。

所需技能: 靠你的 Linux 使用经验 debug。

其它:

  1. 刷入后,第一次 bootup NetworkManager 是正常工作的,能获取到 IP,但之后的 bootup NetworkManager 就直接躺到超时,而又没办法 login 进去 debug(指 terminal 下跳出登录提示,输入用户名后假死,但 NetworkManager 没起来也不能 ssh 进去)。
  2. 这是 NetworkManager 在 journalctl 下的内容:

Image

  1. 已知不是 SELinux 的问题。启动选项添加 single 之后,无论启动多少次均可以通过 systemctl start NetworkManager 来启动 NetworkManager,不会遇到任何报错。

  2. 有咨询过友商,友商认为是 openEuler 系统的问题,非 lpi4a 5.10 内核的问题。

misaka00251 commented 2 weeks ago

有猜测 /etc/hostname 内容没有放到 /etc/hosts 内,我先出一版镜像测试。 6.6 内核版本的 lpi4a 不会出现这个问题,所以我觉得不大相关。

TriangleABCD commented 2 weeks ago

目前初步排查,发现Network Manager的超时等待问题发生在systemd的创建并启动各个Manager阶段,其中打印时间进度的代码所在函数在src/core/manager.c中找到。 虽然还未确定引发 timeout 改变的根本原因,但是可以顺着函数调用继续排查,争取在今日排查出超时原因,并且查找login输入用户名后的相关逻辑对应的代码。

TriangleABCD commented 2 weeks ago

在第一次启动时(或者在systemd启动时,NetworkManager开始等待前按下快捷键ctrl+alt+F9进入systemd提供的shell),使用命令systemctl disable NetworkManager禁用服务,再次启动时使用hdmi接口连接显示器,图形化登录界面可以正常登录然后进入了桌面。 然而使用串口终端,输入用户名之后仍然卡死。同时发现第一次启动时即使不登录,直接关机,二次启动时也会卡死。

总结一下情况: 首次启动 二次启动 关闭NM后二次启动
串口终端 顺利登录 输入用户名后卡死 输入用户名后卡死
图形界面 顺利登录 输入用户名密码后进入不了桌面,无法操作 顺利登录进入桌面,可以操作

接下来就尝试先用此方法进入系统桌面,然后排查journal信息。

TriangleABCD commented 1 week ago

调试方法

首次启动后,systemctl enable debug-shell.service 开启 systemd 的调试终端功能。荔枝派连接键鼠,HDMI 接口连接显示器,串口线连接 PC 的串口终端。之后就可以关机重启,此时有两种调试方法。

结果

因此,目前已经可以顺利读取到出现问题时的日志,但是这两天读取日志之后还是没找到问题根源,journalctl 的日志不够详细。

目前仅知道 systemd fork 出 NetworkManager 的进程后,NM 出现了错误,systemd 试图 kill 掉这个进程,但是每次 kill 之后发现进程未被杀死,然后就一直重复杀这个进程,直到 watchdog 检测到超时,结束这个过程。

目前仍旧没有找到导致 NetworkManager 错误的原因,我推测是某个网络硬件的初始化过程有问题。接下来的计划是阅读 NetworkManager 的相关源码,同时检查 openeuler 的初始化配置文件。

misaka00251 commented 6 days ago

目前排查出使用 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/

TriangleABCD commented 3 days ago

终端输出 openeuler-riscv login: 等待输入用户名时,终端中的进程为 agetty,此时如果不输入,该进程状态为 Sleep,是正常的等待状态。

当输入用户名后,终端卡死,此时终端中的进程为 login,状态为 Disk sleep,大概率它在等待某个 I/O 或者 syscall 结束,因此导致该进程无法被其他任何进程通过 kill 杀死,这应该就是卡死的直接原因。

那么,要追究根本原因,就是搞清楚 login 中出现了什么 I/O 事件,以及该事件为什么没有正常结束。结合之前发现的内核的问题,接下来尝试排查 login 中和设备交互的过程。

TriangleABCD commented 2 days ago

cut

重新过了一遍日志,筛选出5组可疑的报错信息。其中的第一个是和 mem 相关的错误,它在 kernel 刚启动时就报错。接下来依次排查这几个错误原因。

xmzzz commented 15 hours ago

已定位到和 gpu 驱动有关,具体原因还未知。

misaka00251 commented 15 hours ago

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.

xmzzz commented 15 hours ago

范围再缩小些,跟这个驱动模块有关: 5.10.113-6.oe2403.riscv64/kernel/drivers/gpu-viv/galcore.ko

misaka00251 commented 12 hours ago

升级 SDK 至出问题的版本 w/ defconfig: https://repo.tarsier-infra.isrc.ac.cn/openEuler-RISC-V/devel/20240626/v0.2/lpi4a_thead/

我这边测试没有问题,需要找别的设备复现一下。

TriangleABCD commented 11 hours ago

测试了https://repo.tarsier-infra.isrc.ac.cn/openEuler-RISC-V/devel/20240626/v0.2/lpi4a_thead/版本,测试没有问题,重启之后可以正常登录。