語法,klogd 命令行參數說明:,klogd訊息轉發,klogd核心地址解析,
語法
klogd 是一個專門截獲並記錄 Linux 核心訊息的守護進程。其命令行語法如下:
klogd[ -f file ] [ -iI ] [ -n ] [ -o ] [ -p ] [ -s ] [ -k file ] [ -v ] [ -x ] [ -2 ]
klogd[ -f file ] [ -iI ] [ -n ] [ -o ] [ -p ] [ -s ] [ -k file ] [ -v ] [ -x ] [ -2 ]
klogd 命令行參數說明:
klogd 命令行參數說明
-f file
將日誌直接記錄到指定的file中,而不是轉發到 syslogd 進程。
-i
-I
要求當前正在運行的 klogd 守護進程重新裝載核心符號表。
-i 用於讓守護進程重新裝載核心模組符號。
-I 用於讓守護進程重新裝載靜態核心符號和核心模組符號。
-n
禁止自動後台運行,在 klogd 由 init 啟動並直接被 init 控制的情況下必須使用此開關。
-o
klogd 在讀取並記錄所有核心訊息緩衝區中的訊息之後立即退出(不作為守護進程)。
-p
只要 klogd 檢測到核心訊息流中包含了一個 Oops 字元串,那么就重新載入核心符號表。
-s
可以通過兩個途徑獲取核心訊息: /proc 檔案系統和 sys_syslog 系統調用接口。雖然兩者本質上完全等價,但 klogd 會優先使用 /proc/kmsg 檔案。這個開關則強制 klogd 使用系統調用獲取核心訊息。
-k file
將指定的 file 作為核心符號表檔案,也就是System.map檔案的位置。
-v
列印版本信息後退出。
-x
忽略 EIP 轉換信息,這樣就不需要讀取 System.map 檔案。
-2
當展開符號時列印兩行,一行將地址轉換為符號,一行是原始文本。這樣就允許一些外部程式(比如ksymoops)在原始數據上做一些處理。
將日誌直接記錄到指定的file中,而不是轉發到 syslogd 進程。
-i
-I
要求當前正在運行的 klogd 守護進程重新裝載核心符號表。
-i 用於讓守護進程重新裝載核心模組符號。
-I 用於讓守護進程重新裝載靜態核心符號和核心模組符號。
-n
禁止自動後台運行,在 klogd 由 init 啟動並直接被 init 控制的情況下必須使用此開關。
-o
klogd 在讀取並記錄所有核心訊息緩衝區中的訊息之後立即退出(不作為守護進程)。
-p
只要 klogd 檢測到核心訊息流中包含了一個 Oops 字元串,那么就重新載入核心符號表。
-s
可以通過兩個途徑獲取核心訊息: /proc 檔案系統和 sys_syslog 系統調用接口。雖然兩者本質上完全等價,但 klogd 會優先使用 /proc/kmsg 檔案。這個開關則強制 klogd 使用系統調用獲取核心訊息。
-k file
將指定的 file 作為核心符號表檔案,也就是System.map檔案的位置。
-v
列印版本信息後退出。
-x
忽略 EIP 轉換信息,這樣就不需要讀取 System.map 檔案。
-2
當展開符號時列印兩行,一行將地址轉換為符號,一行是原始文本。這樣就允許一些外部程式(比如ksymoops)在原始數據上做一些處理。
klogd訊息轉發
如果 klogd 將核心訊息轉發給 syslogd 進程,那么它可以分揀出某些特定的訊息。原始核心訊息的格式如下:
Something said by the kernel.
尖括弧中的數字表示核心訊息的優先權,這些數字的定義位於 kernel.h 檔案中。當 klogd 收到核心訊息之後,將會讀取這個數字,並在將此訊息轉發給 syslogd 時按照這個數字分配適當的優先權。
如果使用 -f 將核心訊息直接記錄到特定的檔案中,那么這條訊息將保持原樣。
klogd核心地址解析
klogd 會嘗試將核心地址解析為對應的符號,如果你想得到原始的地址信息,那么可以使用"-2"開關。如果沒有使用"-k"選項,那么將會依次嘗試下面的路徑:
/boot/System.map
/System.map
/usr/src/linux/System.map
因為核心模組動態載入所以地址並不固定,這時就要使用"-i"/"-I"通知 klogd 核心模組的變化。這兩個開關都將導致當前正在運行的 klogd 守護進程重新載入核心符號表。應當在每一次載入或者卸載核心模組後立即運行下列命令:
klogd -i
-p 開關也可以用於更新核心符號表。它會讓 klogd 在檢測到保護性錯誤的時候重新載入核心符號表。使用這個開關需要小心,因為作業系統在出現保護性錯誤(protection fault)的時候已經變得不穩定了,而 klogd 必須執行系統調用才能重新裝載核心符號表,所以這樣做可能會導致更糟糕的結果。
控制台日誌等級
核心默認的控制台日誌等級是"7"(debug),也就是等級數字小於等於6的訊息(優先權更高)都會顯示在控制台上。這些不同等級所代表的意思位於 kernel.h 檔案內,這個包內的 syslog.h 中也有一份拷貝。可以使用 sysctl 來指定控制台日誌等級,這通常是在 /etc/sysctl.conf 檔案中設定的,比如下面這一行:
kernel.printk = 4 4 1 7
就是把核心的控制台日誌等級設為了"4"。
信號處理
klogd 可以回響8種信號: SIGHUP, SIGINT, SIGKILL, SIGTERM, SIGTSTP, SIGUSR1, SIGUSR2, SIGCONT 。SIGINT, SIGKILL, SIGTERM, SIGHUP 信號會讓進程優雅的正常退出。SIGTSTP 信號會讓進程停止記錄日誌並進入休眠狀態;SIGCONT 信號會讓處於休眠狀態的進程重新開始記錄日誌。組合使用 SIGSTOP 和 SIGCONT 可以在不退出進程的情況下切換日誌訊息的來源。比如需要卸載 /proc 檔案系統的時候,可以使用下面的命令:
# kill -TSTP pid
# umount /proc
# kill -CONT pid
SIGUSR1 和 SIGUSR2 用於載入/重新載入核心符號表。SIGUSR1 表示重新載入核心模組的符號信息;SIGUSR2 表示同時重新載入模組和靜態核心的符號信息。如果 System.map 檔案位置正確,那么 SIGUSR1 信號將非常有用。特別是在核心模組改變的時候。
相關檔案
/proc/kmsg
klogd 默認首選的獲取核心訊息的來源
/var/run/klogd.pid
保存 klogd 的 PID 的檔案
/boot/System.map, /System.map, /usr/src/linux/System.map
默認搜尋的核心符號表位置