2012-03-02 10 views
15

私は、ユーザ空間のシステムログを印刷できるLinuxキャラクタドライバを書いています。コマンド 'dmesg'と同じように。 「printk」で印刷したすべてのログは、リングバッファという名前のスペースに送られることがわかりました。だから質問があります:Linuxカーネル空間内でリングバッファを読み取る方法は?

  1. カーネルスペース内にリングバッファがありますか?
  2. もしそうなら、どのようにしてカーネルスペース内でリングバッファを読むことができますか? (私はdmesg.cのソースコードを読もうとしましたが、助けにはなりませんでした。)

答えて

37

あなたが探しているものは/proc/kmsgです。これはカーネルリングバッファです!

  1. はい、これはカーネルスペースの内側です。それを読み込もうとするプロセスには、それを読むためのスーパーユーザ特権​​が必要です。

  2. どのようにリングバッファを読み取るのですか?ここでは、IBM developerWorksの

Reading the Kernel Ring Buffer

dmesgからの美しいイラストは、あなたの最初のリゾートになります! dmesgはどのようにタスクを達成しますか? syslog()への電話で! syslogはどのように仕事をしていますか?システムコールインタフェースを介してdo_syslog()を呼び出します。 do_syslog()は、仕上げ動作がthisのように行われます。ここで

は一般 -

  1. http://www.makelinux.net/ldd3/chp-4-sect-2

  2. http://www.ibm.com/developerworks/linux/library/l-kernel-logging-apis/index.html

  3. http://oguzhanozmen.blogspot.in/2008/09/kernel-log-buffering-printk-syslog-ng.html

+0

すごい!非常に専門的で有用な答え!あなたは、私はLinuxカーネルプログラミングのちょうど新しい仲間に過ぎません、あなたの助けに感謝することはできません。ありがとう、あなた。 –

+0

うれしい私はあなたを助けることができました:)ようこそ! –

1
/proc/kmsgとカーネルのログについてのあなたの詳細情報を取得するために、いくつかのより多くの資源であります

これはPavanの非常に良い答えにさらにですが(私をたくさん教え):

異なるディストリビューションは、彼らが好き(は/ dev/XXX)任意の物理ログファイルまたは仮想デバイスには/ proc/kmsgの出力をリダイレクトすることがあります。カーネルはそのリングバッファの動作を実装するので、しかし、「/ procの/ kmsgには、」カーネルログのオリジナルソースは、ある内部FSの/ proc/kmsg.c:

static const struct file_operations proc_kmsg_operations = { 
     .read   = kmsg_read, 
     .poll   = kmsg_poll, 
     .open   = kmsg_open, 
     .release  = kmsg_release, 
     .llseek   = generic_file_llseek, 
}; 

ですから、出力がこれです見る方法:

のsudoは、tail -f/procの/ kmsg

しかし、あなただけがこのコマンドを発行した後に生成されたすべてのメッセージを参照することができます - リングバッファ内のすべての以前のメッセージがプリントアウトされることはありませんが。物理ファイルの出力を見るために、 "/ proc/kmsg"のユーザを検索することができます:

sudo lsof | grep proc。kmsg

そして、私のマシンは、この指示:

にsudo lsの-al/procの/ 1743/FD

:だから今、それはPID 1743で

rsyslogd 1743    syslog 3r  REG    0,3   0 4026532041 /proc/kmsg 
in:imuxso 1743 1755   syslog 3r  REG    0,3   0 4026532041 /proc/kmsg 
in:imklog 1743 1756   syslog 3r  REG    0,3   0 4026532041 /proc/kmsg 
rs:main 1743 1757   syslog 3r  REG    0,3   0 4026532041 /proc/kmsg 

を、のファイルが1743で開かれたfdを見てみましょうあなたが行くので、そこ

lrwx------ 1 root root 64 Dec 11 08:36 0 -> socket:[14472] 
l-wx------ 1 root root 64 Dec 11 08:36 1 -> /var/log/syslog 
l-wx------ 1 root root 64 Dec 11 08:36 2 -> /var/log/kern.log 
lr-x------ 1 root root 64 Dec 11 08:36 3 -> /proc/kmsg 
l-wx------ 1 root root 64 Dec 11 08:36 4 -> /var/log/auth.log 

そして、1743 pidがrsyslogdされ、そしてそれはなどは/ var/log/syslogのと/var/log/kern.log

のようなファイルには/ proc/kmsgの出力をリダイレクト10
関連する問題