前言
?? 這篇博客來聊一聊Linux內核打印。
?? 嵌入式驅動學習專欄將詳細記錄博主學習驅動的詳細過程,未來預計四個月將高強度更新本專欄,喜歡的可以關注本博主并訂閱本專欄,一起討論一起學習。現在關注就是老粉啦!
目錄
- 前言
- 1. dmesg指令——查看內核打印信息
- 1.1 dmesg基本使用
- 1.2 dmesg進行關鍵詞查找
- 1.3 實時打印最后N行
- 1.4 kmsg
- 2. printk函數
- 查看內核打印等級
- 調整內核打印等級
- 使用方法
- 問題
- 參考資料
1. dmesg指令——查看內核打印信息
1.1 dmesg基本使用
?? dmesg
是Linux系統重查看內核日志的使用工具,允許查看系統內核的輸出消息,包括引導信息,硬件檢測,設備驅動和系統錯誤等,通過dmesg
可以追蹤系統啟動過程的事件,排查故障。
?? 我們在啟動linux系統的時候會有一連串的信息打印出來,如果我們后續想要再看一次啟動的信息,就可以用dmesg
回顯一下,內核將打印的信息存儲到ring buffer
中,我使用的是MobaXterm
,在其中的控制臺輸入dmesg
查看ring buffer
中存儲的啟動信息:
?? 回車后就會顯示如下的信息,就會打印出啟動的信息:
?? 后面可以跟一些參數,常用的參數如下所示:
-C,清除內核環形緩沖區(ring buffer)
-c ,讀取并清除所有消息
-T,顯示時間戳
?? 使用dmesg -c
打印內核信息后,再次輸入dmesg
就讀不到了,因為被清除了
1.2 dmesg進行關鍵詞查找
?? dmesg
可以與grep
組合使用,查找關鍵詞,比如我們要查找與cpu相關的信息,可以使用如下命令,不區分大小寫查找CPU相關信息:
dmesg | grep -i cpu
1.3 實時打印最后N行
?? 實時監控查看日志末尾N行可以用以下指令,查看末尾的N行,結果是一致顯示的,每隔2s顯示一次
watch “dmesg | tail -5”
1.4 kmsg
?? 內核把所有的打印信息會輸出到循環緩沖區log_buf,為了方便在用戶控件讀取內核打印信息,Linux內核驅動將該循環緩沖區映射到/proc目錄下的文件節點kmsg中,通過cat指令讀取log Buffer時可以不斷等待新的log,所以訪問/pro/kmsg的方式適合長時間讀取log。
?? 使用以下指令讀取kmsg,沒有新的內核打印信息時會阻塞。
cat /proc/kmsg
?? 如下就是處于阻塞狀態:
2. printk函數
查看內核打印等級
?? 內核日志的打印由相應的打印等級來控制,可以通過調整內核打印等級來控制打印日志的輸出:
cat /proc/sys/kernel/printk
?? 這四個數字分別對應 console_loglevel
、default_message_loglevel
、minimum_console_loglevel
、default_console_loglevel
終端打印類型 | 對應類型說明 |
---|---|
console_loglevel | 只有當printk打印消息的log優先級高于console_loglevel時,才能輸出到終端上 |
default_message_loglevel | printk打印消息時默認的log等級 |
minimum_console_loglevel | console_loglevel 可以被設置的最小值 |
default_console_loglevel | console_loglevel的缺省值 |
?? printk
的四個等級意味著,只有優先級高于KERN_DEBUG(7)
的打印消息才能輸出到終端
調整內核打印等級
?? 通過echo指令進行修改,如下所示,將當前的日志級別修改為4,最后通過cat查看發現第一個數變成了4:
echo 4 > /proc/sys/kernel/printk
?? 也可以一次性改變多個值,如下所示:
echo 4 2 0 6 > /proc/sys/kernel/printk
?? 這種方法重啟內核后會重新變為 7 4 1 7,也就是說重啟內核后需要重新修改。
使用方法
?? printk
函數就類似于printf
函數,不過printf
函數用于應用層,是用戶空間的打印函數,printk
是內核空間的打印函數。
?? 可以利用printk
函數打印一些內核的提示信息。
printk("led driver and device has matched!\r\n");
問題
?? 顯示invalid option
?? 有大佬知道這個問題是為什么嘛,求指導 T_T
參考資料
[1] 深入了解Linux下的dmesg指令:查看系統內核日志的利器
[2] Linux命令之dmesg命令