Linux 中的 dmesg 命令详解:从基础到高级应用

在 Linux 系统管理和故障排查中,dmesg(全称 "display message" 或 "driver message")是一个不可或缺的工具。它用于读取和显示内核环形缓冲区(kernel ring buffer)中的消息,这些消息包含了内核启动过程、硬件检测、驱动加载、系统错误等关键信息。无论是调试硬件故障、排查启动问题,还是监控内核运行状态,dmesg 都能提供即时且详细的日志数据。

本文将从基础语法到高级技巧,全面解析 dmesg 命令的使用方法,帮助读者快速掌握其核心功能,并应用于实际系统维护场景。

目录#

1. 简介#

在 Linux 系统管理和故障排查中,dmesg(全称 "display message" 或 "driver message")是一个不可或缺的工具。它用于读取和显示内核环形缓冲区(kernel ring buffer)中的消息,这些消息包含了内核启动过程、硬件检测、驱动加载、系统错误等关键信息。无论是调试硬件故障、排查启动问题,还是监控内核运行状态,dmesg 都能提供即时且详细的日志数据。

本文将从基础语法到高级技巧,全面解析 dmesg 命令的使用方法,帮助读者快速掌握其核心功能,并应用于实际系统维护场景。

2. dmesg 是什么?#

内核环形缓冲区(Kernel Ring Buffer) 是内核用于临时存储日志消息的内存区域。它的特点是固定大小、循环覆盖:当缓冲区满时,新消息会覆盖最旧的消息。dmesg 命令的本质是读取并打印这个缓冲区的内容。

这些消息主要来自:

  • 内核启动过程(如内核版本、启动参数、硬件初始化);
  • 硬件设备检测(如 USB 设备插入、磁盘挂载、网卡识别);
  • 驱动程序加载与运行状态(如模块加载失败、设备驱动错误);
  • 系统运行时错误(如内存故障、磁盘 I/O 错误、权限问题)。

注意:dmesg 仅显示内核层消息,用户空间程序(如应用日志)不在其范围内(需通过 journalctl/var/log 下的日志文件查看)。

3. 基本语法与常用选项#

dmesg 的基本语法如下:

dmesg [选项]

常用选项(完整列表可通过 man dmesg 查看):

选项全称功能描述
-T--ctime以人类可读的时间格式(如 2024-05-20 14:30:25)显示消息时间戳
-t--notime不显示时间戳
-l <level>--level <level>仅显示指定日志级别的消息(如 errwarninfo,支持多级别用逗号分隔)
-f <facility>--facility <facility>按日志设施(如 kerneluserdaemon)过滤消息
-w--follow实时监控新消息(类似 tail -f,持续输出新增内核消息)
-C--clear清除内核环形缓冲区(谨慎使用,会丢失历史消息)
-c--read-clear读取并清除缓冲区(先打印内容,再清空)
-k--kernel仅显示内核生成的消息(默认行为,可省略)
-u--userspace仅显示用户空间生成的消息

日志级别与设施说明#

dmesg 消息包含日志级别(优先级)和设施(来源),用于分类和过滤:

  • 日志级别(从高到低,严重程度递减): emerg(紧急)、alert(告警)、crit(严重)、err(错误)、warn(警告)、notice(通知)、info(信息)、debug(调试)。

  • 日志设施(消息来源): kernel(内核)、user(用户空间)、daemon(守护进程)、auth(认证相关)、syslog(系统日志)等。

4. 常见用法示例#

4.1 查看原始内核消息#

最基础的用法:直接运行 dmesg(需 root 权限,否则可能因权限不足无法查看完整内容):

sudo dmesg

输出示例(部分):

