我怎樣才能找出 dmesg 中的條目是什麼意思?
查看 dmesg 中的條目很有趣,但是我怎樣才能找出它們的含義呢?我做到了
man dmesg
,但我找不到任何關於解碼消息本身的資訊。我想知道:**有沒有辦法深入了解每個條目的含義和來源?**例如,哪個驅動程序編寫了它(如果它是驅動程序),以及該消息的詳細含義是什麼?
dmesg 輸出範例:
[101466.656676] Read(10): 28 00 00 07 c4 25 00 00 01 00 [101466.656706] end_request: I/O error, dev sr0, sector 2035860 [101466.656722] Buffer I/O error on device sr0, logical block 508965 [101471.444586] sr 1:0:0:0: [sr0] Unhandled sense code [101471.444607] sr 1:0:0:0: [sr0] [101471.444616] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE [101471.444627] sr 1:0:0:0: [sr0] [101471.444634] Sense Key : Medium Error [current] [101471.444649] sr 1:0:0:0: [sr0] [101471.444657] Add. Sense: No seek complete [101471.444668] sr 1:0:0:0: [sr0] CDB: [101471.444675] Read(10): 28 00 00 07 c4 24 00 00 01 00 [101471.444705] end_request: I/O error, dev sr0, sector 2035856 [101471.444721] Buffer I/O error on device sr0, logical block 508964
沒有簡單的方法。這些消息是針對核心開發人員和經驗豐富的系統管理員的,而不是針對普通使用者的。它們沒有通用結構(除了括號中的數字,即自核心啟動以來的秒數)。
您可以在核心原始碼中查找消息文本。即使您不了解 C 程式語言,這也可以提供有用的資訊——至少找到消息在哪個文件中可以告訴您哪個驅動程序負責。要麼保留一個本地副本(大多數發行版都有一個包含核心源的軟體包,例如在 Debian 和衍生產品上),或者使用線上瀏覽器,例如Free Electrons的 LXR或linux.no 的 LXR(更好的搜尋,但經常被關閉)。
apt-get install kernel-source-*X.XX* && cd /usr/src && sudo tar xf linux-source-*X.XX*.tar.xz
搜尋時,請記住消息不會按字面意思出現在原始碼中。它們通常由模板和參數組成。例如,第二行來自
blk_update_request
函式 inblock/blk-core.c
:printk_ratelimited(KERN_ERR "end_request: %s error, dev %s, sector %llu\n", error_type, req->rq_disk ? req->rq_disk->disk_name : "?", (unsigned long long)blk_rq_pos(req));
模板中的第一個
%s
被替換為 的值error_type
,第二個%s
被替換為req->rq_disk->disk_name
(?
如果未設置,則為 a),並且%llu
被替換為返回的整數blk_rq_pos(req)
。給定消息所在的文件,它涉及塊設備。磁碟名稱告訴您哪個設備:sr0
. 如果您查看標准設備名稱,那就是“第一個 SCSI CD-ROM”(實際上,第一個使用類似 SCSI 協議的光碟機,包括大多數 IDE/SATA 和 USB 驅動器)。您可以繼續探索這些消息,但這裡有一個明顯的模式:它們都與
sr
. 所有這些都是由同一個問題引起的:讀取 DVD 時出現錯誤,在扇區 2035860 附近(即大約 1 GB — 一個扇區是 512 字節)。電腦突然被告知不存在磁碟(或無法讀取的磁碟),並嘗試移動到另一個扇區並讀取該扇區也失敗了。這可能是一粒灰塵、划痕或其他損壞的驅動器。其他問題可能會導致讀取錯誤,例如驅動器損壞或電纜損壞,但這些問題會一直影響讀取,而不僅僅是特定磁碟的特定區域。