先介紹klogd是因爲當一開始寫入/var/log/message時,klogd所記錄的信息會比syslogd 的順序優先,原因是klogd所記錄的是尚未進入操作系統的信息,但其實一開始的這些信息並不是由klogd所記錄的,而是自加載kernel 時,就已經開始記錄的。在系統尚未進入操作系統階段,還在加載kernel及執行initrd時,會將信息先記錄在/proc/kmsg文件中(因爲在 initrd階段沒有實體硬盤可供記錄),等進入操作系統執行完klogd後,klogd再將/proc/kmsg的所有內容全數填入/var/log /message文件中,這也是爲何在/var/log/message文件的一開始,依然可以看到剛開機在加載kernel以及initrd階段的信息 (如圖5-13中連CPU的啓用都看得到,信息中也註明了是kernel的信息)。
在klogd填入所有kernel加載及initrd階段的信息之後,就進入下面介紹klogd時所描述的行爲。
from << Linux安全體系分析與編程 >> 倪繼利
2.1.2 syslog系統構架
內核和任何程序都可通過syslog系統記錄事件消息,並將消息寫入到一個文件或設備中,還可以通過網絡進行傳送。syslog系統構架如圖2-1 所示。
在圖2-1中,klogd後臺進程監聽和得到內核信息,併發送到syslogd後臺進程。syslogd監聽和處理來自syslog庫API的所有 消息,並輸出到控制檯或指定文件中。
在內核,函數printk將消息寫入到一個長度爲LOG_BUF_LEN字節的循環緩衝區中。如果循環緩衝區填滿了,printk就繞回緩衝區的開 始處填寫新數據,klogd後臺進程讀取循環緩衝區中內核消息,並分發到syslogd。
1.系統調用sys_syslog
頭文件sys/klog.h提供了系統調用sys_syslog,它從內核的printk環形緩衝區讀取的消息。當環形緩衝區爲空時,它會阻塞等 待。
2.後臺進程klogd
後臺進程klogd調用sys syslog讀取內核的消息。klogd允許內核消息打印在系統終端上,優先級小於7的任何消息都可在終端上打印。優先級爲7的消息是調試消息,不能出現 在終端上,將由syslogd後臺定向到文件中。
由內部錯誤條件引發的消息是非常重要的,開發者需要分析這些消息來判定出錯的原因。錯誤消息以原始數據出現,需要通過符號表映射文件轉換成可讀的符 號信息。程序編譯時會產生符號表映射文件,它列出了重要變量和函數的地址位置。內核編譯產生的符號映射文件爲system.map,後臺進程klogd通 過system.map文件將原始數據轉成符號信息;然後,在系統終端打印或通過syslog庫函數傳遞給syslogd後臺。
如果沒有運行klogd,數據將保留在循環緩衝區中,直到某個進程讀取或緩衝區溢出爲止。
還可通過讀取/proc/kmesg文件獲得調試信息。對/proc/kmesg進行讀操作時,日誌緩衝區中被讀取的數據就不再保留,而sys syslog系統調用卻能隨意地返回日誌數據,並保留這些數據以便其他進程也能使用。
klogd指定-f (file)選項,可將消息保存到某個特定的文件中,還可修改/etc/syslog.conf來設置消息存放地點。
3.syslog庫API
syslog庫API在syslog.h文件中定義,它提供了函數openlog、syslog和closelog用來將應用程序中的日誌消息寫入 日誌系統。例如:應用程序su的打印日誌消息函數列出如下:
#include |
4.後臺進程syslogd
後臺進程syslogd根據配置文件/etc/syslog.conf將消息輸出到指定存放地點。配置文件syslog.conf定義每類消息的存 放地點。通常情況下,syslog信息寫入到/var/adm或/var/log目錄下的信息文件(messages.*)中。一個典型的syslog記 錄包括生成程序的名字和一個文本信息。
syslog.conf文件的每一行對每類消息都提供一個選擇域和一個動作域,由tab隔開;選擇域指明消息的類型和優先級,動作域指明 syslogd執行的動作。
例如,下面配置表示所有郵件消息記錄到一個文件中:
#Log all the mail messages in one place |
下面配置表示將alert消息寫入到root和tiger的個人賬號中:
#Root and Tiger get alert and higher messages |
下面配置表示將內核消息記錄到設置/dev/console中:
#Log all kernel messages to the console |
下面配置表示將UUCP和news設備產生的錯誤消息寫入到指定的日誌文件中:
# Save news errors of level crit and higher in a special file. |