如何使用 Linux dmesg 命令?


dmesg 命令是 Linux 命令行工具集中一个强大的工具。它代表“诊断消息”,用于读取和写入内核环形缓冲区的数据,内核环形缓冲区是一种数据结构,用于保存有关系统硬件、内核或驱动程序消息的信息。本文将指导您了解 dmesg 命令的使用,并提供示例及其输出。

基本用法

dmesg 命令最基本的用法是在终端中键入 dmesg 并按 Enter 键。这将在您的终端中显示所有内核消息。

$ dmesg

输出将是一长串消息,可能会让人不知所措。输出中的每一行都代表内核发出的单个消息,并且按记录的顺序显示。

过滤输出

鉴于消息量很大,过滤输出通常很有用。您可以将 grep 命令与 dmesg 命令结合使用以搜索特定术语。例如,如果您想查找与 USB 设备相关的消息,可以使用:

$ dmesg | grep −i usb

这将显示包含“usb”术语的所有行,不区分大小写。

显示带有时间戳的输出

默认情况下,dmesg 不会显示消息的时间戳。但是,您可以使用 -T 选项来显示人类可读的时间戳。

$ dmesg −T

输出现在将包含每条消息的日期和时间。

限制输出行数

如果要限制显示的行数,可以使用 -n 选项,后跟要显示的行数。例如,要显示最后 10 行,可以使用:

$ dmesg -n 10

显示特定级别的内核消息

内核消息分为八个级别,从 0(紧急)到 7(调试)。您可以使用 -l 选项,后跟级别,以显示特定级别的消息。例如,要仅显示紧急消息,可以使用:

$ dmesg -l emerg

清除 dmesg 日志

可以使用 -c 选项清除 dmesg 日志。如果您希望在运行预计会生成内核消息的过程之前清除旧消息,这将很有用。

$ sudo dmesg -c

请注意,此命令需要 root 权限。

让我们通过更多示例及其相应的输出深入了解 dmesg 命令。

示例 1:显示硬件消息

如果要显示与硬件相关的消息,可以使用 dmesg 命令和 grep 命令。例如,要显示与以太网适配器相关的消息,可以使用:

$ dmesg | grep -i eth

输出可能如下所示:

[    2.687402] r8169 0000:02:00.0 eth0: RTL8168h/8111h, 00:e0:4c:68:22:2a, XID 541, IRQ 47
[    2.687405] r8169 0000:02:00.0 eth0: jumbo features [frames: 9200 bytes, tx checksumming: ko]
[    3.056728] r8169 0000:02:00.0 eth0: link down
[    3.056790] r8169 0000:02:00.0 eth0: link down
[    3.056891] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready

示例 2:显示启动消息

要显示与启动过程相关的消息,可以使用:

$ dmesg | grep -i boot

输出可能如下所示:

