Linux 内核日志缓冲区(Kernel Log Buffer)用于存储内核日志消息,包括启动过程、驱动程序信息、错误报告和调试信息。内核日志缓冲区的主要特点如下:
1. 工作机制
- Linux 内核中的
printk()
函数用于向日志缓冲区写入日志信息。 - 内核日志缓冲区是 环形缓冲区(ring buffer),当缓冲区满时,新日志会覆盖最旧的日志。
- 用户态程序可以通过
dmesg
或/proc/kmsg
读取日志。
2. 日志级别
printk()
支持 8 个日志级别(优先级从高到低):
级别 | 数值 | 说明 |
---|---|---|
KERN_EMERG | 0 | 紧急,系统不可用 |
KERN_ALERT | 1 | 必须立即采取措施 |
KERN_CRIT | 2 | 严重错误 |
KERN_ERR | 3 | 普通错误 |
KERN_WARNING | 4 | 警告 |
KERN_NOTICE | 5 | 正常但需要注意 |
KERN_INFO | 6 | 一般信息 |
KERN_DEBUG | 7 | 调试信息 |
示例:
printk(KERN_INFO "Hello, Kernel Log!\n");
3. 日志存储
/var/log/dmesg
:系统启动时的内核日志(部分发行版可能不同)。/proc/kmsg
:内核日志缓冲区的接口,用户态程序dmesg
通过它获取日志。
4. 如何查看内核日志
dmesg
:获取内核日志dmesg | less
journalctl
(systemd 系统)journalctl -k
/proc/kmsg
(需要 root 权限)cat /proc/kmsg
5. 调整日志缓冲区大小
可以在内核启动参数中使用 log_buf_len
来调整日志缓冲区大小,例如:
log_buf_len=8M
在 GRUB 配置中添加:
GRUB_CMDLINE_LINUX="log_buf_len=8M"
然后更新 GRUB:
sudo update-grub
6. 相关内核源码
kernel/printk/printk.c
:实现printk
及日志缓冲区管理kernel/printk/printk_ringbuffer.c
:实现环形缓冲区
如果想深入研究,可以查看
kernel/printk/printk.c