目录
前言
一、什么是 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
命令从 内核环形缓冲区 中读取信息,并将其输出到终端。该缓冲区由 Linux 内核维护,记录了系统从开机到当前时刻的所有重要事件,包括:
这些信息在系统日志文件(如 /var/log/messages
或 /var/log/syslog
)中可能不会全部记录,因此 dmesg
是获取最完整内核日志的重要手段。
dmesg
是 util-linux
软件包的一部分,几乎所有的 Linux 发行版都默认包含它。
sudo apt update
sudo apt install util-linux
sudo yum install util-linux
dmesg
这会将整个内核环形缓冲区的内容打印到终端。由于输出较多,建议结合管道进行过滤或分页查看。
dmesg | less
dmesg | grep -i usb
例如查找 USB 相关的日志。
默认情况下,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
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
sudo dmesg -C
此命令会清空当前的内核日志缓冲区。适用于在执行某个操作前清除旧日志,便于后续跟踪新生成的信息。
⚠️ 注意:清空后无法恢复原始日志,请谨慎使用。
dmesg > kernel_log.txt
将完整的 dmesg 输出保存为文本文件,便于离线分析或提交 bug 报告。
当你插入 USB 存储设备、网卡、显卡等硬件时,可以通过 dmesg
查看是否被正确识别。
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
当内核出现严重错误(如访问非法地址)时,会产生 Oops 或 Panic 信息,通常伴随着堆栈回溯。dmesg
是诊断这些问题的关键工具。
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
进一步定位具体代码位置。
如果你正在开发或调试内核模块,可以使用 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
虽然 dmesg
本身不支持实时更新,但可以配合 tail -f
或 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
是一个命令行工具,专门用于打印或控制内核环形缓冲区(kernel ring buffer)的内容。它展示了从系统启动到当前时刻的所有内核消息。
内容:
特点:
dmesg
输出不带时间戳,但可以通过 -T
参数添加。grep
来过滤特定的信息。应用场景:
来源:syslog
实际上是指一组服务和协议,用于收集、处理并存储来自各种来源的日志消息。Linux 系统中常见的实现包括 rsyslogd
或 syslogd
。
内容:
dmesg
更广泛的信息,不仅限于内核消息,还包括用户空间应用程序的日志、网络活动、安全事件等。特点:
/var/log/
目录下,如 /var/log/syslog
, /var/log/messages
等。应用场景:
dmesg
专注于内核层面的消息,而 syslog
则涵盖了整个系统的日志,包括用户空间应用和服务。dmesg
的日志存储在内存中的环形缓冲区,重启后丢失;syslog
的日志则通常保存在磁盘上的文件中,除非手动清理否则会一直保留。dmesg
更适合用于低级别的调试和技术支持,比如硬件兼容性测试、驱动开发等;syslog
则更适合于日常运维、安全管理及全面的系统监控。syslog
系统提供了更多的配置选项,可以定制化地处理不同类型、不同级别的日志,而 dmesg
的功能相对固定,主要用于查看和导出内核日志。dmesg
是 Linux 系统中最基础但也最重要的内核日志查看工具之一。无论是系统启动调试、硬件识别、驱动开发,还是内核崩溃分析,dmesg
都能提供第一手的线索。
掌握其使用方法,尤其是结合时间戳、日志级别、关键词过滤等功能,将极大提升你在嵌入式开发、运维、内核调试等领域的问题排查效率。