dir /sys/class/dmi/id/
有product_uuid
和product_serial
文件。
它是如何生成的?
这些值是在内核代码中生成的。 你可以使用git grep
命令(你感兴趣的关键字)在你的内核源代码目录中找到它们:
$ git grep --all-match -n -e '\bdmi\b' -e product_uuid -e product_serial
因此, product_uuid
和product_serial
sysfs节点是在drivers / firmware / dmi-id.c中创建的 :
DEFINE_DMI_ATTR_WITH_SHOW(product_serial, 0400, DMI_PRODUCT_SERIAL); DEFINE_DMI_ATTR_WITH_SHOW(product_uuid, 0400, DMI_PRODUCT_UUID);
从DEFINE_DMI_ATTR_WITH_SHOW
定义中,您可以看到两个属性都是通过sys_dmi_field_show()
函数访问的, sys_dmi_field_show()
函数又调用dmi_get_system_info()
, dmi_get_system_info()
返回dmi_ident
数组中相应的元素。 该表填充在dmi_decode()
例程中:
dmi_save_ident(dm, DMI_PRODUCT_SERIAL, 7); dmi_save_uuid(dm, DMI_PRODUCT_UUID, 8);
所以在dmi_save_uuid()函数中生成product_uuid
。 只要阅读它的代码,了解它是如何完成的。
product_serial
是在dmi_save_ident()函数中生成的。 它归结为这样的代码:
(struct dmi_header *)(dmi_base)[7];
其中dmi_base
是DMI表的地址(显然重映射到虚拟内存), 7
对应于DMI_PRODUCT_SERIAL
常量。
为了更好地理解这一点,请参阅SMBIOS规范 ,具体请Table 9 – System Information (Type 1) Structure
,与此命令对应:
# dmidecode --type 1
有什么不同?
至于product_uuid
– 请看SMBIOS规范 ,第7.2.1 System - UUID
。 对这个号码的各部分有说明以及解释表格。 使用该表,您可以解码您的UUID并从中提取一些信息,如时间戳等
至于product_serial
– 我相信这是不言而喻的,它只是设备的序列号。 您通常可以在计算机上的某个标签上找到它。 例如,我的笔记本电脑在底部 。 这是我在/sys/class/dmi/id/product_serial
看到的字符串。
我可以更改这个文件吗?
这些文件实际上不是真正的文件,而只是内核函数的一个接口。 阅读关于sysfs的细节。 因此,为了“更改”这些文件,您需要相应地编辑所提到的内核文件,然后重新构建整个内核并引导它(而不是由您的发行版提供)。
另外,正如@ ChristopheVu-Brugier在评论中提到的那样,您可以在DMI表中更改这些值(尽管有些棘手)。 但我不会推荐它。 这些值肯定有一些意义,可能在某些情况下是有用的(如果不适合你,那么对于你的电脑中的一些软件)。
重装操作系统后是否保存一个值?
这些值实际上是从DMI表中获得的, DMI表是与BIOS一起硬编码到永久内存(主板上带有BIOS的闪存芯片),然后通过读取这些文件,使用内核函数从DMI表中读取这些值。