カーネルに対する printk() は、ユーザー空間に対する printf() と同じです。 printk() で書き込んだ行は、dmesg コマンドで表示できます。出力するメッセージの重要度に応じて、include/linux/kern_levels.h で定義されている 8 つのログ レベル メッセージとその意味を選択できます。
printk の構文は次のとおりです。
printk ("log level" "message", <arguments>);
以下は、カーネル ログ レベルのリストです。これらの各レベルは文字列内の数値に対応し、その優先度は数値の値に反比例します。たとえば、0 は優先度が高くなります:
#define KERN_EMERG "<0>" /* system is unusable*/ #define KERN_ALERT "<1>" /* action must be taken immediately*/ #define KERN_CRIT "<2>" /* critical conditions*/ #define KERN_ERR "<3>" /* error conditions*/ #define KERN_WARNING "<4>" /* warning conditions*/ #define KERN_NOTICE "<5>" /* normal but significant condition*/ #define KERN_INFO "<6>" /* informational*/ #define KERN_DEBUG "<7>" /* debug-level messages*/
各ログ レベルが数字に対応し、数字が小さいほどメッセージの重要性が高いことがわかります。レベルは、コンソールでユーザーに何を表示し、何を表示しないかを決定するのに役立ちます。
すべてのコンソールには、コンソール ログ レベルと呼ばれるログ レベルがあり、ログ レベル番号がコンソール ログ レベルより小さいメッセージはコンソールに表示され、ログ レベル番号がコンソール ログ レベル以上の他のメッセージがログに記録されます。コマンド「dmesg」を使用して調べることができるカーネルログで。
コンソールのログレベルは、ファイル /proc/sys/kernel/printk を調べることで見つけることができます。
$ cat /proc/sys/kernel/printk 4 4 1 7
出力の最初の数字はコンソール ログ レベル、2 番目はデフォルトのログ レベル、3 番目は最小ログ レベル、4 番目は最大ログ レベルです。
ログレベル 4 は KERN_WARNING に対応します。したがって、ログ レベル 3、2、1、および 0 のメッセージはすべて画面に表示され、ログに記録されます。ログ レベル 4、5、6、7 のメッセージのみがログに記録され、「dmesg」を使用して表示できます。 /P>
コンソール ログ レベルは、proc エントリに書き込むことで変更できます:
$ echo "6" > /proc/sys/kernel/printk $ cat /proc/sys/kernel/printk 6 4 1 7
これで、コンソール ログ レベルが 6 (KERN_INFO) に設定されました。次のモジュールを使用してロギングをテストできます。
# vi hello.c: #include<linux/kernel.h> #include<linux/module.h> #include<linux/init.h> static int hello_init(void) { printk(KERN_WARNING "Hello, world \n "); return 0; } static void hello_exit(void) { printk(KERN_INFO "Goodbye, world \n"); } module_init(hello_init); module_exit(hello_exit);
init 関数で呼び出される printk は、ログ レベルである KERN_WARNING と、コンソール ログ レベルである 6 未満を使用するため、画面に表示されるはずです。
exit 関数で使用される printk は、ログ レベル 6 の KERN_INFO であり、コンソール ログ レベルと同じであるため、画面に表示されません。
注意 :GUI の端末にメッセージが表示されないため、テキスト モードにログインするだけで、コードの動作をテストできます。メイクファイル:
ifneq ($(KERNELRELEASE),) obj-m := hello.o else KERNELDIR ?= /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: make -C $(KERNELDIR) M=$(PWD) modules clean: $(MAKE) -C $(KERNELDIR) M=$(PWD) clean endif
コンパイルして挿入:
$ make $ insmod hello.ko [5377.966743] Hello world
hello world が画面に表示されているのがわかります。
$ rmmmod hello $ dmesg| tail -2 [5424.190552] Good bye world
good bye world メッセージはログに記録されますが、画面には出力されませんが、ログで確認できます。したがって、printk とコンソール ログ レベルを使用して、ユーザーに表示されるカーネル メッセージを制御できます。
最終的な考え
カーネルは printk 関数を使用します。これは、標準 C ライブラリからの printf 関数呼び出しに構文的に非常に似ていますが、オプションのログ レベルが追加されています。許可されている形式は、Documentation/printk-formats.txt の下のカーネル ソースに記載されています。
次の表に、printk で使用可能なログ レベルを示します。
タイプ | シンボル | 説明 |
---|---|---|
緊急事態 | KERN_EMERG | システムが不安定でクラッシュしそうです |
アラート | KERN_ALERT | 早急な対応が必要です |
クリティカル | KERN_CRIT | 重大なソフトウェアまたはハードウェアの障害 |
エラー | KERN_ERR | エラー状態 |
警告 | KERN_WARNING | 深刻なものではありませんが、問題を示している可能性があります |
お知らせ | KERN_NOTICE | 重大なことではありませんが、ユーザーは注意する必要があります |
情報 | KERN_INFO | システム情報 |
デバッグ | KERN_DEBUG | デバッグ メッセージ |
ログ レベルが指定されていない場合、カーネル構成で構成されているデフォルトのログ メッセージが使用されます。デフォルトでは、これは KERN_WARNING です。