如何在 Linux 上使用 dmesg 命令

dmesg 命令让您可以窥探 Linux 启动进程的隐藏世界。 与“故障查找器的朋友”一起查看和监视来自内核自己的环形缓冲区的硬件设备和驱动程序消息。

Linux 的环形缓冲区是如何工作的

在 Linux 和类 Unix 计算机中,引导和启动是计算机开机时发生的一系列事件的两个不同阶段。

引导过程(BIOS 或者 UEFI, MBR, 和 格鲁布) 将系统初始化到内核加载到内存并连接到初始 ramdisk (initrd 或 initramfs), 和 系统 已启动。

然后启动进程拿起接​​力棒,完成操作系统的初始化。 在初始化的早期阶段,记录守护进程,例如 系统日志 或者 系统日志 尚未启动并运行。 为了避免在这个初始化阶段丢失显着的错误消息和警告,内核包含一个 环形缓冲区 它用作消息存储。

环形缓冲区是为消息保留的内存空间。 它设计简单,尺寸固定。 当它已满时,较新的消息会覆盖最旧的消息。 从概念上讲,它可以被认为是“循环缓冲区。”

内核环形缓冲区存储诸如设备驱动程序的初始化消息、来自硬件的消息和来自内核模块的消息等信息。 因为它包含这些低级启动消息,所以环形缓冲区是开始调查硬件错误或其他启动问题的好地方。

但不要空手而归。 随身携带 dmesg。

dmesg 命令

dmesg 命令允许您 查看存储在环形缓冲区中的消息. 默认情况下,您需要使用 sudo 才能使用 dmesg。

sudo dmesg

环形缓冲区中的所有消息都显示在终端窗口中。

那是一场洪水。 显然,我们需要做的是通过更少的管道传递它:

sudo dmesg | less

现在我们可以滚动浏览消息以查找感兴趣的项目。

您可以使用less 中的搜索功能来定位和突出显示您感兴趣的项目和术语。在less 中按正斜杠键“/”启动搜索功能。

消除对 sudo 的需求

如果您想避免每次使用 dmesg 时都必须使用 sudo,可以使用此命令。 但是,请注意:它允许任何拥有您计算机用户帐户的人使用 dmesg,而无需使用 sudo。

sudo sysctl -w kernel.dmesg_restrict=0

强制颜色输出

默认情况下,dmesg 可能会被配置为产生彩色输出。 如果不是,您可以告诉 dmesg 使用 -L(颜色)选项对其输出进行着色。

sudo dmesg -L

要强制 dmesg 始终默认为彩色显示,请使用以下命令:

sudo dmesg --color=always

人类时间戳

默认情况下,dmesg 使用秒的时间戳记法和 纳秒 自内核启动以来。 要使其以更人性化的格式呈现,请使用 -H(人类)选项。

sudo dmesg -H

这导致发生两件事。

输出会自动显示在 less 中。
时间戳显示带有日期和时间的时间戳,分辨率为分钟。 每分钟发生的消息都标有从该分钟开始的秒数和纳秒数。

人类可读的时间戳

如果您不需要纳秒级精度,但确实希望时间戳比默认值更容易阅读,请使用 -T(人类可读)选项。 (这有点令人困惑。-H 是“人类”选项,-T 是“人类可读”选项。)

sudo dmesg -T

时间戳呈现为标准日期和时间,但分辨率降低到一分钟。

一分钟内发生的所有事情都具有相同的时间戳。 如果您只关心事件的顺序,这已经足够了。 另外,请注意,您在命令提示符下被转储了。 此选项不会自动调用 less。

观看现场活动

要查看到达内核环形缓冲区的消息,请使用 –follow(等待消息)选项。 这句话可能看起来有些奇怪。 如果环形缓冲区用于存储启动序列期间发生的事件的消息,那么一旦计算机启动并运行,实时消息如何到达环形缓冲区?

任何导致连接到计算机的硬件发生变化的事情都会导致消息被发送到内核环形缓冲区。 更新或添加内核模块,您将看到有关这些更改的环形缓冲区消息。 如果您插入 USB 驱动器或连接或断开蓝牙设备,您将在 dmesg 输出中看到消息。 甚至虚拟硬件也会导致新消息出现在环形缓冲区中。 启动虚拟机,您将看到新信息到达环形缓冲区。

