如何找出 dmesg 中的条目的含义?

如何找出 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

答案1

没有简单的方法。这些消息适用于内核开发人员和经验丰富的系统管理员,而不是普通用户。它们没有通用结构(除了括号中的数字,即自内核启动以来的秒数)。

您可以在内核源代码中查找消息文本。即使您不了解 C 编程语言,这也可以提供有用的信息 — 至少找到该消息位于哪个文件中可以告诉您哪个驱动程序负责。要么保留本地副本(大多数发行版都有一个包含内核源代码的软件包,例如在 Debian 及其衍生版本上),要么使用在线浏览器,例如apt-get install kernel-source-X.XX && cd /usr/src && sudo tar xf linux-source-X.XX.tar.xz自由电子的 LXR或者LXR 在 linux.no(更好的搜索,但经常下降)。

搜索时,请记住消息不会按字面意思出现在源代码中。它们通常由模板和参数组成。例如,第二行来自blk_update_request函数于block/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 ),而 则替换为 返回的整数。给定消息所在的文件,它涉及块设备。磁盘名称告诉您哪个设备:。如果你看一下?%llublk_rq_pos(req)sr0标准设备名称,这就是“第一个 SCSI CD-ROM”(实际上,第一个使用类似 SCSI 协议的光驱,包括大多数 IDE/SATA 和 USB 驱动器)。

您可以继续探索这些消息,但这里有一个明显的模式:它们都与sr.所有这些都是由同一问题引起的:读取 DVD 时发生错误,扇区 2035860 左右(即大约 1 GB,一个扇区为 512 字节)。计算机突然被告知不存在磁盘(或无法读取的磁盘),并尝试移动到另一个扇区并读取该扇区也失败了。

这可能是一粒灰尘,或者是划伤或损坏的驱动器。其他问题可能会导致读取错误,例如驱动器损坏或电缆损坏,但这些问题会一直影响读取,而不仅仅是特定磁盘的特定区域。

答案2

您显示的日志表明读取sr0磁盘设备(可能是 CD 或 DVD)的设备时出现 I/O 错误。

通过检查该问题是否在使用其他磁盘时发生以及该磁盘在另一台计算机上是否工作,使用有条理的方法来查明其原因。

它可能是由任何因素引起的,从最有可能被划伤的 CD 到有缺陷的主板。

没有简单的方法可以dmesg准确地了解每个条目所指的内容,但是阅读实际的错误消息(和周围的行)应该可以很好地指示问题所在。

相关内容