目录
前言
一、什么是 dmesg?
二、安装 dmesg
在 Debian/Ubuntu 上安装:
在 CentOS/RHEL 上安装:
三、基本使用方法
3.1 查看所有内核日志
分页查看:
按关键字搜索:
四、常用选项详解与示例
4.1 显示时间戳(推荐启用)
4.2 只显示特定级别的日志(--level)
示例:只查看错误和警告级别的日志
4.3 清空环形缓冲区(谨慎操作)
4.4 将日志保存到文件
五、典型应用场景与实例说明
5.1 排查硬件识别问题
示例:查看 USB 插拔日志
5.2 定位内核 Oops 和 Panic
示例:查找内核 Oops
5.3 跟踪内核模块加载/卸载
示例:
六、高级技巧
6.1 实时监控内核日志
方法一:使用 watch 命令
方法二:使用 journalctl(systemd 系统)
七、常见误区与注意事项
八、常用命令汇总
九、dmesg和syslog有什么区别?
dmesg
syslog
总结区别
十、总结
前言
在 Linux 系统中,dmesg(diagnostic message) 是一个用于打印或控制内核环形缓冲区(kernel ring buffer)内容的命令行工具。它可以帮助系统管理员和开发人员查看系统启动过程中的硬件检测、驱动加载、内核错误、警告等关键信息,在调试系统问题、排查硬件兼容性问题、分析内核崩溃等方面具有重要意义。
一、什么是 dmesg?
dmesg
命令从 内核环形缓冲区 中读取信息,并将其输出到终端。该缓冲区由 Linux 内核维护,记录了系统从开机到当前时刻的所有重要事件,包括:
- CPU、内存、硬盘、USB 设备等硬件初始化信息
- 内核模块加载与卸载
- 驱动程序状态变化
- 内核警告(warn)与错误(oops)
- 内核 panic 信息(致命错误)
这些信息在系统日志文件(如 /var/log/messages
或 /var/log/syslog
)中可能不会全部记录,因此 dmesg
是获取最完整内核日志的重要手段。
二、安装 dmesg
dmesg
是 util-linux
软件包的一部分,几乎所有的 Linux 发行版都默认包含它。
在 Debian/Ubuntu 上安装:
sudo apt update
sudo apt install util-linux
在 CentOS/RHEL 上安装:
sudo yum install util-linux
三、基本使用方法
3.1 查看所有内核日志
dmesg
这会将整个内核环形缓冲区的内容打印到终端。由于输出较多,建议结合管道进行过滤或分页查看。
分页查看:
dmesg | less
按关键字搜索:
dmesg | grep -i usb
例如查找 USB 相关的日志。
四、常用选项详解与示例
4.1 显示时间戳(推荐启用)
默认情况下,dmesg
输出不带时间戳。为了方便定位事件发生的时间顺序,可以使用 -T
选项显示可读时间格式:
dmesg -T
输出示例:
[Thu May 9 16:00:00 2025] Initializing cgroup subsys cpuset
[Thu May 9 16:00:00 2025] CPU0: Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz stepping 0x0
4.2 只显示特定级别的日志(--level)
Linux 内核定义了 8 种日志级别(从 0 到 7),dmesg
支持通过 --level
参数只显示指定级别的日志。
日志级别 | 关键字 | 含义 |
---|---|---|
0 | emerg | 紧急情况(系统不可用) |
1 | alert | 必须立即采取行动 |
2 | crit | 严重错误 |
3 | err | 错误条件 |
4 | warn | 警告信息 |
5 | notice | 正常但重要的条件 |
6 | info | 信息性消息 |
7 | debug | 调试级消息 |
示例:只查看错误和警告级别的日志
dmesg --level=err,warn
4.3 清空环形缓冲区(谨慎操作)
sudo dmesg -C
此命令会清空当前的内核日志缓冲区。适用于在执行某个操作前清除旧日志,便于后续跟踪新生成的信息。
⚠️ 注意:清空后无法恢复原始日志,请谨慎使用。
4.4 将日志保存到文件
dmesg > kernel_log.txt
将完整的 dmesg 输出保存为文本文件,便于离线分析或提交 bug 报告。
五、典型应用场景与实例说明
5.1 排查硬件识别问题
当你插入 USB 存储设备、网卡、显卡等硬件时,可以通过 dmesg
查看是否被正确识别。
示例:查看 USB 插拔日志
dmesg | grep -i usb
输出示例:
[Thu May 9 16:02:10 2025] usb 1-1: new high-speed USB device number 2 using xhci_hcd
[Thu May 9 16:02:10 2025] usb 1-1: New USB device found, idVendor=0781, idProduct=5581
[Thu May 9 16:02:10 2025] usb-storage 1-1:1.0: USB Mass Storage device detected
5.2 定位内核 Oops 和 Panic
当内核出现严重错误(如访问非法地址)时,会产生 Oops 或 Panic 信息,通常伴随着堆栈回溯。dmesg
是诊断这些问题的关键工具。
示例:查找内核 Oops
dmesg | grep -A 20 "Oops"
输出示例:
[Thu May 9 16:10:00 2025] Oops: 0000 [#1] PREEMPT SMP
[Thu May 9 16:10:00 2025] Modules linked in: my_module(+)
[Thu May 9 16:10:00 2025] CPU: 0 PID: 1234 Comm: myapp Tainted: P O 5.10.0-18-generic #1
[Thu May 9 16:10:00 2025] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.14.0-0-ga698c89-prebuilt.qemu.org 04/01/2014
[Thu May 9 16:10:00 2025] Call Trace:
[Thu May 9 16:10:00 2025] my_function+0x12/0x30 [my_module]
[Thu May 9 16:10:00 2025] another_function+0x56/0x80
上述信息表明是 my_function
函数中发生了异常,开发者可以根据偏移量 0x12
结合 objdump
进一步定位具体代码位置。
5.3 跟踪内核模块加载/卸载
如果你正在开发或调试内核模块,可以使用 dmesg
来查看模块加载和卸载的情况。
示例:
sudo insmod mymodule.ko
dmesg | tail -n 20
输出示例:
[Thu May 9 16:15:00 2025] mymodule: module_init called
[Thu May 9 16:15:00 2025] mymodule: initialized successfully
六、高级技巧
6.1 实时监控内核日志
虽然 dmesg
本身不支持实时更新,但可以配合 tail -f
或 watch
命令实现类似功能。
方法一:使用 watch 命令
watch -n 1 "dmesg | tail -n 20"
每秒刷新一次最新的 20 行日志。
方法二:使用 journalctl
(systemd 系统)
journalctl -k -f
-k
表示只显示内核日志,-f
表示实时跟踪。
七、常见误区与注意事项
误区 | 正确做法 |
---|---|
❌ dmesg 日志永久保留 | ✅ 内核日志是临时的,重启后丢失。需手动保存 |
❌ 使用 dmesg 替代 syslog | ✅ dmesg 提供更底层信息,syslog 提供更高层服务日志 |
❌ 不加筛选直接查看大量日志 | ✅ 使用 grep , less , tail 等工具辅助阅读 |
❌ 不关注日志等级 | ✅ 使用 --level 只查看关键日志(如 err/warn)提高效率 |
八、常用命令汇总
功能描述 | 命令示例 |
---|---|
查看所有日志 | dmesg |
显示带时间戳的日志 | dmesg -T |
只显示错误和警告日志 | dmesg --level=err,warn |
清除内核日志缓冲区 | sudo dmesg -C |
保存日志到文件 | dmesg > kernel_log.txt |
查找 USB 相关日志 | dmesg | grep -i usb |
查找内核 Oops 信息 | dmesg | grep -A 20 "Oops" |
实时查看最新 20 行日志 | `watch -n 1 "dmesg |
九、dmesg和syslog有什么区别?
dmesg
和 syslog
都是用于记录和查看系统日志的重要工具,但它们在用途、范围以及操作方式上存在显著差异。理解这些差异有助于更有效地进行系统监控与故障排查。
dmesg
-
来源:
dmesg
是一个命令行工具,专门用于打印或控制内核环形缓冲区(kernel ring buffer)的内容。它展示了从系统启动到当前时刻的所有内核消息。 -
内容:
- 主要包含硬件检测信息、驱动程序加载/卸载信息、内核模块状态变化、硬件错误、内核警告和错误等。
- 这些信息对于诊断硬件问题、分析内核崩溃(如 Oops 或 Panic)、检查设备是否被正确识别等非常有用。
-
特点:
- 数据存储在一个循环缓冲区内,这意味着当缓冲区满时,最早的条目会被覆盖。
- 默认情况下,
dmesg
输出不带时间戳,但可以通过-T
参数添加。 - 可以通过管道与其他命令结合使用,例如
grep
来过滤特定的信息。
-
应用场景:
- 在系统启动后立即检查是否有任何硬件初始化失败的情况。
- 调试内核模块或驱动程序时,查看其加载情况及运行状态。
- 分析内核级别的错误或警告信息。
syslog
-
来源:
syslog
实际上是指一组服务和协议,用于收集、处理并存储来自各种来源的日志消息。Linux 系统中常见的实现包括rsyslogd
或syslogd
。 -
内容:
- 包含了比
dmesg
更广泛的信息,不仅限于内核消息,还包括用户空间应用程序的日志、网络活动、安全事件等。 - 根据配置的不同,可以将日志发送到本地文件、远程服务器或者通过电子邮件通知管理员。
- 包含了比
-
特点:
- 提供灵活的日志分级机制,允许根据重要性对日志进行分类(如 info, warning, error 等),并且可以根据级别设置不同的处理策略。
- 支持多种输出格式和目的地,便于集中管理和长期存档。
- 日志文件通常位于
/var/log/
目录下,如/var/log/syslog
,/var/log/messages
等。
-
应用场景:
- 监控系统的整体健康状况,包括但不限于应用程序错误、用户登录尝试、网络连接状态等。
- 安全审计,追踪潜在的安全威胁或违规行为。
- 故障排除,特别是当问题涉及多个组件或服务时。
总结区别
- 数据源:
dmesg
专注于内核层面的消息,而syslog
则涵盖了整个系统的日志,包括用户空间应用和服务。 - 持久性:
dmesg
的日志存储在内存中的环形缓冲区,重启后丢失;syslog
的日志则通常保存在磁盘上的文件中,除非手动清理否则会一直保留。 - 详细程度与用途:
dmesg
更适合用于低级别的调试和技术支持,比如硬件兼容性测试、驱动开发等;syslog
则更适合于日常运维、安全管理及全面的系统监控。 - 灵活性:
syslog
系统提供了更多的配置选项,可以定制化地处理不同类型、不同级别的日志,而dmesg
的功能相对固定,主要用于查看和导出内核日志。
十、总结
dmesg
是 Linux 系统中最基础但也最重要的内核日志查看工具之一。无论是系统启动调试、硬件识别、驱动开发,还是内核崩溃分析,dmesg
都能提供第一手的线索。
掌握其使用方法,尤其是结合时间戳、日志级别、关键词过滤等功能,将极大提升你在嵌入式开发、运维、内核调试等领域的问题排查效率。