sudo dmesg --follow

请注意,您不会返回到命令提示符。 当新消息出现时,它们由终端窗口底部的 dmesg 显示。

即使安装 CD-ROM 磁盘也被视为一种更改,因为您已将 CD-ROM 磁盘的内容移植到目录树上。

要退出实时提要,请按 Ctrl+C。

检索最后十条消息

使用尾部命令 检索最后十个 内核环形缓冲区消息。 当然,您可以检索任意数量的消息。 十只是我们的例子。

sudo dmesg | last -10

最后十条消息被检索并在终端窗口中列出。

搜索特定术语

通过 grep 管道输出 dmesg 的输出 搜索特定的字符串或模式. 这里我们使用 -i (忽略大小写)选项,以便忽略匹配字符串的大小写。 我们的结果将包括“usb”和“USB”以及小写和大写的任何其他组合。

sudo dmesg | grep -i usb

突出显示的搜索结果为大写和小写。

我们可以隔离包含对第一个引用的消息 SCSI 系统 sda 上的硬盘。 (实际上,sda 现在也用于 第一个 SATA 硬盘,以及用于 USB 驱动器。)

sudo dmesg | grep -i sda

所有提及 sda 的消息都被检索并列在终端窗口中。

要使 grep 一次搜索多个术语,请使用 -E(扩展正则表达式)选项。 您必须使用管道“|”在带引号的字符串中提供搜索词搜索词之间的分隔符:

sudo dmesg | grep -E "memory|tty|dma"

须藤dmesg |  grep -E

任何提及任何搜索词的消息都会在终端窗口中列出。

sudo dmesg 的输出 |  grep -E

使用日志级别

记录到内核环形缓冲区的每条消息都附加了一个级别。 级别代表消息中信息的重要性。 级别是:

emerg:系统无法使用。
警告:必须立即采取行动。
crit:临界条件。
err:错误条件。
warn:警告条件。
注意:正常但重要的情况。
信息:信息。
调试:调试级消息。

我们可以让 dmesg 提取与特定级别匹配的消息,方法是使用 -l(级别)选项并将级别名称作为命令行参数传递。 要仅查看“信息”级消息,请使用以下命令:

sudo dmesg -l info

列出的所有消息都是参考消息。 它们不包含错误或警告,只是有用的通知。

在一个命令中组合两个或多个日志级别以检索多个日志级别的消息:

sudo dmesg -l debug,notice

dmesg 的输出是每个日志级别的消息的混合:

设施类别

dmesg 消息分为称为“设施”的类别。 设施清单如下:

kern:内核消息。
user:用户级消息。
邮件:邮件系统。
守护进程:系统守护进程。
auth:安全/授权消息。
syslog:内部 syslogd 消息。
lpr:行式打印机子系统。
news:网络新闻子系统。

我们可以要求 dmesg 过滤其输出以仅显示特定设施中的消息。 为此,我们必须使用 -f (facility) 选项:

sudo dmesg -f daemon

dmesg 列出了终端窗口中与守护进程相关的所有消息。

正如我们对关卡所做的那样,我们可以要求 dmesg 一次列出来自多个设施的消息:

sudo dmesg -f syslog, daemon

输出是系统日志和守护程序日志消息的混合。

结合设施和水平

-x(解码)选项使 dmesg 将设施和级别显示为每一行的人类可读前缀。

sudo dmesg -x

设施和级别可以在每行的开头看到:

第一个突出显示的部分是来自“内核”设施的消息,具有“通知”级别。 第二个突出显示的部分是来自“内核”设施的消息,具有“信息”级别。

这很好,但为什么呢?

简而言之,故障排除。

如果您遇到某个硬件无法识别或行为不正常的问题,dmesg 可能会对此问题有所了解。

使用 dmesg 查看从最高级别到每个较低级别的消息,查找提及硬件项目或可能与问题有关的任何错误或警告。
使用 dmesg 搜索任何提及适当设施的内容,以查看它们是否包含任何有用的信息。
通过 grep 管道 dmesg 并查找相关字符串或标识符,例如产品制造商或型号。
通过 grep 管道 dmesg 并查找诸如“gpu”或“storage”之类的通用术语,或诸如“failure”、“failed”或“unable”之类的术语。
使用 –follow 选项并实时观看 dmesg 消息。

狩猎愉快。