3. dmesg 输出解读:时间戳、日志级别与设施分类
dmesg 输出的每一行都包含三个核心要素:时间戳、日志级别和设施分类。理解这三者,是快速定位内核启动故障的基础。本节将逐一拆解它们的格式、含义与实用技巧。
3.1 时间戳格式:秒级精度与可读时间
dmesg 默认使用 秒级相对时间戳,表示从内核启动开始到该条日志产生所经过的秒数。例如:
[ 0.000000] Linux version 6.1.0-17-amd64 ...
[ 5.234567] sd 0:0:0:0: [sda] 625142448 512-byte logical blocks
[ 12.890123] systemd[1]: Starting Journal Service...
- 格式:
[ 秒.微秒 ],方括号包裹,秒与微秒之间用小数点分隔。 - 精度:微秒级(6位小数),但通常只关注整数秒部分。
- 相对性:时间从 0 开始,非系统时钟时间。
实用技巧:使用
dmesg -T 或 dmesg --ctime 可将相对时间戳转换为人类可读的本地时间(如 Mon Mar 10 14:23:45 2025),便于与系统日志(如 syslog)关联分析。
下图展示了两种时间戳格式的对应关系:
3.2 日志级别:从 KERN_EMERG 到 KERN_DEBUG
每条内核日志都带有一个 日志级别(loglevel),用于标识消息的严重程度。级别从 0(最紧急)到 7(最调试),数字越小越重要。
| 级别编号 | 宏定义 | 含义 | 典型场景 |
|---|---|---|---|
| 0 | KERN_EMERG | 紧急事件,系统不可用 | 内核 panic、致命硬件错误 |
| 1 | KERN_ALERT | 必须立即处理 | 严重内存损坏、文件系统崩溃 |
| 2 | KERN_CRIT | 临界条件 | 硬盘 I/O 错误、驱动加载失败 |
| 3 | KERN_ERR | 错误条件 | 设备超时、DMA 失败 |
| 4 | KERN_WARNING | 警告,可能存在问题 | 资源不足、降级模式 |
| 5 | KERN_NOTICE | 正常但重要的事件 | 设备检测成功、挂载文件系统 |
| 6 | KERN_INFO | 信息性消息 | 版本号、硬件配置信息 |
| 7 | KERN_DEBUG | 调试信息 | 驱动内部状态、函数调用跟踪 |
故障定位要点:启动失败时,优先关注级别 0–3 的日志。使用
dmesg -l err 可只显示级别 0–3 的消息,快速过滤噪声。
日志级别在 dmesg 输出中通常以 <数字> 形式出现在行首(默认不显示),使用 dmesg -x 可显式打印级别:
$ dmesg -x | head -5
<6>[ 0.000000] Linux version 6.1.0-17-amd64 ...
<5>[ 0.000001] Command line: BOOT_IMAGE=/vmlinuz-6.1.0-17-amd64 root=/dev/sda1 ro
<6>[ 0.000002] x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
<4>[ 0.000003] ACPI: Early table checksum verification disabled
<3>[ 0.000004] PCI: Cannot allocate resource region 0 of bridge 0000:00:1c.0
下图展示了日志级别在故障排查中的筛选逻辑:
3.3 设施分类:消息来源的标识
设施(facility) 用于标识日志消息来自内核的哪个子系统。dmesg 默认不显示设施,使用 dmesg -x 可同时查看设施和级别。
常见设施分类如下:
| 设施编号 | 设施名称 | 说明 |
|---|---|---|
| 0 | KERN | 内核核心消息 |
| 1 | USER | 用户级消息 |
| 2 | 邮件系统 | |
| 3 | DAEMON | 系统守护进程 |
| 4 | AUTH | 安全/认证消息 |
| 5 | SYSLOG | syslogd 内部消息 |
| 6 | LPR | 行式打印机子系统 |
| 7 | NEWS | 网络新闻子系统 |
| 8 | UUCP | UUCP 子系统 |
| 9 | CRON | 时钟守护进程 |
| 10 | AUTHPRIV | 安全/认证消息(私有) |
| 11 | FTP | FTP 守护进程 |
| 16–23 | LOCAL0–LOCAL7 | 本地使用保留 |
内核启动上下文:启动阶段绝大多数消息的设施为 KERN (0)。当 systemd 接管后,部分消息的设施会变为 DAEMON (3) 或 SYSLOG (5)。通过设施分类,可以快速区分消息是来自内核本身还是用户空间服务。
下图展示了设施分类在 dmesg 输出中的结构:
3.4 综合解读:时间戳 + 级别 + 设施
将三者结合,可以快速构建出日志的完整画像:
$ dmesg -x | grep -E "<0>|<1>|<2>|<3>"
<3>[ 1.234567] ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6 frozen
<2>[ 2.345678] EXT4-fs (sda1): unable to read superblock
<0>[ 3.456789] Kernel panic - not syncing: Fatal exception
- 时间戳:1.23 秒 → 启动早期,硬件初始化阶段。
- 级别:<3> (ERR) → 错误,需要关注;<2> (CRIT) → 临界;<0> (EMERG) → 致命。
- 设施:均为 KERN (0) → 内核直接报告,非用户空间问题。
实战建议:在排查启动故障时,执行以下命令组合:
dmesg -T -l err | tail -50 — 显示最近 50 条错误级消息,并转换为可读时间,便于与系统日志交叉验证。