カーネル内の print の出力はどこに行くのでしょうか?
-
12-10-2019 - |
質問
Linux (特に ubuntu サーバー 9.04) 用のドライバーをデバッグしていますが、コード内にいくつかの printf ステートメントがあります。
これらのステートメントの出力はどこで確認できますか?
編集1:私がやろうとしているのは、proc ファイルシステムを使用してカーネルに書き込むことです。印刷コードは
static int proc_fractel_config_write(struct file *file, const char *argbuf, unsigned long count, void *data)
{
printk(KERN_DEBUG "writing fractel config\n");
...
ファイル /proc/net/madwifi/ath1/fractel_config を上書きしようとすると、kern.log に次のメッセージが表示されます (もちろん時間は異なります)。
[ 8671.924873] proc write
[ 8671.924919]
何か説明はありますか?
解決
それは分布に依存しますが、多くは使用します klogd(8)
カーネルからメッセージを取得し、それらをファイルにログに記録します(時には /var/log/dmesg
また /var/log/kernel
)またはシステムログを介して syslog(3)
. 。後者の場合、ログエントリが終了する場合、 syslogd(8)
.
についての1つのメモ dmesg
コマンド:カーネルメッセージは円形のバッファーに保存されるため、大量の出力が上書きされます。
他のヒント
何度も KERN_DEBUG
レベルメッセージはフィルタリングされており、ロギングレベルを明示的に増やす必要があります。あなたはシステムのデフォルトが何であるかを見ることができます /proc/sys/kernel/printk
. 。たとえば、私のシステムで:
# cat /proc/sys/kernel/printk
4 4 1 7
最初の番号は、コンソールログレベルが次のことを示しています KERN_WARNING
(見る proc(5) 詳細については、Manページ)。これの意味は KERN_NOTICE
, KERN_INFO
, 、 と KERN_DEBUG
メッセージはコンソールからフィルタリングされます。伐採レベルまたは冗長性を上げるには、使用します dmesg
$ sudo dmesg -n 7
$ cat /proc/sys/kernel/printk
7 4 1 7
ここで、レベルを7に設定します(KERN_DEBUG
)すべてのレベルのメッセージがコンソールに表示されるようにします。これを自動化するには、追加します loglevel=
n nがコンソールに行きたいログレベルであるカーネルブートパラメーターに ignore_loglevel
すべてのカーネルメッセージをコンソールに印刷します。
コマンドで出力を取得します dmesg
dmesg カーネルからのすべてのメッセージを出力します。目的のメッセージを見つけるのは難しいでしょう。より良い使い方 dmesg そして grep 組み合わせて、すべてのドライバ固有のラベルを使用します。 printk
メッセージ。そうすることで、不要なメッセージをすべて簡単に削除できます。
printk("test: hello world")
dmesg | grep test
Ubuntu 11.10および10.04 LTSでこの問題を抱えていました。前者は/edited /etc/rsyslog.d/50-default.confを編集し、rsyslogdを再起動してRsyslogを再起動しました。その後、それは機能しました。
Ubuntuが使用することに注意してください *r*SyslogdではなくSyslogd。
Kern_infoなど、Kern_debugよりも高いレベルを試すことができます。構成に応じて、最低の優先順位メッセージが表示されない場合があります。
Centos(少なくともCentos 6.6)では、出力は/var/log/メッセージになります