2012-03-02 75 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

這裏有一些更多的資源,讓你更多關於/proc/kmsg和內核日誌在中普通

  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內核編程的新成員,我無法感謝你的幫助。謝謝你,兄弟。 – 2012-03-03 05:43:34

+0

很高興我能幫助你:)歡迎來到SO! – 2012-03-03 06:11:03

1

Pavan很好的答案(教給我很多):

不同的發行版可能會將/ proc/kmsg的輸出重定向到任何他們喜歡的物理日誌文件或虛擬設備(/ dev/xxx)。但「的/ 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, 
}; 

所以你怎麼看到的輸出是這樣的:

須藤尾-f的/ proc/kmsg

但是,你只能看到生成後,您必須發出此命令的所有消息 - 在環形緩衝區之前的所有消息將不被打印出來。因此要查看物理文件輸出,可以搜索「/ proc/kmsg」的用戶:

sudo lsof | grep proc。kmsg

而且我的機器表示這樣的:

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 

所以現在是PID 1743,讓我們來看看這些文件FD由1743打開:

須藤LS -al的/ proc/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 

所以你去那裏,PID 1743是rsyslogd,和它的/ proc/kmsg輸出重定向到像在/ var/log/syslog的和/var/log/kern.log等

文件10