linux dmesg命令

dmesg命令用于显示和控制内核环形缓冲区(kernel ring buffer)中的消息。这些消息包含了内核启动信息、硬件检测、设备驱动状态、系统错误等重要信息。

语法格式

dmesg [选项]

命令功能

  • 显示内核启动和运行时消息
  • 查看硬件检测和初始化信息
  • 诊断系统错误和硬件问题
  • 监控内核模块加载和卸载
  • 设置内核消息日志级别

📝 重要说明

  • dmesg消息存储在环形缓冲区中,大小有限(通常256KB-16MB)
  • 系统重启后会清除dmesg缓冲区(除非配置了持久化)
  • 需要root权限才能清除缓冲区或设置日志级别
  • 现代系统中,dmesg输出也会记录到/var/log/dmesg/var/log/kern.log
  • 不同Linux发行版的dmesg输出格式可能略有差异

日志级别说明

级别 名称 说明 示例
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 显示版本信息

常用示例

示例1:基本用法 - 查看所有内核消息

不带任何参数查看完整的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'
...

示例2:查看人类可读的时间戳

使用-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:

示例3:查看特定级别的消息

使用-l参数过滤日志级别:

# 只显示错误和警告消息(级别1-4)
$ dmesg -l err,warn

# 只显示错误消息
$ dmesg -l err

# 只显示警告消息
$ dmesg -l warn

# 显示信息和调试消息
$ dmesg -l info,debug

示例4:查看硬件相关信息

使用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

示例5:实时监控新消息

使用-w参数实时监控:

# 实时监控dmesg新消息(类似tail -f)
$ dmesg -w

# 结合时间戳和级别
$ dmesg -w -T -l err,warn

# 按Ctrl+C停止监控

示例6:查看最近的消息

查看最新的内核消息:

# 查看最后20行
$ dmesg | tail -20

# 查看最后50行,带时间戳
$ dmesg -T | tail -50

# 查看启动后的最后100条消息
$ dmesg | tail -100 > /tmp/last_boot_messages.txt

# 查看特定时间后的消息
$ dmesg -T | grep "Mar 10 10:"

示例7:清除环形缓冲区

需要root权限清除缓冲区:

# 清除dmesg缓冲区(需要root权限)
$ sudo dmesg -C

# 查看并清除
$ sudo dmesg -c

# 验证是否清除
$ dmesg
# 输出应该很少或为空

示例8:设置控制台日志级别

控制哪些消息显示在控制台:

# 查看当前控制台日志级别
$ 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

示例9:诊断硬件问题

使用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

⚠️ 注意事项

  1. 缓冲区大小限制:dmesg缓冲区大小有限,旧消息会被新消息覆盖
  2. 权限要求:清除缓冲区或修改日志级别需要root权限
  3. 重启丢失:系统重启后dmesg缓冲区会被清空
  4. 生产环境:生产服务器上谨慎清除dmesg,可能丢失重要调试信息
  5. 日志轮转:现代系统会将dmesg保存到日志文件,可通过journalctl -k查看

💡 实用技巧

  1. 保存启动日志:系统启动后立即保存dmesg到文件
    # 保存完整的启动日志
    dmesg > /var/log/dmesg_boot_$(date +%Y%m%d_%H%M%S).log
    
    # 在/etc/rc.local中添加自动保存
    dmesg > /var/log/dmesg_boot.log
  2. 彩色输出:使用dmesg --color=always | less -R保持颜色
  3. 时间参考:使用dmesg -d查看消息间隔,有助于分析性能问题
  4. 解码设施:使用dmesg -x解码设施和级别为可读字符串
  5. 替代工具:在systemd系统上,可以使用journalctl -k查看内核日志

常见问题

Q: dmesg和/var/log/messages有什么区别?

A: dmesg显示内核环形缓冲区中的实时消息,而/var/log/messages(或/var/log/syslog)是系统日志文件,包含内核和用户空间的消息,且会持久化存储。

Q: 为什么dmesg输出有时候是空的?

A: 可能是缓冲区被清除,或者系统刚启动没有新消息。使用sudo dmesg或检查/var/log/dmesg文件。

Q: 如何永久保存dmesg日志?

A: 1) 手动保存:dmesg > /path/to/file;2) 配置rsyslog保存dmesg;3) 使用journalctl的持久化存储。

Q: dmesg显示的时间戳是什么意思?

A: 默认时间戳是从系统启动开始的秒数(包括小数)。使用-T参数转换为可读时间,-d显示消息间隔。

Q: 如何查看特定时间段内的dmesg消息?

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诊断硬件)