module_init()에서 중단하는 방법은 무엇입니까? 이 로드 가능한 커널 모듈은 SSH 로그인을 차단하고 있습니다.

module_init()에서 중단하는 방법은 무엇입니까? 이 로드 가능한 커널 모듈은 SSH 로그인을 차단하고 있습니다.

Rocky Linux 9.3에 USB 장치 드라이버를 포팅하려고 합니다. 모듈을 삽입한 후 SSH를 통한 새 로그인이 응답하지 않게 됩니다. 모듈을 블랙리스트에 추가하고 다시 시작하면 정상적인 기능이 복원됩니다.

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


모듈이 삽입되면 lsmod|grep u50 "Used By"는 약 7초마다 0에서 1로 변경됩니다. 그런 다음 SSH를 시도할 때 "주제"는 3과 2 사이가 됩니다.

SSH 로그인을 중지하고 modprobe -r u50을 입력하고 다시 시도하십시오. 이제 SSH는 프롬프트 없이 motd를 수신하고 "채널 0에서 PTY 할당 요청이 실패했습니다"라는 메시지가 표시됩니다.

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 ... 관리자: (lon10): 새 일반 장치 (/org/freedesktop/NetworkManager/Devices/743)" 및 "NetworkManager ... 관리자: (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()에 중단점을 설정하여 해결되었습니다.

관련 정보