文章目录
- 1. Overview
- 2.ring buffer怎样工作?
- 3.dmesg命令
- 4.移除sudo需求
- 5. 强制彩色输出
- 6.使用人性化的时间戳
- 7.使用dmesg的人性化可读时间戳
- 8.观察实时event
- 9.检索最后10条消息
- 10.搜索特定术语
- 11.使用Log Levels
- 12.使用Facility Categories
- 13.Combining Facility and Level
- 14.结尾
1. Overview
- dmesg 命令允许查看存储在 Linux ring buffer中的消息,从而深入了解硬件错误和启动问题。
- 我们能自定义dmesg命令组合,实现如下目的:
removing the need for sudo(消除对 sudo 的需要)
forcing color output(强制颜色输出)
using human-readable timestamps(使用人性化可读的时间戳)
watching live events(观看实时事件)
retrieving the last messages(检索最后的消息)
searching for specific terms(搜索特定术语)
filtering by log levels or facility categories(按日志级别或设施类别进行过滤来自定义 dmesg 命令)
总之,dmesg 命令可帮助我们深入了解 Linux 启动过程中的隐藏世界。 检查和监视来自内核自己的环形缓冲区的硬件设备和驱动程序消息。
2.ring buffer怎样工作?
在 Linux 和类 Unix 计算机中,booting和startup动是计算机power on时发生的事件序列的两个不同阶段。
booting过程(BIOS 或 UEFI、MBR 和 GRUB)将系统初始化到加载内核到内存并连接到初始 RAM 磁盘(initrd 或 initramfs)以及启动 systemd 的阶段。
然后startup过程接手,完成操作系统的初始化。 在初始化的早期阶段,日志守护进程(例如 syslogd 或 rsyslogd)尚未启动并运行。 为了避免在初始化阶段丢失错误消息和警告,内核包含一个用于消息存储的环形缓冲区(ring buffer)。
环形缓冲区是为消息保留的内存空间。 它设计简单,尺寸固定。 当它已满时,较新的消息将覆盖最旧的消息。 从概念上讲,它可以被认为是“循环缓冲区(cirular buffer)”。
内核环形缓冲区存储设备驱动程序的初始化消息、来自硬件的消息以及来自内核模块的消息等信息。 由于环形缓冲区包含这些低级启动消息,因此它是开始调查硬件错误或其他启动问题的好地方。
这就是 dmesg 命令发挥作用的地方。
3.dmesg命令
dmesg 命令允许查看存储在ring buffer中的消息。 默认情况下,需要使用 sudo 才能使用 dmesg。
sudo dmesg
ring buffer中的所有消息都显示在终端窗口中。
Initializing cgroup subsys cpuset
Initializing cgroup subsys cpu
Linux version 2.6.32-300.10.1.el5uek (mockbuild@ca-build56.us.oracle.com) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-50)) #1 SMP Wed Feb 22 17:37:40 EST 2012
Command line: ro root=LABEL=/ rhgb quiet
KERNEL supported cpus:
Intel GenuineIntel
AMD AuthenticAMD
Centaur CentaurHauls
BIOS-provided physical RAM map:
BIOS-e820: 0000000000000000 - 000000000009f800 (usable)
BIOS-e820: 000000000009f800 - 00000000000a0000 (reserved)
BIOS-e820: 00000000000dc000 - 0000000000100000 (reserved)
BIOS-e820: 0000000000100000 - 00000000bfee0000 (usable)
BIOS-e820: 00000000bfee0000 - 00000000bfeff000 (ACPI data)
BIOS-e820: 00000000bfeff000 - 00000000bff00000 (ACPI NVS)
BIOS-e820: 00000000bff00000 - 00000000c0000000 (usable)
BIOS-e820: 00000000f0000000 - 00000000f8000000 (reserved)
BIOS-e820: 00000000fec00000 - 00000000fec10000 (reserved)
BIOS-e820: 00000000fee00000 - 00000000fee01000 (reserved)
BIOS-e820: 00000000fffe0000 - 0000000100000000 (reserved)
BIOS-e820: 0000000100000000 - 00000001c0000000 (usable)
DMI present.
Phoenix BIOS detected: BIOS may corrupt low RAM, working around it.
由于内容太多,需要做使用 less 进行管道传输:
sudo dmesg | less
pciehp 0000:00:15.0:pcie04: service driver pciehp loaded
pciehp 0000:00:15.1:pcie04: HPC vendor_id 15ad device_id 7a0 ss_vid 0 ss_did 0
pciehp 0000:00:15.1:pcie04: service driver pciehp loaded
pciehp 0000:00:15.2:pcie04: HPC vendor_id 15ad device_id 7a0 ss_vid 0 ss_did 0
pciehp 0000:00:15.2:pcie04: service driver pciehp loaded
pciehp 0000:00:15.3:pcie04: HPC vendor_id 15ad device_id 7a0 ss_vid 0 ss_did 0
pciehp 0000:00:15.3:pcie04: service driver pciehp loaded
pciehp 0000:00:15.4:pcie04: HPC vendor_id 15ad device_id 7a0 ss_vid 0 ss_did 0
pciehp 0000:00:15.4:pcie04: service driver pciehp loaded
pciehp 0000:00:15.5:pcie04: HPC vendor_id 15ad device_id 7a0 ss_vid 0 ss_did 0
pciehp 0000:00:15.5:pcie04: service driver pciehp loaded
pciehp 0000:00:15.6:pcie04: HPC vendor_id 15ad device_id 7a0 ss_vid 0 ss_did 0
pciehp 0000:00:15.6:pcie04: service driver pciehp loaded
/service
可以使用 less 中的搜索功能来定位并突出显示感兴趣的项目和术语。通过在 less 中按正斜杠键“/”来启动搜索功能。
4.移除sudo需求
如果想避免每次使用 dmesg 时都必须使用 sudo,可以使用此命令。
但是,请注意:它允许任何拥有您计算机用户帐户的人使用 dmesg,而无需使用 sudo。
sudo sysctl -w kernel.dmesg_restrict=0
5. 强制彩色输出
默认情况下,dmesg 可能会配置为生成彩色输出。 如果不是,可以告诉 dmesg 使用 -L(颜色)选项为其输出着色。
sudo dmesg -L
要强制 dmesg 始终默认为彩色显示,使用以下命令:
sudo dmesg --color=always
6.使用人性化的时间戳
默认情况下,dmesg 使用自内核启动以来的秒和纳秒时间戳记法。 要以更人性化的格式呈现此内容,请使用 -H(人性化)选项。
这会导致两件事发生。
[Jul30 10:26] Initializing cgroup subsys cpuset
[ +0.000000] Initializing cgroup subsys cpu
[ +0.000000] Initializing cgroup subsys cpuacct
[ +0.000000] Linux version 3.10.0-1062.12.1.el7.x86_64 (mockbuild@jenkins-10-147-72-125-c2dc54eb-871b-45db-b195-4c48862bf1cf) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-39.0.1) (GCC) ) #1 SMP Tue Feb 4 15:08:25 PST
[ +0.000000] Command line: BOOT_IMAGE=/vmlinuz-3.10.0-1062.12.1.el7.x86_64 root=UUID=521925fd-a19d-46cb-8b1a-8edb5291928f ro crashkernel=auto rhgb quiet numa=off transparent_hugepage=never LANG=en_US.UTF-8
[ +0.000000] Disabled fast string operations
[ +0.000000] e820: BIOS-provided physical RAM map:
[ +0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009ebff] usable
[ +0.000000] BIOS-e820: [mem 0x000000000009ec00-0x000000000009ffff] reserved
[ +0.000000] BIOS-e820: [mem 0x00000000000dc000-0x00000000000fffff] reserved
[ +0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000bfedffff] usable
[ +0.000000] BIOS-e820: [mem 0x00000000bfee0000-0x00000000bfefefff] ACPI data
[ +0.000000] BIOS-e820: [mem 0x00000000bfeff000-0x00000000bfefffff] ACPI NVS
[ +0.000000] BIOS-e820: [mem 0x00000000bff00000-0x00000000bfffffff] usable
[ +0.000000] BIOS-e820: [mem 0x00000000f0000000-0x00000000f7ffffff] reserved
[ +0.000000] BIOS-e820: [mem 0x00000000fec00000-0x00000000fec0ffff] reserved
[ +0.000000] BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved
[ +0.000000] BIOS-e820: [mem 0x00000000fffe0000-0x00000000ffffffff] reserved
[ +0.000000] BIOS-e820: [mem 0x0000000100000000-0x000000043fffffff] usable
输出会自动以 less 形式显示。
时间戳显示带有日期和时间的时间戳,分辨率为分钟。 每分钟发生的消息都标有从该分钟开始算起的秒数和纳秒数。
7.使用dmesg的人性化可读时间戳
如果不需要纳秒精度,但确实希望时间戳比默认值更容易阅读,可以使用 -T (人类可读)选项。(这有点令人困惑。-H 是“人性化”选项,-T 是“人性化可读”选项。)
sudo dmesg -T
时间戳呈现为标准日期和时间,但分辨率降低到一分钟。
[Sun Jul 30 10:26:23 2023] Disabled fast string operations
[Sun Jul 30 10:26:23 2023] e820: BIOS-provided physical RAM map:
[Sun Jul 30 10:26:23 2023] BIOS-e820: [mem 0x0000000000000000-0x000000000009ebff] usable
[Sun Jul 30 10:26:23 2023] BIOS-e820: [mem 0x000000000009ec00-0x000000000009ffff] reserved
[Sun Jul 30 10:26:23 2023] BIOS-e820: [mem 0x00000000000dc000-0x00000000000fffff] reserved
[Sun Jul 30 10:26:23 2023] BIOS-e820: [mem 0x0000000000100000-0x00000000bfedffff] usable
[Sun Jul 30 10:26:23 2023] BIOS-e820: [mem 0x00000000bfee0000-0x00000000bfefefff] ACPI data
[Sun Jul 30 10:26:23 2023] BIOS-e820: [mem 0x00000000bfeff000-0x00000000bfefffff] ACPI NVS
Everything that happened within a single minute has the same timestamp. If all you’re bothered about is the sequence of events, this is good enough. Also, note that you’re dumped back at the command prompt. This option doesn’t automatically invoke less.
一分钟内发生的所有事情都有相同的时间戳。 如果所关心的只是事件的顺序,那么这就足够了。
8.观察实时event
任何导致连接到计算机的硬件发生变化的情况都会导致消息发送到内核ring buffer。 更新或添加内核模块,将看到有关这些更改的ring buffer消息。 如果插入 USB 驱动器或连接或断开蓝牙设备,将在 dmesg 输出中看到消息。 即使虚拟硬件也会导致新消息出现在ring buffer中。 启动虚拟机,将看到新信息到达ring buffer。
sudo dmesg --follow
请注意,命令执行后不会返回到命令提示符。 当新消息出现时,它们会由 dmesg 显示在终端窗口的底部。
甚至挂载 CD-ROM 盘也被视为变化,因为已将 CD-ROM 盘的内容移植到目录树上。
要退出实时反馈,按Ctrl+C。
9.检索最后10条消息
sudo dmesg | last -10
10.搜索特定术语
将 dmesg 的输出通过管道传输到 grep 以搜索特定的字符串或模式。 这里我们使用 -i(忽略大小写)选项,以便忽略匹配字符串的大小写。 我们的结果将包括“usb”和“USB”以及任何其他小写和大写的组合。
sudo dmesg | grep -i usb
突出显示的搜索结果以大写和小写形式显示。
我们可以隔离包含对系统 sda 上第一个 SCSI 硬盘的引用的消息。 (实际上,sda 现在也用于第一个 SATA 硬盘驱动器和 USB 驱动器。)
[oracle@test ~]$ sudo dmesg | grep -i sda
[ 2.016997] sd 0:0:0:0: [sda] 83886080 512-byte logical blocks: (42.9 GB/40.0 GiB)
[ 2.017043] sd 0:0:0:0: [sda] Write Protect is off
[ 2.017045] sd 0:0:0:0: [sda] Mode Sense: 61 00 00 00
[ 2.017066] sd 0:0:0:0: [sda] Cache data unavailable
[ 2.017068] sd 0:0:0:0: [sda] Assuming drive cache: write through
[ 2.026601] sda: sda1 sda2 sda3
[ 2.027336] sd 0:0:0:0: [sda] Attached SCSI disk
[ 2.392710] EXT4-fs (sda2): mounted filesystem with ordered data mode. Opts: (null)
[ 6.802833] EXT4-fs (sda2): re-mounted. Opts: (null)
[ 9.187060] Adding 8388604k swap on /dev/sda3. Priority:-2 extents:1 across:8388604k FS
[ 9.676498] EXT4-fs (sda1): mounted filesystem with ordered data mode. Opts: (null)
要使 grep 一次搜索多个术语,请使用 -E(扩展正则表达式)选项。 必须在带引号的字符串内提供搜索词,并使用管道“|” 搜索词之间的分隔符:
sudo dmesg | grep -E "memory|tty|dma"
11.使用Log Levels
记录到内核ring buffer的每条消息都附加了一个级别。 级别代表消息中信息的重要性。 级别为:
emerg:系统无法使用。
alert:必须立即采取行动。
Crit:危急情况。
err:错误情况。
warn:警告情况。
notice:正常但重要的情况。
information:信息性的。
debug:调试级别消息。
We can make dmesg extract messages that match a particular level by using the -l (level) option and passing the name of the level as a command-line parameter. To see only “informational” level messages, use this command:
我们可以使用 -l(级别)选项并将级别名称作为命令行参数传递,从而使 dmesg 提取与特定级别匹配的消息。 要仅查看“information”级别的消息,使用以下命令:
sudo dmesg -l info
将两个或多个日志级别组合在一个命令中以检索多个日志级别的消息:
sudo dmesg -l debug,notice
12.使用Facility Categories
The Facility Categories
dmesg消息被分组为称为“facilities”的类别。facilities列表如下:
kern:内核消息。
user:用户级消息。
mail:邮件系统。
daemon:系统守护进程。
auth:安全/授权消息。
syslog:内部syslogd消息。
lpr:打印子系统。
news:网络新闻子系统。
We can ask dmesg to filter its output to only show messages in a specific facility. To do so, we must use the -f (facility) option:
我们可以要求 dmesg 过滤其输出,仅显示特定设施中的消息。 为此,我们必须使用 -f(facility)选项:
sudo dmesg -f daemon
如同我们对级别所做的那样,我们可以要求 dmesg 同时列出来自多个设施的消息:
sudo dmesg -f syslog, daemon
输出是系统日志和守护程序日志消息的混合。
13.Combining Facility and Level
The -x (decode) option makes dmesg show the facility and level as human-readable prefixes to each line.
-x(decode)选项使 dmesg 将facility和level显示为每行的人类可读前缀。
sudo dmesg -x
第一个突出显示的部分是来自“kernel”设施的消息,级别为“notice”。 第二个突出显示的部分是来自“kernel”设施的消息,级别为“info”。
14.结尾
简而言之,就是找错。
如果遇到某个硬件无法识别或运行不正常的问题,dmesg 可能会对该问题有所帮助。
使用 dmesg 从最高级别到每个较低级别查看消息,查找提及硬件项目或可能与问题有关的任何错误或警告。
使用 dmesg 搜索任何提及的适当设施,看看它们是否包含任何有用的信息。
通过 grep 管道 dmesg 并查找相关字符串或标识符,例如产品制造商或型号。
通过 grep 管道 dmesg 并查找“gpu”或“存储”等通用术语,或“失败”、“失败”或“无法”等术语。
使用 --follow 选项并实时观看 dmesg 消息。