2. dmesg日志格式深度解析:时间戳、日志级别、设施与动作
dmesg 输出的每一行日志都遵循一套固定的格式规范。理解这些字段的含义,是快速定位内核问题的基本功。本章将逐一拆解时间戳、日志级别(KERN_*)、设施(Facility)和动作(Action)四个核心要素。
核心认知: 一条完整的 dmesg 日志行 =
[时间戳] <级别> [设施.动作] 消息正文。掌握这个结构,你就能像读“病历”一样读懂内核的每一次“发言”。
2.1 时间戳:系统启动后的“心跳”刻度
dmesg 默认使用 相对时间戳,表示从内核启动开始到日志输出时刻所经过的秒数(精确到微秒)。格式为 [ 5.123456],方括号内第一个数字是秒,小数点后是微秒。
| 时间戳示例 | 含义 | 典型场景 |
|---|---|---|
[ 0.000000] |
内核刚解压完成,初始化开始 | 早期引导、CPU/内存探测 |
[ 1.234567] |
系统启动后约1.23秒 | PCI设备枚举、驱动加载 |
[ 30.000000] |
系统启动后30秒 | 文件系统挂载、服务启动 |
[ 1234.567890] |
系统已运行约20分钟 | 运行时错误、硬件中断、OOM |
实用技巧: 使用
dmesg -T 可将相对时间戳转换为人类可读的绝对时间(如 Mon Jan 15 10:30:45 2024),便于与系统日志 /var/log/messages 或 journalctl 进行关联分析。
2.2 日志级别:从“致命”到“调试”的八级阶梯
Linux 内核定义了 8 个日志级别,用 <0> 到 <7> 的数字表示,数字越小越紧急。这些级别对应宏定义 KERN_EMERG 到 KERN_DEBUG。
| 级别编号 | 宏定义 | 含义 | 典型消息示例 |
|---|---|---|---|
<0> |
KERN_EMERG |
系统不可用 | Kernel panic - not syncing |
<1> |
KERN_ALERT |
必须立即处理 | BUG: unable to handle kernel NULL pointer dereference |
<2> |
KERN_CRIT |
严重条件 | Out of memory: killed process (java) |
<3> |
KERN_ERR |
错误条件 | ata1.00: failed command: READ DMA |
<4> |
KERN_WARNING |
警告条件 | ttyS0: detected caps 00000000 should be 00000100 |
<5> |
KERN_NOTICE |
正常但重要 | EXT4-fs (sda1): mounted filesystem with ordered data mode |
<6> |
KERN_INFO |
信息性消息 | CPU0: Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GHz |
<7> |
KERN_DEBUG |
调试消息 | pci 0000:00:00.0: [8086:1237] type 00 class 0x060000 |
故障排查要点: 关注
<0> 到 <3> 级别的日志,它们通常直接指向问题根因。<4> 和 <5> 提供上下文线索,<6> 和 <7> 在常规运维中可忽略,但在调试驱动或内核模块时不可或缺。
2.3 设施(Facility):日志的“部门”归属
设施字段标识日志消息来自内核的哪个子系统。在 dmesg 输出中,设施通常以 [facility.action] 的形式出现,例如 [kern.warn]、[pci]、[ext4]。设施是内核日志系统(printk)与用户态日志系统(syslog)之间的桥梁。
| 设施代码 | 设施名称 | 来源子系统 | 常见动作示例 |
|---|---|---|---|
0 |
kern |
内核核心 | warn, err, info, emerg |
1 |
user |
用户态进程 | notice, err |
2 |
mail |
邮件系统 | info, warn |
3 |
daemon |
系统守护进程 | info, err |
4 |
auth |
安全/认证 | warn, info |
5 |
syslog |
syslogd 内部 | info, warn |
6 |
lpr |
打印系统 | info |
7 |
news |
网络新闻 | info |
8 |
uucp |
UUCP 子系统 | info |
9 |
cron |
计划任务 | info, warn |
10 |
authpriv |
安全/认证(私有) | warn, info |
11 |
ftp |
FTP 守护进程 | info |
16-23 |
local0-local7 |
本地自定义 | 由应用定义 |
实战关联: 在 dmesg 中,设施字段帮助你将日志快速归类。例如,看到
[pci] 开头的消息,立即知道是 PCI 子系统的问题;看到 [ext4] 则指向文件系统。结合 grep 命令可以高效过滤:dmesg | grep '\[pci\]'。
2.4 动作(Action):日志的“动词”
动作字段描述设施执行的具体操作或发生的事件。它通常紧跟在设施之后,用点号分隔,如 [kern.warn] 中的 warn。动作是日志语义的核心,告诉你“发生了什么”。
常见的动作包括:
- err / warn / info / emerg:与日志级别对应的通用动作,表示错误、警告、信息、紧急。
- probe / init / exit:驱动或模块的探测、初始化、卸载。
- mount / umount:文件系统的挂载与卸载。
- alloc / free:内存分配与释放。
- read / write / ioctl:设备 I/O 操作。
- timeout / reset:超时或复位事件。
快速过滤技巧: 使用
dmesg | grep '\[.*\.err\]' 可以提取所有设施的错误动作;使用 dmesg | grep '\[pci.*\]' 提取 PCI 子系统的所有动作。动作字段让日志过滤更加精准。
2.5 综合实战:解析一条真实 dmesg 日志
让我们将本章所学知识应用到一条真实的 dmesg 日志行中:
[ 5.123456] <3> [kern.warn] (printk) ttyS0: detected caps 00000000 should be 00000100
逐字段解析:
- 时间戳:
[ 5.123456]— 系统启动后约 5.12 秒。 - 日志级别:
<3>—KERN_ERR,表示错误条件。 - 设施:
kern— 来自内核核心子系统。 - 动作:
warn— 警告动作,但级别是 ERR,说明这是一个被归类为错误的警告。 - 消息正文:
ttyS0: detected caps 00000000 should be 00000100— 串口 ttyS0 检测到能力位异常。
故障排查启示: 这条日志表明串口驱动在初始化时发现硬件能力寄存器与预期不符。虽然级别是 ERR,但动作是 warn,说明内核尝试继续运行。运维人员应检查串口硬件或 BIOS 设置,确认串口功能是否正常。