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)关联分析。

下图展示了两种时间戳格式的对应关系:

dmesg 时间戳格式对比 dmesg 时间戳格式对比 相对时间戳(默认) [ 5.234567] 内核启动后 5.23 秒 可读时间戳(-T 参数) [Mon Mar 10 14:23:50 2025] 系统时钟时间 转换原理 相对时间 + 系统启动时间(uptime) → 可读本地时间

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

下图展示了日志级别在故障排查中的筛选逻辑:

日志级别筛选流程 日志级别筛选流程 dmesg 原始输出 dmesg -l err (级别 0-3) 仅显示错误/紧急/警告 快速定位启动失败根因,避免被 INFO/DEBUG 信息淹没

3.3 设施分类:消息来源的标识

设施(facility) 用于标识日志消息来自内核的哪个子系统。dmesg 默认不显示设施,使用 dmesg -x 可同时查看设施和级别。

常见设施分类如下:

设施编号 设施名称 说明
0 KERN 内核核心消息
1 USER 用户级消息
2 MAIL 邮件系统
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 输出中的结构:

设施分类结构图 设施分类结构图 KERN (0) 内核核心消息 DAEMON (3) 守护进程消息 SYSLOG (5) syslog 内部消息 dmesg -x 输出示例 <6>[0.000000] → 设施 KERN (0),级别 INFO (6) <3>[5.234567] → 设施 KERN (0),级别 ERR (3) <5>[12.890123] → 设施 DAEMON (3),级别 NOTICE (5)

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 条错误级消息,并转换为可读时间,便于与系统日志交叉验证。