2012-07-10 262 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