dmesg和/var/log/kern.log之间的区别是什么?

20

我正在修改kvm模块,并在内核代码中添加了printk语句。运行虚拟机后,printk会给我提供有关客户端操作系统的故障地址和其他信息。

我需要从这些信息中生成统计数据。当我使用dmesg时,我只能看到在内核空间中的故障地址,即它们的地址高于0XC0000000。(当VMEXIT发生时,即从客户机切换到主机模式时,需要故障地址)

当我在kern.log中查看相同的统计信息时,我也可以从用户空间(低于0XC0000000)获得故障地址。 因此,对我来说,dmesg的容量似乎有限,所提供的信息是kern.log的子集。
我的kern.log文件太大了,是否可以擦除其中旧的数据,因为文本处理命令如grep、join、awk在文件上运行时间太长?

我的问题是:
dmesg和kern.log之间有什么区别?
如何将kern.log文件大小作为cron作业减小?(擦除过去24小时添加的所有数据)
是否有更好的方法从内核中获取类似printf的功能?

1个回答

16

/var/log/kern.log以及其旋转的日志(/var/log/kern.log.1 /var/log/kern.log.2....)包含内核产生并由syslog处理的日志。

根据man页所述,dmesg用于:

dmesg用于检查或控制内核环形缓冲区。

事实上,它将显示自上次启动以来/var/log/kern.log的最后16392个八位字节。


1
可以清空 kern.log 和 kern.log.1,因为 kern.log.1 太大了,vi 加载需要5分钟时间...如果文件太长,我就无法处理它们...我正在考虑执行“cat /dev/null > kern.log”和“cat /dev/null > kern.log.1”操作...清空日志数据是否可行? - Deepthought
3
@Deepthought,是的,你可以删除那些文件,但是syslog只会保留最近的5个文件。 - Cédric Julien
2
在我的Ubuntu 16.04中,dmesg的输出与/var/log/kern.log的最后16392个八位字节几乎没有关联(我使用tail -c 16392获得了这些字节)。有一些(很少)行是相似的,但必须考虑到输出格式、显示的字段的差异,并且不清楚使用什么样的标志或awk后处理会导致产生可以通过diff干净地确定为相同的输出。 - Marcus Junius Brutus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接