2012-03-02 40 views
15

मैं एक लिनक्स चरित्र ड्राइवर लिख रहा हूं जो उपयोगकर्ता स्थान में सिस्टम लॉग मुद्रित कर सकता है। जैसे ही 'dmesg' कमांड करता है। मैंने सीखा है कि हम जिस प्रिंट को 'प्रिंटक' के साथ प्रिंट करते हैं, उसे रिंग बफर नामक एक स्थान पर भेजा जाएगा। तो मेरे पास प्रश्न हैं:लिनक्स कर्नेल स्पेस के भीतर रिंग बफर को कैसे पढ़ा जाए?

  1. क्या कर्नेल स्पेस के अंदर रिंग बफर है?
  2. यदि हां, तो मैं कर्नेल स्पेस के अंदर रिंग बफर कैसे पढ़ सकता हूं? (मैं dmesg.c के स्रोत कोड को पढ़ने के लिए कोशिश की है। लेकिन यह मदद नहीं की।)

उत्तर

37

आप के लिए क्या देख रहे हैं /proc/kmsg है। यह कर्नेल रिंग बफर है!

  1. हाँ, यह कर्नेल स्पेस के अंदर है। इसे पढ़ने की कोशिश कर रहे किसी भी प्रक्रिया में इसे पढ़ने के लिए सुपर उपयोगकर्ता विशेषाधिकार होना चाहिए!

  2. इसे रिंग बफर कैसे पढ़ा जाए? यहाँ आईबीएम डेवलपर

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

कमाल! बहुत ही पेशेवर और सहायक उत्तर! आप देखते हैं, मैं लिनक्स कर्नेल प्रोग्रामिंग के लिए सिर्फ एक नया कॉमर हूं, मैं आपकी मदद की अधिक सराहना नहीं कर सकता। आपको धन्यवाद। –

+0

खुशी है कि मैं आपकी मदद कर सकता हूं :) एसओ में आपका स्वागत है! –

1
में /proc/kmsg और कर्नेल प्रवेश के बारे में आप अधिक जानकारी प्राप्त करने के लिए कुछ और संसाधन हैं

इस पवन के बहुत अच्छा जवाब देने के लिए आगे है (मुझे बहुत कुछ सिखाया):

अलग distro किसी भी शारीरिक लॉग फाइल या आभासी उपकरणों के लिए/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, 
}; 

तो आप कैसे देखते हैं उत्पादन यह है:

sudo पूंछ -f/proc/kmsg

लेकिन आप केवल सभी संदेशों को उत्पन्न करने के बाद आप इस आदेश जारी किए गए हैं देख सकते हैं - अंगूठी बफर के सभी पिछले संदेश मुद्रित नहीं किया जाएगा। और इसलिए भौतिक फ़ाइल आउटपुट देखने के लिए, आप "/ proc/kmsg" के उपयोगकर्ता की खोज कर सकते हैं:

sudo lsof | grep proc।

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 है, देखते हैं फ़ाइलों 1743 द्वारा खोला एफडी करते हैं:: kmsg

और मेरे मशीन इस संकेत दिया

sudo 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 

और इसलिए वहाँ तुम जाओ, पीआईडी ​​1743 rsyslogd है, और यह/var/log/syslog और /var/log/kern.log आदि

की तरह फाइलों को/proc/kmsg के उत्पादन अनुप्रेषित 10