[    0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-5.4.0-26-generic root=UUID=5a598e63-8b76-4619-9182-2b7e7b0f0b1c ro quiet splash vt.handoff=7
[    0.000000] [Firmware Bug]: ACPI MWAIT C-state 0x0 not supported by HW (0x0)
[    0.000000] ACPI: \_PR_.CPU0: _OSC native thermal LVT Acked
[    0.232991] ACPI: Added _OSI(Linux-Dell-Video)
[    0.232991] ACPI: Added _OSI(Linux-Lenovo-NV-HDMI-Audio)
[    0.232991] ACPI: Added _OSI(Linux-HPI-Hybrid-Graphics)

示例 3:显示与特定设备相关的消息

如果要显示与特定设备相关的消息,可以使用 grep 命令加上设备名称。例如,要显示与 sda 设备相关的消息,可以使用:

$ dmesg | grep -i sda

输出可能如下所示:

[    1.684723] sd 0:0:0:0: [sda] 500118192 512-byte logical blocks: (256 GB/238 GiB)
[    1.684727] sd 0:0:0:0: [sda] Write Protect is off
[    1.684729] sd 0:0:0:0: [sda] Mode Sense: 00 3a 00 00
[    1.684743] sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[    1.685918]  sda: sda1 sda2 sda3
[    1.686329] sd 0:0:0:0: [sda] Attached SCSI disk

示例 4:显示上次启动的消息

要显示上次启动的消息,可以使用 -b 选项,后跟 1:

$ dmesg -b 1

输出将类似于默认的 dmesg 输出,但它仅包含上次启动的消息。

示例 5:显示与内存相关的消息

要显示与内存相关的消息,可以使用:

$ dmesg | grep -i memory

输出可能如下所示:

[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009d3ff] usable
[    0.000000] BIOS-e820: [mem 0x000000000009d400-0x000000000009ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x000000007b9fdfff] usable
[    0.000000] BIOS-e820: [mem 0x000000007b9fe000-0x000000007ba53fff] ACPI NVS

请记住,这些命令的实际输出将根据您的系统配置和当前状态而有所不同。

示例 6:显示与 CPU 相关的消息

要显示与 CPU 相关的消息,可以使用:

$ dmesg | grep -i cpu

输出可能如下所示:

[    0.000000] smpboot: CPU0: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz (family: 0x6, model: 0x9e, stepping: 0x9)
[    0.000000] Performance Events: PEBS fmt3+, Skylake events, 32-deep LBR, full-width counters, Intel PMU driver.
[    0.000000] ... version:                4
[    0.000000] ... bit width:              48
[    0.000000] ... generic registers:      4
[    0.000000] ... value mask:             0000ffffffffffff
[    0.000000] ... max period:             00007fffffffffff
[    0.000000] ... fixed-purpose events:   3
[    0.000000] ... event mask:             000000070000000f

示例 7:显示与特定时间范围相关的消息

如果要显示特定时间范围内的消息,可以使用 -T 选项和 grep 命令。例如,要显示 5 月 30 日的消息,可以使用:

$ dmesg -T | grep 'May 30'

输出将包含 5 月 30 日的所有消息。

示例 8:显示与磁盘错误相关的消息

要显示与磁盘错误相关的消息,可以使用:

$ dmesg | grep -i error

输出可能如下所示:

[    2.687402] EXT4-fs (sda1): re-mounted. Opts: errors=remount-ro
[    3.056728] ACPI Error: [DSSP] Namespace lookup failure, AE_NOT_FOUND (20170831/psargs-364)
[    3.056790] ACPI Error: Method parse/execution failed \_SB.PCI0.SAT0.SPT5._GTF, AE_NOT_FOUND (20170831/psparse-550)
[    3.056891] ACPI Error: [DSSP] Namespace lookup failure, AE_NOT_FOUND (20170831/psargs-364)
[    3.056891] ACPI Error: Method parse/execution failed \_SB.PCI0.SAT0.SPT5._GTF, AE_NOT_FOUND (20170831/psparse-550)

示例 9:显示与网络相关的消息

要显示与网络相关的消息,可以使用:

$ dmesg | grep -i net

输出可能如下所示:

[    0.000000] NET: Registered protocol family 16
[    0.000000] audit: initializing netlink subsys (disabled)
[    0.000000] audit: type=2000 audit(1622470186.040:1): state=initialized audit_enabled=0 res=1
[    0.000000] workingset: timestamp_bits=46 max_order=20 bucket_order=0
[    0.000000] NFS: Registering theid_resolver key type
[    0.000000] Key type id_resolver registered
[    0.000000] Key type id_legacy registered
[    0.000000] NET: Registered protocol family 38
[    0.000000] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 244)
[    0.000000] io scheduler mq-deadline registered
[    0.000000] io scheduler kyber registered

示例 10:显示与文件系统相关的消息

要显示与文件系统相关的消息,可以使用:

$ dmesg | grep -i fs

输出可能如下所示:

[    0.000000] Freeing unused kernel image memory: 2028K
[    0.000000] Write protecting the kernel read-only data: 20480k
[    0.000000] Freeing unused kernel image memory: 1984K
[    0.000000] Freeing unused kernel image memory: 1836K
[    0.000000] x86/mm: Checked W+X mappings: passed, no W+X pages found.
[    0.000000] rodata_test: all tests were successful
[    0.000000] x86/mm: Checking user space page tables
[    0.000000] x86/mm: Checked W+X mappings: passed, no W+X pages found.
[    0.000000] Run /init as init process
[    0.000000]   with arguments:
[    0.000000]     /init
[    0.000000]   with environment:
[    0.000000]     HOME=/
[    0.000000]     TERM=linux
[    0.000000]     BOOT_IMAGE=/boot/vmlinuz-5.4.0-26-generic

请记住,这些命令的实际输出将根据您的系统配置和当前状态而有所不同。

结论

dmesg 命令是用于诊断和排除系统问题的一个强大工具。它提供了大量有关系统操作的信息,并且可以使用正确的选项过滤和格式化这些信息以满足您的需求。与任何命令一样,您可以使用 man dmesg 来显示手册并了解有关其用法的更多信息。

更新于: 2023-07-13

379 次浏览

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告