如何在Linux上使用dmesg命令
dmesg命令可让我们窥视Linux启动过程的隐藏世界。与故障查找器的朋友一起查看和监视来自内核自己的环形缓冲区的硬件设备和驱动程序消息。
Linux的环形缓冲区如何工作
在Linux和类似Unix的计算机中,启动和启动是计算机开机时发生的事件序列的两个不同阶段。
引导进程(BIOS或者UEFI,MBR和GRUB)将系统初始化到将内核加载到内存并连接到初始ramdisk(initrd或者initramfs),然后启动systemd的地步。
然后,启动过程将接力棒并完成操作系统的初始化。在初始化的早期阶段,诸如syslogdor rsyslogd之类的日志记录守护程序尚未启动并运行。为了避免在初始化的此阶段丢失明显的错误消息和警告,内核包含一个环形缓冲区,它用作消息存储区。
环形缓冲区是为消息保留的存储空间。它设计简单,尺寸固定。满时,较新的消息将覆盖最早的消息。从概念上讲,可以将其视为循环缓冲区。
内核环形缓冲区存储信息,例如设备驱动程序的初始化消息,来自硬件的消息以及来自内核模块的消息。由于环形缓冲区包含这些低级启动消息,因此是开始调查硬件错误或者其他启动问题的好地方。
dmesg命令
dmesg命令允许我们查看存储在环形缓冲区中的消息。默认情况下,我们需要使用sudo来使用dmesg。
sudo dmesg
环形缓冲区中的所有消息都显示在终端窗口中。
那是一场大雨。显然,我们需要做的是通过less
传递它:
sudo dmesg | less
现在,我们可以滚动查看消息以查找感兴趣的项目。
我们可以在less
中使用搜索功能来查找和突出显示我们感兴趣的项目和术语。在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
时间戳显示为标准日期和时间,但分辨率降低到一分钟。
一分钟内发生的所有事件都具有相同的时间戳。如果我们只关心事件的顺序,那么就足够了。此外,请注意,我们在命令提示符下将其转回。这个选项不会自动调用less
。
查看实时信息
要查看到达内核环形缓冲区的消息,请使用--follow(waiting messages)选项。该语句似乎有些奇怪。如果使用环形缓冲区来存储启动序列期间发生的事件中的消息,则一旦计算机启动并运行,实时消息如何到达环形缓冲区中?
任何导致连接到我们计算机的硬件发生变化的因素都会导致将消息发送到内核环形缓冲区。更新或者添加内核模块,我们将看到有关这些更改的环形缓冲区消息。如果插入U盘或者连接或者断开蓝牙设备,则会在dmesg
输出中看到消息。甚至虚拟硬件也将导致新消息出现在环形缓冲区中。启动虚拟机,我们将看到新信息到达环形缓冲区。
sudo dmesg --follow
请注意,我们不会返回到命令提示符。当出现新消息时,它们会在终端窗口底部以" dmesg"显示。
甚至安装CD-ROM磁盘也被视为更改,因为我们已将CD-ROM磁盘的内容移植到了目录树中。
要退出实时供稿,请按Ctrl + C。
检索最近的十条消息
使用tail命令检索最后一个Tenkernel环形缓冲区消息。当然,我们可以检索任意数量的消息。十个只是我们的例子。
sudo dmesg | last -10
检索最后十条消息并在终端窗口中列出。
搜索特定术语
将dmesg的输出通过grep进行管道传输,以搜索特定的字符串或者模式。这里我们使用-i
(忽略大小写)选项,这样忽略匹配字符串的大小写。我们的结果将包括USB和USB以及任何其他大小写组合。
sudo dmesg | grep -i usb
突出显示的搜索结果为大写和小写。
我们可以隔离出包含对sda系统上第一个SCSI硬盘的引用的消息。 (实际上,如今,第一个SATA硬盘和U盘也使用了sda。)
sudo dmesg | grep -i sda
所有提及" sda"的消息都会被检索并在终端窗口中列出。
要使grep一次搜索多个术语,请使用-E(扩展正则表达式)选项。我们必须在带引号的带引号的字符串中提供搜索词|搜索字词之间的分隔符:
sudo dmesg | grep -E "memory|tty|dma"
终端窗口中会列出任何提及任何搜索词的消息。
使用日志级别
记录到内核环形缓冲区的每个消息都有一个添加的级别。级别表示消息中信息的重要性。级别是:
emerg:系统无法使用。
警告:必须立即采取措施。
暴击:关键条件。
err:错误条件。
警告:警告条件。
注意:正常但状况显着。
信息:信息性。
debug:调试级别的消息。
我们可以通过使用-l
(level)选项并将该级别的名称作为命令行参数传递,来使dmesg
提取与特定级别匹配的消息。要仅查看信息级别的消息,请使用以下命令:
sudo dmesg -l info
列出的所有消息都是参考消息。它们不包含错误或者警告,仅包含有用的通知。
在一个命令中组合两个或者多个日志级别,以检索多个日志级别的消息:
sudo dmesg -l debug,notice
dmesg的输出是每个日志级别的消息的混合:
设施类别
dmesg消息被分为称为设施的类别。设施列表是:
内核:内核消息。
user:用户级别的消息。
mail:邮件系统。
守护程序:系统守护程序。
auth:安全/授权消息。
syslog:内部syslogd消息。
lpr:行式打印机子系统。
news:网络新闻子系统。
我们可以要求dmesg过滤其输出以仅显示特定设施中的消息。为此,我们必须使用-f
(facility)选项:
sudo dmesg -f daemon
dmesg在终端窗口中列出了所有与守护进程有关的消息。
正如我们对级别所做的那样,我们可以要求dmesg一次列出来自多个设施的消息:
sudo dmesg -f syslog, daemon
输出是syslog和守护程序日志消息的混合。