(Linux)printk()メッセージを/ dev / consoleに送信する必要がありますか?それではなぜ彼らは現れなかったのでしょうか?

(Linux)printk()メッセージを/ dev / consoleに送信する必要がありますか?それではなぜ彼らは現れなかったのでしょうか?

私はLinuxデバイスドライバを介してLinuxカーネル開発を独学しようとしていますが、現在デバッグに関する章を読んでいます。私が読んだすべてのものでは、printk()メッセージは「コンソール」として送信されなければなりません。

問題は、xconsoleユーティリティを使用して/ dev / consoleを監視するときにpritnkステートメントを表示できないことです。私のメッセージはsyslogに表示され、dmesgを使用すると私のメッセージを見ることができます。だから私は実用的な目的でこれを尋ねるのではなく、Linuxシステムに対する私の理解のギャップを埋めるためにこれを尋ねることです。

フィルタリングしないように、printkメッセージを最高のログレベル(KERNEL_EMERG)に設定しました。 「コンソールロギングを有効にする」という機能を使用しましたが、dmesg -E効果がありませんでした。

私はカスタムカーネル5.4.55でKubuntu 20を実行しています。カーネルデバッグ設定オプションを有効にします。これは私の/proc/cmdlineファイルです。

BOOT_IMAGE=/boot/vmlinuz-5.4.55 root=UUID=3978ed71-51b0-4505-83b9-58401946ed0f ro console=tty0 vt.handoff=7

これは私の/proc/sys/kernel/printkです:

4 4 1 7

これは私のカーネル構成です。

https://pastebin.com/ijAS6tVa

ご協力ありがとうございます

編集する

@ user433151の回答に加えて、起動時にコンソールが明示的に設定されていても、printk()メッセージは現在アクティブな仮想端末にのみ表示されることがわかりました。たとえば、console=tty2bootを使用するだけでも、/dev/consoleがtty2を「指す」という事実に影響を与えるように見えますが、tty2をカーネルメッセージの「ターゲット」コンソールにすることはありません。カーネルメッセージのデフォルトの「ターゲット」コンソールは常にtty0であるように見えるため、printkメッセージがtty2に表示されるようにするには、printkメッセージが記録されたときにtty2が現在アクティブな仮想端末である必要があります。私の混乱の一部は、私のモジュールをtty1で実行してからtty2に切り替えて、私のprintkステートメントが表示されないという事実から来ています。私の解決策は、tty2でモジュールを起動するか、ioctl(TIOCL_SETKMSGREDIRECT)を使用してメッセージをリダイレクトすることです。

ベストアンサー1

xconsole (1)ユーザーモードプログラムで作成した内容のみ取得できますが/dev/consoleいいえ端末に書き込まれたすべてのカーネルメッセージ/dev/consoleは次のとおりです。タイプエイリアス(2)

printk カーネルメッセージは、次にのみ送信できます。

  1. Linux仮想端末いいね/dev/tty0(でもいいえ任意の擬似端末または端末エミュレータを使用して)(サム)。 「仮想端末」は、Linuxを実行しているPCでCtrl-Alt-Fxを使用して切り替えることができる「黒」の非GUI端末です。

  2. たとえば、シリアルコンソール/dev/ttyS0(ただし、いいえシリアルUSBコンソールまたは同様のデバイスに接続します。

  3. システムロガー(rsyslog、一部のシステム)、dmesgなどのプログラムで選択されたdmesgバッファ。

(1) xconsole擬似端末を作成し、ioctl(TIOCCONS)ユーザー領域書き込みをその端末にリダイレクトするように機能します/dev/console

(2)Linuxには、どの端末がどの端末を参照しているのかを知るためのインターフェースはありません/dev/console。その情報を取得する唯一の方法は、カーネルをライブデバッグすることです。

(サム) /dev/tty0現在「フォーカスされた」仮想端末のエイリアスです。リダイレクトカーネルメッセージを別の仮想端末として使用できますioctl(TIOCL_SETKMSGREDIRECT)

おすすめ記事