[    0.000000] Linux version 5.15.0-78-generic (buildd@lcy02-amd64-008) (gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #85-Ubuntu SMP Fri Jul 7 15:25:09 UTC 2023
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-5.15.0-78-generic root=UUID=abc123... ro quiet splash
[    0.000000] x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
...
[    2.345678] usb 1-1: new high-speed USB device number 2 using xhci_hcd
[    2.567890] scsi 0:0:0:0: Direct-Access     ATA      Samsung SSD 860  1B6Q PQ: 0 ANSI: 5

4.2 显示人类可读时间戳#

默认情况下,dmesg 消息时间戳为内核启动后的秒数(如 [ 2.345678]),可读性差。使用 -T 选项可转换为本地时间:

sudo dmesg -T

输出示例:

[Mon May 20 14:30:01 2024] Linux version 5.15.0-78-generic ...
[Mon May 20 14:30:02 2024] usb 1-1: new high-speed USB device number 2 using xhci_hcd

4.3 过滤特定级别日志(如错误)#

仅显示错误(err)和严重(crit)级别的消息,快速定位问题:

sudo dmesg -l err,crit

若系统存在磁盘 I/O 错误,可能输出:

[Mon May 20 14:35:20 2024] sd 0:0:0:0: [sda] Assuming drive cache: write through
[Mon May 20 14:35:21 2024] EXT4-fs error (device sda1): ext4_find_entry:1537: inode #12345: comm systemd-journal: reading directory lblock 0

4.4 实时监控新消息#

使用 -w--follow)选项监控内核实时输出,类似 tail -f,适用于调试动态事件(如插入 USB 设备、挂载磁盘):

sudo dmesg -w

此时插入一个 USB 闪存盘,会立即显示:

[Mon May 20 15:00:00 2024] usb 2-2: new SuperSpeed USB device number 3 using xhci_hcd
[Mon May 20 15:00:01 2024] usb 2-2: New USB device found, idVendor=0781, idProduct=5581, bcdDevice= 1.00
[Mon May 20 15:00:01 2024] usb 2-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[Mon May 20 15:00:01 2024] usb 2-2: Product: Ultra Fit
[Mon May 20 15:00:01 2024] usb 2-2: Manufacturer: SanDisk
[Mon May 20 15:00:01 2024] usb 2-2: SerialNumber: 1234ABCD5678
[Mon May 20 15:00:01 2024] scsi 6:0:0:0: Direct-Access     SanDisk  Ultra Fit        1.00 PQ: 0 ANSI: 6
[Mon May 20 15:00:01 2024] sd 6:0:0:0: [sdb] 60063744 512-byte logical blocks: (30.8 GB/28.7 GiB)

4.5 清除内核环形缓冲区#

使用 -C 选项清空缓冲区(仅清除内存中的临时日志,不会影响持久化日志,如 journalctl 记录):

sudo dmesg -C

警告:此操作不可恢复,建议先保存重要日志(见 5.2 节)。

4.6 硬件检测与识别#

dmesg 是识别硬件设备的利器,结合 grep 可快速过滤特定设备:

  • 查看 USB 设备

    sudo dmesg | grep -i usb
  • 查看磁盘与存储控制器

    sudo dmesg | grep -i 'sata\|scsi\|disk'
  • 查看 CPU 与内存信息

    sudo dmesg | grep -i 'cpu\|memory'
  • 查看网络接口

    sudo dmesg | grep -i 'eth\|wlan\|network'

4.7 排查启动过程问题#

系统启动失败或服务异常时,dmesg 可显示内核启动阶段的关键错误:

sudo dmesg | grep -i 'fail\|error\|warn'

例如,若某驱动加载失败,可能输出:

[Mon May 20 14:30:10 2024] iwlwifi 0000:01:00.0: Direct firmware load for iwlwifi-cc-a0-72.ucode failed with error -2

4.8 磁盘与存储设备错误#

监控磁盘 I/O 错误(如坏道、连接问题):

sudo dmesg | grep -i 'io error\|sector\|sda\|hda'

若输出类似 end_request: I/O error, dev sda, sector 123456,需警惕磁盘故障。

5. 高级操作技巧#

5.1 结合 grep 过滤关键词#

dmesg 输出通常很长,可通过 grep 精确匹配关键词,支持正则表达式:

  • 查找特定进程相关的内核消息(如 systemd):

    sudo dmesg -T | grep -i systemd
  • 按时间段过滤(结合 -Tgrep 时间关键词):

    sudo dmesg -T | grep 'May 20 14:30'  # 过滤 5月20日14:30左右的消息
  • 排除无关信息(如 quiet 启动参数隐藏的调试信息):

    sudo dmesg | grep -v 'debug'  # 排除包含 debug 的行

