如何在Linux上使用dmesg命令

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

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

在Linux和类似Unix的计算机中,启动和启动是计算机通电时发生的事件序列中的两个截然不同的阶段。

引导进程(BIOS或UEFI、MBR和GRUB)将系统初始化到将内核加载到内存并连接到初始ramdisk(initrd或initramfs),然后启动systemd。

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

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

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

但不要空手而归。带着他一起去吧。

dmesg命令

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

sudo dmesg

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

那是一场洪水。很明显,我们需要做的是通过更少的管道:

sudo dmesg | less

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

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

相关:如何在Linux上使用LESS命令

消除了对sudo的需求

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

sudo sysctl -w kernel.dmesg_restrict=0

强制颜色输出

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

sudo dmesg -L

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

sudo dmesg --color=always

人类时间戳

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

sudo dmesg -H

这会导致两件事发生。

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

人类可读的时间戳

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

sudo dmesg -T

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

一分钟内发生的所有事情都有相同的时间戳。如果你所关心的只是事件的顺序,这就足够了。另外,请注意,在命令提示符下会将你转回原处。此选项不会自动调用较少。

观看现场活动

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

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

sudo dmesg --follow

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

甚至挂载CD-ROM光盘也被视为一种改变,因为您已经将CD-ROM光盘的内容嫁接到了目录树上。

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

检索最后十条消息

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

sudo dmesg | last -10

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

搜索特定术语

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

sudo dmesg | grep -i usb

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

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

sudo dmesg | grep -i sda

所有提到SDA的消息都会在终端窗口中检索并列出。

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

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

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

使用日志级别

记录到内核环缓冲区的每条消息都附加了一个级别。该级别表示消息中信息的重要性。这些级别包括:

紧急情况:系统无法使用。 警告:必须立即采取行动。 危急:情况危急。 错误:错误条件。 警告:警告条件。 注意:正常但重要的情况。 信息:信息性。 调试:调试级消息。

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

sudo dmesg -l info

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

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

sudo dmesg -l debug,notice

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

设施类别

dmesg消息被分组到称为“设施”的类别中。设施列表如下:

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

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

sudo dmesg -f daemon

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

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

sudo dmesg -f syslog, daemon

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

组合设施和标高

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

sudo dmesg -x

设施和标高可以在每行的开始处看到:

第一个突出显示的部分是来自“内核”工具的消息,级别为“通知”。第二个突出显示的部分是来自“kernel”工具的消息,级别为“info”。

太好了,但是为什么呢?

简而言之,就是找毛病。

如果您遇到硬件无法识别或运行不正常的问题,dmesg可能会提供一些信息。

使用dmesg查看从最高级别到每个较低级别的消息,查找提及硬件项目或可能与问题相关的任何错误或警告。 使用dmesg搜索任何提到的适当的测试工具,以查看它们是否包含任何有用的信息。 通过grep管道dmesg并查找相关的字符串或标识符,如产品制造商或型号。 通过grep管道dmesg并查找诸如“GPU”或“存储”之类的通用术语,或者诸如“失败”、“失败”或“无法”之类的术语。 使用--Follow选项并实时查看dmesg消息。

狩猎愉快。

相关文章