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」を使用して表示できます。
コンソールログレベルは、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は、ログレベルであり、コンソールログレベルである6未満であるため、画面に表示されるはずのKERN_WARNINGを使用します。
終了機能で使用されるprintkは、コンソールログレベルと同じログレベル6であるKERN_INFOであるため、画面に表示されないようにする必要があります。
ノート:GUIの端末にはメッセージが表示されないため、テキストモードにログインするだけでコードの動作をテストできます。
Makefile:
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
画面にHelloWorldが印刷されているのがわかります。
$ rmmmod hello $ dmesg| tail -2 [5424.190552] 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です。
The post printkとコンソールのログレベル–オタク日記 appeared first on Gamingsym Japan.