服务在启动时读取sys/devices/virtual/dmi/id/product_serial
某个位置,通常包含一些典型的十位十六进制数字(例如01212302C5
),并带有换行符。但是有时内容无法解析为字符串 - 十六进制中的字节是字符串f8 6a 32 6d 0a
,我无法弄清楚为什么以及如何发生这种情况。最后一条0a
似乎暗示它仍然应该是文本。通常发生在 CI 中,但我不确定容器化环境是否是导致此问题的原因。
如此奇怪的行为究竟是什么原因造成的呢?
服务在启动时读取sys/devices/virtual/dmi/id/product_serial
某个位置,通常包含一些典型的十位十六进制数字(例如01212302C5
),并带有换行符。但是有时内容无法解析为字符串 - 十六进制中的字节是字符串f8 6a 32 6d 0a
,我无法弄清楚为什么以及如何发生这种情况。最后一条0a
似乎暗示它仍然应该是文本。通常发生在 CI 中,但我不确定容器化环境是否是导致此问题的原因。
如此奇怪的行为究竟是什么原因造成的呢?
虽然 DMI标准规定字符串应该是可显示的字符(第 17 页),并且序列号是 64 字节长的字符串(或者是 63 字节,因为它们以某种方式搞乱了 v2.0,要求除了长度字段之外,字符串还需要以空字节终止)(并且请注意,它们还会搞乱 unicode 支持,但遗憾的是,对于这么老的标准来说,这很典型):
供应商将内容放入字段中。生活中的悲哀事实。除非您非常确定该值应该是其他值
'\xf8\x6a\x32\x6d\x0a' == 'øj2m\n'
(DMI 指定 ISO-8859-1),否则您不会遇到 Linux 问题,而是典型的固件供应商代码质量问题。如果您确实知道该字段不同,那么 DMI 通信可能存在问题。我认为 Linux DMI 实现“成熟”,也就是说,我不清楚问题是硬件、固件还是内核方面,我可能会先跟踪内核和固件之间的通信,看看我正在寻找的字符串是否出现在响应中的其他地方。