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 は「追加されていないネットワークデバイスの削除中」を 2 回表示します。


ついにリモートデバッグ用に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()にブレークポイントを設定することで解決されました。

関連情報