天天看點

如何在 Linux 上使用 dmesg 指令

看到一篇講解 dmesg 很好的英文文章,這裡翻譯一下,以下是譯文。

dmesg 指令可以讓你更深入的了解 Linux 啟動的潛在過程,可以從核心的環形緩沖區(ring buffer)檢視并監視硬體裝置和驅動消息。

一、Linux 環形緩沖區是如何工作的呢 ?

在 Linux 和類 Unix 系統中,引導和啟動是計算機開機後,事件序列中兩個不同的階段。

引導過程(BIOS或UEFI,MBR和GRUB)會初始化系統,這時核心被加載進記憶體,并且連接配接到初始 ramdisk(initrd或initramfs),然後,systemd被啟動。

然後,啟動過程繼續完成初始化作業系統的工作。在初始化階段的早期,日志記錄 daemons(例如:syslogd或rsyslogd)尚未啟動及運作。為了避免在初始化階段丢失明顯的錯誤消息和警告,核心包含了一個可以儲存消息的環形緩沖區。

環形緩沖區是用于存儲消息的記憶體空間,它設計簡單,固定大小。當存儲滿時,最新的消息會覆寫最舊的消息,是以被稱作是“環形緩沖區”。

核心環形緩沖區能夠存儲消息,比如:裝置驅動程式的初始化消息,硬體消息以及核心子產品消息。因為它包含低等級的啟動消息,是以環形緩沖區非常适合于檢視硬體錯誤或其它啟動問題。

二、dmesg 指令

dmesg 指令可以檢視環形緩沖區中的消息。預設情況下,執行 dmesg 需要添加 sudo。

$ sudo dmesg
           

環形緩沖區中的所有消息都被顯示到終端視窗中。

如何在 Linux 上使用 dmesg 指令

通常會輸出很多的消息,這可以通過 less 指令來解決:

$ sudo dmesg | less
           

這樣,我們就可以滾動查找我們需要的内容。

如何在 Linux 上使用 dmesg 指令

你可以使用搜尋功能來定位并高亮你想要搜尋的内容,在 less 指令中使用 “/” 來進行搜尋。

三、不使用 sudo 

如果你不想每次執行指令都要添加 sudo,可以進行如下設定。但是,要注意的是:這會讓你計算機上的任何賬戶都不必使用 sudo 來執行 dmesg。

$ sudo sysctl -w kernel.dmesg_restrict=0
           

四、輸出中添加顔色

預設情況下,dmesg 的輸出帶有顔色,如果不是這樣,你可以在執行指令時添加 -L 參數。

$ sudo dmesg -L
           

為了強制執行 dmesg 指令時,預設有顔色輸出,使用如下指令:

$ sudo dmesg --color=always
           

五、人性化時間戳

預設情況下,核心啟動後,dmesg 使用時間戳記錄秒和納秒,如果想要更人性化的輸出,可以使用 -H (human) 參數。

$ sudo dmesg -H
           

這會帶來兩個問題。

如何在 Linux 上使用 dmesg 指令
  • 輸出會自動顯示更少的内容;
  • 時間戳帶有日期和時間,并具有分鐘分辨率。每分鐘發生的消息都從該分鐘的秒和納秒算起。

六、人們可讀的時間戳

如果你并不需要十億分之一秒的精度,但是你希望時間戳比預設時間戳更易于閱讀,那就使用 -T (human readable) 參數(這裡可能讓你有點困惑,-H 是 “human” 參數,-T 是“human readable” 參數)。

$ sudo dmesg -T
           

時間戳顯示為标準日期和時間,但分辨率降低到一分鐘。

如何在 Linux 上使用 dmesg 指令

一分鐘内發生的所有事件都具有相同的時間戳。如果你隻關心事件順序,那這就足夠了。另外,請注意,你将在指令提示符處轉儲回去,此操作不會自動減少調用。

七、檢視活動的事件

為了檢視到達核心環形緩沖區中的消息,可以使用 --follow(等待消息) 參數。這可能看起來有點陌生。如果使用環形緩沖區來存儲啟動序列期間事件的消息,那麼,一旦計算機啟動并運作,實時消息如何到達環形緩沖區中呢?

連接配接到計算機的硬體産生的任何變化都被發送到核心環形緩沖區中。在更新或添加核心子產品時,你将會在環形緩沖區中看到相應事件的消息。 如果插入USB驅動器、連接配接或斷開藍牙裝置,都會看到 dmesg 消息輸出。甚至虛拟硬體也将導緻新消息出現在環形緩沖區中。 啟動虛拟機,您将看到環形緩沖區中産生新消息。

$ sudo dmesg --follow
           

請注意:執行指令後不會傳回到指令提示符下。當新消息出現時,它們将顯示在 dmesg 終端視窗的底部。

如何在 Linux 上使用 dmesg 指令

甚至挂載一個 CD-ROM 磁盤也會産生日志,因為挂載後,CD-ROM磁盤的内容就會進入到目錄樹中。

如何在 Linux 上使用 dmesg 指令

