もっと詳しく

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.