2012-07-10 563 views
7

我正在修改kvm模塊,並在內核代碼中添加了printk語句。在運行虛擬機之後,printk向我提供了有關guest虛擬機的錯誤地址和其他信息OS。dmesg和/var/log/kern.log之間的區別

我需要從這個信息生成統計信息。當我使用dmesg時,我只能在內核空間看到錯誤地址 ,即它們的地址高於0XC0000000(當VMEXIT發生時需要錯誤地址,主機模式)

當我在kern.log中看到相同的統計信息時,我還從用戶空間(低於0XC0000000)獲取錯誤地址。 因此,在我看來,像dmesg的容量有限,並且給出的信息是來自kern.log的子集。
我的kern.log文件太大,可以從kern.log中刪除舊數據,因爲像grep,join,awk這樣的文本處理命令花費的時間太長,無法在文件上運行。

我的問題是:
dmesg和kern.log有什麼區別?
如何將kern.log文件大小降低爲cron job(刪除過去24小時內添加的所有數據)
有沒有更好的方法從kernel獲取printf kindof功能?

回答

5

/var/log/kern.log和他的旋轉日誌(/var/log/kern.log.1 /var/log/kern.log.2 ....)包含由內核生成的日誌並由syslog處理。

dmesg如由人頁解釋爲:

dmesg的用於檢查或控制內核環形緩衝區。

實際上,它將顯示自上次啓動以來的最後16392個/var/log/kern.log八位位組。

+0

清除kern.log和kern.log.1的內容是可以的。kern.log.1非常大,vi需要5分鐘才能加載它......我無法處理文件,如果它們太長....我正在考慮做'cat/dev/null> kern.log'和'cat/dev/null> kern.log.1' ...可以擦除日誌數據嗎? – Deepthought 2012-07-10 19:53:42

+2

@Deepthought是的,你可以擦除這些文件,但syslog只會保留5個最後的文件本身。 – 2012-07-10 20:57:05

+0

在我的Ubuntu 16.04中,'dmesg'的輸出與'/ var/log/kern.log'(我用'tail -c 16392'獲得)的最後16392個八位組幾乎沒有關係。一些(少數)行是相似的,但是必須考慮輸出格式的差異,所顯示的字段,並且不清楚哪種標誌或awk後處理會導致產生的輸出可以清晰地建立爲相同的使用'diff'。 – 2016-11-12 18:13:31

相關問題