要退出 dmesg 實時消息,請使用 Ctrl+C。

八、檢索最近的 10 條消息

使用 tail 指令檢索最後十個核心環形緩沖區消息。當然,你也可以檢索任意數量的消息。 檢索十個隻是一個例子。

$ sudo dmesg | tail -10
           

檢索最後十條消息并在終端視窗中列出。

如何在 Linux 上使用 dmesg 指令

九、搜尋特定術語

使用 grep 将 dmesg 的輸出通過管道傳輸以搜尋特定的字元串或模式。在這裡,我們使用 -i(忽略大小寫)參數,以便忽略比對字元串的大小寫。 我們的結果将包括“usb”和“USB”以及任何其他大小寫組合,如下所示:

$ sudo dmesg | grep -i usb
           

高亮顯示了搜尋出的結果:

如何在 Linux 上使用 dmesg 指令

我們可以隔離包含對系統sda上第一個SCSI硬碟的引用的消息。(實際上,現在第一個SATA硬碟和USB驅動器也使用sda)

$ sudo dmesg | grep -i sda
           

所有關于sda的消息都将被檢索,并在終端視窗中列出。

如何在 Linux 上使用 dmesg 指令

想要使用 grep 一次搜尋多個關鍵詞,請使用 -E(擴充正規表達式)參數。 你必須在帶引号的字元串中使用管道“ |”符号分隔不同的搜尋詞,如下所示:

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

終端視窗中會列出與任意搜尋詞相比對的内容,如下所示:

如何在 Linux 上使用 dmesg 指令

十、使用日志級别

記錄到核心環形緩沖區的每個消息都有一個附加的級别。 級别表示資訊的重要性。 包含的級别有:

  • emerg : 系統無法使用;
  • alert : 必須立即采取措施;
  • crit : 嚴重的情況;
  • err : 錯誤;
  • warn :  警告;
  • notice : 正常但是重要的情況;
  • info : 消息;
  • debug : 調試資訊;

通過使用 -l(level)參數并将級别的名稱作為指令行參數傳遞,可以提取與特定級别比對的消息。 如果檢視“informational”級别的消息,請使用如下指令:

$ sudo dmesg -l info
           

列出的所有消息都是"info"消息。 它們不包含錯誤或警告,僅包含有用的通知。

如何在 Linux 上使用 dmesg 指令

可以在一個指令中組合兩個或多個日志級别,以檢索多個日志級别的消息:

$ sudo dmesg -l debug,notice
           

dmesg的輸出是所查詢日志級别的消息的混合:

如何在 Linux 上使用 dmesg 指令

十一、裝置類别

dmesg消息分可以根據“裝置”的類别分成多個組“裝置”。 裝置的清單是:

  • kern : 核心消息;
  • user : 使用者級别的消息;
  • mail : 郵件系統;
  • daemon : 系統守護程式;
  • auth : 安全/授權消息;
  • syslog : 内部 syslogd 消息;
  • lpr : 行式列印機子系統;
  • news : 網絡消息子系統;

我們可以要求 dmesg 過濾其輸出,以僅顯示特定裝置中的消息。為此,我們必須使用-f(功能)選項:

$ sudo dmesg -f daemon
           

dmesg 在終端視窗中列出了與守護程式有關的所有消息。

如何在 Linux 上使用 dmesg 指令

正如我們對級别所做的那樣,我們可以要求dmesg一次列出多個設施的消息:

$ sudo dmesg -f syslog,daemon
           

輸出是syslog和daemon日志消息的混合。

如何在 Linux 上使用 dmesg 指令

十二、設施與等級相結合

-x(解碼)選項使dmesg将裝置和級别顯示為人性化可讀的每行的字首。

$ sudo dmesg -x
           

在每一行的開頭可以看到具體的裝置和級别:

如何在 Linux 上使用 dmesg 指令

在上圖中,第一行突出顯示的部分是來自“kernel”裝置的消息,級别為“notice”。 第二行突出顯示的部分是來自“kernel”裝置的消息,級别為“info”。

這太好了,但是為什麼呢?

簡而言之,就是發現故障。

如果你遇到某個硬體無法識别或行為不正常的問題,則dmesg可能會對該問題有所幫助。

  • 使用 dmesg 可以檢視從最進階别到每個較低級别的消息,以查找涉及硬體的任何錯誤或警告,或者可能的相關問題;
  • 使用 dmesg 搜尋指令列出的裝置,以檢視它們是否包含任何有用的資訊;
  • 将 dmesg 産生的消息通過管道傳遞給指令 grep,以便查找相關的字元串或辨別符,例如産品制造商或型号;
  • 将 dmesg 産生的消息通過管道傳遞給指令 grep,以便查找通用術語,比如:“ gpu”、“ storage”、“ failure”、“ failed”或“ unable”;
  • 使用 --follow 參數,實時檢視 dmesg 消息。

聲明:以上為譯文,如若侵權請聯系作者删除!

原文連結:How to Use the dmesg Command on Linux

繼續閱讀