dmesg命令用于显示和控制内核环形缓冲区(kernel ring buffer)中的消息。这些消息包含了内核启动信息、硬件检测、设备驱动状态、系统错误等重要信息。
dmesg [选项]
/var/log/dmesg或/var/log/kern.log| 级别 | 名称 | 说明 | 示例 |
|---|---|---|---|
| 0 | KERN_EMERG | 紧急情况,系统不可用 | 系统崩溃,硬件故障 |
| 1 | KERN_ALERT | 需要立即采取行动 | 严重硬件错误 |
| 2 | KERN_CRIT | 危急情况 | 关键子系统故障 |
| 3 | KERN_ERR | 错误条件 | 设备驱动错误 |
| 4 | KERN_WARNING | 警告条件 | 磁盘空间不足 |
| 5 | KERN_NOTICE | 正常但重要的信息 | 系统启动完成 |
| 6 | KERN_INFO | 信息性消息 | 设备检测成功 |
| 7 | KERN_DEBUG | 调试级别信息 | 详细的调试信息 |
| 参数 | 说明 |
|---|---|
-C, --clear |
清除环形缓冲区内容 |
-c, --read-clear |
读取并清除环形缓冲区内容 |
-D, --console-off |
禁用向控制台输出消息 |
-d, --show-delta |
显示消息时间戳之间的时间差 |
-e, --reltime |
以相对时间格式显示时间戳 |
-E, --console-on |
启用向控制台输出消息 |
-F, --file 文件 |
从指定文件读取日志而不是内核缓冲区 |
-f, --facility 列表 |
限制输出到指定的设施(facility)列表 |
-H, --human |
人类可读的输出格式 |
-k, --kernel |
只显示内核消息 |
-L, --color |
彩色输出(默认自动检测) |
-l, --level 列表 |
限制输出到指定的日志级别 |
-n, --console-level 级别 |
设置控制台日志级别(1-8) |
-P, --nopager |
不使用分页器(pager)显示输出 |
-r, --raw |
显示原始消息缓冲区(包括不可打印字符) |
-S, --syslog |
强制使用syslog(2)而不是/dev/kmsg |
-s, --buffer-size 大小 |
指定缓冲区大小来查询内核环形缓冲区 |
-T, --ctime |
显示人类可读的时间戳 |
-t, --notime |
不显示时间戳 |
-u, --userspace |
只显示用户空间消息 |
-w, --follow |
等待新消息(类似tail -f) |
-x, --decode |
解码设施和级别为可读字符串 |
--help |
显示帮助信息 |
--version |
显示版本信息 |
不带任何参数查看完整的dmesg输出:
# 显示所有内核消息
$ dmesg
# 通常输出很长,可以使用管道分页查看
$ dmesg | less
$ dmesg | more
[ 0.000000] Linux version 5.4.0-100-generic (buildd@lcy01-amd64-001)
[ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-5.4.0-100-generic root=UUID=xxx ro quiet splash
[ 0.000000] KERNEL supported cpus:
[ 0.000000] Intel GenuineIntel
[ 0.000000] AMD AuthenticAMD
[ 0.000000] Hygon HygonGenuine
[ 0.000000] Centaur CentaurHauls
[ 0.000000] x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
...
使用-T参数显示可读的时间:
# 显示人类可读的时间戳
$ dmesg -T
# 输出示例:
[Tue Mar 10 10:30:45 2024] Linux version 5.4.0-100-generic
[Tue Mar 10 10:30:45 2024] Command line: BOOT_IMAGE=/boot/vmlinuz-5.4.0-100-generic
[Tue Mar 10 10:30:45 2024] KERNEL supported cpus:
使用-l参数过滤日志级别:
# 只显示错误和警告消息(级别1-4)
$ dmesg -l err,warn
# 只显示错误消息
$ dmesg -l err
# 只显示警告消息
$ dmesg -l warn
# 显示信息和调试消息
$ dmesg -l info,debug
使用grep过滤特定硬件信息:
# 查看USB设备信息
$ dmesg | grep -i usb
# 查看磁盘/存储设备信息
$ dmesg | grep -i disk
$ dmesg | grep -i sd
$ dmesg | grep -i sata
# 查看内存信息
$ dmesg | grep -i memory
$ dmesg | grep -i mem
# 查看CPU信息
$ dmesg | grep -i cpu
# 查看网络设备信息
$ dmesg | grep -i ethernet
$ dmesg | grep -i network
$ dmesg | grep -i eth
# 查看显卡信息
$ dmesg | grep -i vga
$ dmesg | grep -i nvidia
$ dmesg | grep -i amd
使用-w参数实时监控:
# 实时监控dmesg新消息(类似tail -f)
$ dmesg -w
# 结合时间戳和级别
$ dmesg -w -T -l err,warn
# 按Ctrl+C停止监控
查看最新的内核消息:
# 查看最后20行
$ dmesg | tail -20
# 查看最后50行,带时间戳
$ dmesg -T | tail -50
# 查看启动后的最后100条消息
$ dmesg | tail -100 > /tmp/last_boot_messages.txt
# 查看特定时间后的消息
$ dmesg -T | grep "Mar 10 10:"
需要root权限清除缓冲区:
# 清除dmesg缓冲区(需要root权限)
$ sudo dmesg -C
# 查看并清除
$ sudo dmesg -c
# 验证是否清除
$ dmesg
# 输出应该很少或为空
控制哪些消息显示在控制台:
# 查看当前控制台日志级别
$ cat /proc/sys/kernel/printk
7 4 1 7
# 四个数字分别表示:
# 当前控制台日志级别
# 默认消息日志级别
# 最小允许的日志级别
# 默认启动时的日志级别
# 设置控制台日志级别(只显示级别1-3的消息)
$ sudo dmesg -n 3
# 恢复默认级别
$ sudo dmesg -n 7
# 临时设置(重启后失效)
$ echo 3 | sudo tee /proc/sys/kernel/printk
使用dmesg诊断常见硬件问题:
#!/bin/bash
# 检查常见硬件错误
echo "=== 检查内存错误 ==="
dmesg | grep -i "memory" | grep -E "(error|fail|bad)"
echo -e "\n=== 检查磁盘错误 ==="
dmesg | grep -i "sd" | grep -E "(error|fail|timeout|I/O)"
echo -e "\n=== 检查USB错误 ==="
dmesg | grep -i "usb" | grep -E "(error|fail|disconnect)"
echo -e "\n=== 检查网络错误 ==="
dmesg | grep -i "eth\|network" | grep -E "(error|fail|link)"
echo -e "\n=== 检查温度/风扇警告 ==="
dmesg | grep -i "thermal\|temperature\|fan" | grep -E "(warning|critical)"
echo -e "\n=== 检查最新的错误消息 ==="
dmesg -l err | tail -20
journalctl -k查看# 保存完整的启动日志
dmesg > /var/log/dmesg_boot_$(date +%Y%m%d_%H%M%S).log
# 在/etc/rc.local中添加自动保存
dmesg > /var/log/dmesg_boot.log
dmesg --color=always | less -R保持颜色dmesg -d查看消息间隔,有助于分析性能问题dmesg -x解码设施和级别为可读字符串journalctl -k查看内核日志A: dmesg显示内核环形缓冲区中的实时消息,而/var/log/messages(或/var/log/syslog)是系统日志文件,包含内核和用户空间的消息,且会持久化存储。
A: 可能是缓冲区被清除,或者系统刚启动没有新消息。使用sudo dmesg或检查/var/log/dmesg文件。
A: 1) 手动保存:dmesg > /path/to/file;2) 配置rsyslog保存dmesg;3) 使用journalctl的持久化存储。
A: 默认时间戳是从系统启动开始的秒数(包括小数)。使用-T参数转换为可读时间,-d显示消息间隔。
A: 使用dmesg -T | grep "时间段",或使用journalctl --since="时间" --until="时间" -k。
journalctl - 查询systemd日志(包括内核日志)syslogd - 系统日志守护进程rsyslog - 增强的系统日志守护进程klogd - 内核日志守护进程tail -f /var/log/messages - 实时查看系统日志less /var/log/dmesg - 查看保存的启动日志lspci - 列出PCI设备(配合dmesg诊断硬件)lsusb - 列出USB设备(配合dmesg诊断硬件)