[紀錄文件]2015第一篇章 Kernel printk 雜談

Hi  大家好

千篇一律的第一句話開頭[謎之音:你是都沒梗了嗎?]
ㄜ.....   這個嗎!!  梗是一定有  只是都很弱.

好拉 紀錄一下之前 遇到的一些狀況

因為 某些不知名原因  小弟想要把開發平台上 Kernel 在ext4  fs 目錄夾內的 運作訊息 印出來看

也就是說要印出 printk的訊息 或是想辦法儲存起來

先總結一下  我幹了哪些傻事

以為用 sed command 把 想秀出訊息的 目錄夾內的 .c .h檔案 的printk

printk() 預設層級 是 在kernel的 .config 的 DEFAULT_MESSAGE_LOGLEVEL
在 kernel/printk.c 中被定義為整數 4,即對應KERN_WARNING
預設好像都是 define 4
把層級都從KERN_INFO換到KERN_EMERG
Linux 有八個系統 日誌層級
#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 */
#define KERN_INFO     "<6>"    /* informational */
#define KERN_DEBUG    "<7>"    /* debug-level messages */
但卻沒注意到 那個目錄 printk的訊息是用 ext4_msg
e.g.
ext4_msg(sb, KERN_ERR, "can't get new inode");

接著然後因為沒有更改 層級  所以dmesg 還是看不到(但其實是因為根本沒有存到那個log)
因為在開發版上 只有一個console  所以 先 more /proc/kmsg  再開一個終端 此招也沒用

參考 這位大大文章 和  同事建議
busybox syslogd & klogd
 仿照 鳥哥 這篇文章提到的
http://linux.vbird.org/linux_basic/0570syslog.php#syslogd_conf

開發版上有 syslogd的 daemon但是 沒有儲存 messages的log
所以修改 /etc/syslog.conf 新增一個
kern.*      /var/log/cern

這樣當你去 cat  /var/log/cern 就會有很詳細的訊息了,理論跟 dmesg的訊息很像
但是 在時間點等 細節上 會比較詳細一些


延伸參考:
http://www.embedded-bits.co.uk/2010/printk-format-specifiers/

以上 下台一鞠躬



留言