如何使用 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 來顯示手冊並瞭解有關其用法的更多資訊。