5.2 保存输出到文件#

将 dmesg 输出保存到文件,便于后续分析或分享给技术支持:

sudo dmesg -T > dmesg_log_$(date +%F).txt  # 文件名包含日期

5.3 按日志设施过滤#

使用 -f 选项按设施(消息来源)过滤,例如仅显示用户空间消息:

sudo dmesg -f user

或内核与守护进程消息:

sudo dmesg -f kernel,daemon

5.4 查看内核版本与启动信息#

dmesg 首行通常包含内核版本和编译信息:

sudo dmesg | head -n 1

输出示例:

[    0.000000] Linux version 5.15.0-78-generic (buildd@lcy02-amd64-008) (gcc ...)

6. 最佳实践#

  1. 使用 root 权限运行
    部分系统(如 Debian/Ubuntu)默认限制普通用户访问 dmesg,需通过 sudo 执行以获取完整日志:

    sudo dmesg
  2. 谨慎清除缓冲区
    仅在测试环境或确认无重要日志时使用 -C,生产环境建议先保存输出。

  3. 优先使用 -T 显示时间
    人类可读时间戳(-T)比默认的内核启动秒数更便于问题定位。

  4. 结合 journalctl 进行持久化日志分析
    dmesg 仅显示内存中的环形缓冲区,而 journalctl -k(或 journalctl --dmesg)可查看持久化的内核日志,适合分析历史问题:

    journalctl -k -b  # 查看当前启动的内核日志(-b 表示 "boot")
  5. 实时监控用 -w,而非循环 dmesg
    使用 dmesg -w 替代 while true; do dmesg | tail; sleep 1; done,效率更高且无重复输出。

  6. 保存日志用于跨时间对比
    定期保存 dmesg 输出(如系统更新前后),便于排查更新导致的问题。

7. 常见问题与解决方案#

问题 1:权限拒绝(Permission denied)#

现象:普通用户执行 dmesg 提示 Operation not permitted
原因:内核参数 kernel.dmesg_restrict 限制非 root 用户访问。
解决:使用 sudo 提升权限:

sudo dmesg

问题 2:找不到历史消息#

现象:dmesg 输出中缺少几天前的日志。
原因:内核环形缓冲区是循环的,新消息会覆盖旧消息(默认大小通常为 16MB~64MB)。
解决:使用 journalctl -k 查看持久化日志,或通过 dmesg -T > log.txt 定期保存输出。

问题 3:时间戳与系统时间不符#

现象dmesg 显示的时间与 date 命令不一致。
原因:默认时间戳为内核启动后的秒数,未关联系统时间。
解决:使用 -T 选项显示本地时间:

sudo dmesg -T

问题 4:硬件设备未被识别#

现象:dmesg 中无目标硬件(如 USB 设备)的日志。
原因:可能内核模块未加载或硬件故障。
排查

  1. 检查模块是否加载:lsmod | grep <模块名>(如 usb_storage);
  2. 手动加载模块:sudo modprobe <模块名>
  3. 重新插拔硬件后观察 dmesg -w

8. 总结#

dmesg 作为内核日志查看工具,以其实时性、轻量性硬件相关日志丰富性,在 Linux 系统管理中占据重要地位。通过本文的介绍,读者应能掌握其基础用法(如时间格式化、级别过滤)、高级技巧(如结合 grep、持久化保存)及最佳实践(如权限管理、与 journalctl 配合)。

无论是日常硬件检测、启动故障排查,还是内核调试,dmesg 都是快速定位问题的首选工具。但需注意其局限性(环形缓冲区、非持久化),关键场景下需结合 journalctl 等工具进行综合分析。

9. 参考资料#

  1. dmesg 官方手册man dmesgutil-linux 文档
  2. 内核环形缓冲区说明Linux Kernel Documentation - Ring Buffer
  3. systemd journalctl 文档journalctl 手册
  4. Linux 日志级别与设施syslog(3) 手册
  5. Ubuntu 内核文档Ubuntu Kernel Wiki