如何在 module_init() 处中断?此可加载内核模块正在阻止 SSH 登录

如何在 module_init() 处中断?此可加载内核模块正在阻止 SSH 登录

我正在将 USB 设备的驱动程序移植到 Rocky Linux 9.3。插入模块后,通过 ssh 进行的新登录将无响应。将模块列入黑名单并重新启动即可恢复正常功能。

https://github.com/izot/lon-driver


插入模块后,lsmod|grep u50“Used By”大约每 7 秒从 0 变为 1。然后,当尝试 SSH 登录时,“使用者”将介于 3 和 2 之间。

停止 SSH 登录,modprobe -r u50,重试...现在 SSH 收到 motd 但没有提示,并显示“PTY 分配请求在通道 0 上失败”。

ssh SITE "/bin/bash -i" (登录成功) (与插入模块相同)

模组信息u50

filename:       /lib/modules/5.14.0-362.18.1.el9_3.x86_64/kernel/drivers/lon/u50.ko
description:    U50 SMIP Driver 1.4 L2
alias:          tty-ldisc-28
license:        GPL
rhelversion:    9.3
srcversion:     311B898EC0CC268466EA85B
depends:
retpoline:      Y
name:           u50
vermagic:       5.14.0-362.18.1.el9_3.x86_64 SMP preempt mod_unload modversions

删除模块后,journalctl 显示“错误:openpty:无法分配内存”和“错误:session_pty_req:会话 0 分配失败”。

再次插入模块并尝试 SSH 后,journalctl 显示“NetworkManager ... manager: (lon10): new Generic device (/org/freedesktop/NetworkManager/Devices/743)”和“NetworkManager ... manager: (lon11)” :新的通用设备(/org/freedesktop/NetworkManager/Devices/744)。”

当 SSH 尝试被取消时,journalctl 会显示两次“正在删除未添加的网络设备”。


我终于设置好了 gdb 来进行远程调试。我将 src 复制到了运行 gdb 的主机。我可以在可加载模块中的某个函数处中断,但为时已晚。我需要在模块加载时中断,它会终止新的 ssh 登录。此模块用于 USB,与 ssh 无关。

我可以在 do_init_module() 处中断并逐步执行,直到 exit_to_user_mode_loop() 然后它显示“无法找到当前函数的边界”。在 module_init() 处设置断点以供将来加载不会中断。

答案1

我没有正确移植这一行,并且无法在 struct tty_ldisc_ops 中设置 .num 字段。

        //FIXME err = tty_register_ldisc(N_U50, &u50_ldisc);
        err = tty_register_ldisc(&u50_ldisc);

我的问题的另一部分(在 module_init() 处中断)是通过在 rtnl_link_register() 中设置断点来解决的。

相关内容