三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Linux 内核日志诊断:dmesg 命令完整详解(硬件故障排查实战)

Linux 内核日志诊断:dmesg 命令完整详解(硬件故障排查实战)

1. 命令简介

dmesg 命令是 Linux 系统中一个核心的诊断工具,用于显示和控制内核环形缓冲区的内容。内核在启动和运行过程中,会将硬件检测、设备驱动初始化、系统错误等重要信息实时写入此环形缓冲区。

通过 dmesg,系统管理员和开发者可以:

查看系统启动时的详细日志。 诊断硬件故障(如硬盘错误、内存问题)。 排查设备驱动加载失败的原因。 实时监控内核的运行状态。 这些信息对于系统调试和性能分析至关重要。开机时来不及查看的信息,都可以通过此命令回顾。默认情况下,这些日志也会被保存到 /var/log/dmesg 文件中。

2. 语法格式

bash

运行

dmesg [选项]...

3. 常用选项及说明

dmesg 提供了丰富的选项来过滤、格式化和控制输出。

表格

选项说明
-H, --human人性化显示。输出更易读的时间戳,并启用交互式分页器(如 less)进行浏览。
-k, --kernel仅显示内核消息。这是默认行为。
-l, --level <列表>按日志级别过滤。只显示指定级别的消息。级别包括:emerg, alert, crit, err, warn, notice, info, debug。
-T, --ctime显示人类可读的日历时间戳(例如 Mon May 27 14:12:34 2024),而非默认的内核启动后的相对时间。
-t, --notime不显示任何时间戳。
-x, --decode解码设施和级别为可读的字符串。例如,将 kern.info 显示为 kernel: info。
-L, --color[=always|auto|never]对消息级别进行颜色高亮。auto 为默认值,仅在输出到终端时着色。
-r, --raw打印原始的缓冲区消息,包含原始的日志级别前缀(如 <6> 代表 info 级别)。
-f, --facility <列表>按设施(产生消息的子系统)过滤。例如:kern, user, mail, daemon 等。
-s, --buffer-size <大小>设置用于查询环形缓冲区的大小(字节)。如果缓冲区被部分覆盖,可使用此选项尝试读取更多历史消息。
-c, --clear显示后清空环形缓冲区。此操作通常需要 root 权限,请谨慎使用。
-C, --clear直接清空环形缓冲区,不显示内容。需要 root 权限。
-h, --help显示帮助信息。
-V, --version显示版本信息。

日志级别说明内核消息有不同的严重级别,数字越小越严重:

0 (emerg): 系统不可用 1 (alert): 必须立即采取行动 2 (crit): 严重情况 3 (err): 错误条件 4 (warn): 警告条件 5 (notice): 正常但重要的情况 6 (info): 信息性消息 7 (debug): 调试级消息

4. 示例用法

查看所有内核消息(默认行为)

bash

运行

dmesg

以人性化格式查看,并启用分页

bash

运行

dmesg -H

bash

运行

dmesg --human | less

查看带有人类可读时间戳的消息

bash

运行

dmesg -T

仅查看错误 (err) 和警告 (warn) 级别的消息

bash

运行

dmesg -l err,warn

或使用级别编号

bash

运行

dmesg -l 3,4

结合 grep 搜索特定信息

查看硬盘(如 sda)相关的信息:

bash

运行

dmesg | grep -i sda

查看 USB 设备连接信息:

bash

运行

dmesg | grep -i usb

查看内存信息:

bash

运行

dmesg | grep -i memory

使用正则表达式搜索多个关键词(如网卡 eth0 和 wlan0):

bash

运行

dmesg | grep -E "eth0|wlan0"

查看最近发生的内核事件(最后 20 行)

bash

运行

dmesg | tail -20

查看特定设施(如内核 kern)的消息

bash

运行

dmesg -f kern

清空环形缓冲区(需要 root 权限)

bash

运行

sudo dmesg -C

5. 注意事项

权限要求:普通用户通常可以读取 dmesg 输出。但某些系统出于安全考虑,可能通过 kernel.dmesg_restrict sysctl 参数(值为 1)限制普通用户访问。此时,需要使用 sudo 或以 root 身份运行。清空缓冲区 (-c, -C) 操作始终需要 root 权限。

缓冲区覆盖:内核环形缓冲区大小有限,当新消息产生时,旧消息会被覆盖。因此,重要的启动信息应及时查看或保存。

时间戳:默认时间戳是系统启动后的秒数(和纳秒)。使用 -T 选项可以转换为日历时间,但请注意,如果系统启动后时间被调整过,这个转换可能不准确。

与 /var/log/messages 或 journalctl 的区别:

  • dmesg 直接读取内核内存中的环形缓冲区,内容更偏向硬件和驱动层。
  • /var/log/messages 或 syslog 记录的是由用户空间守护进程(如 rsyslog)转发的、更广泛的系统日志。
  • journalctl -k 命令(在 systemd 系统上)的功能与 dmesg 类似,但能提供更结构化的查询。

生产环境慎用清空操作:-c 和 -C 选项会永久清除环形缓冲区中的历史信息,可能导致问题排查困难,在生产环境中应格外谨慎使用。

Linux 学习资料 https://pan.baidu.com/s/1A6qqBk2ViE_Le2cQjSowkQ?pwd=7uz8

← 返回列表