翻译自https://stackoverflow.com/questions/35883313/dmidecode-product-uuid-and-product-serial-what-is-the-difference
位于系统目录 /sys/class/dmi/id/下的product_uuid和 product_serial files有什么区别
1、它是如何生成的?
这些值是在内核代码中生成的。在内核源码目录中,使用git grep命令(带有您感兴趣的关键字)可以很容易地找到它们:
$ git grep --all-match -n -e '\bdmi\b' -e product_uuid -e product_serial
因此,product_uid和product_serial sysfs nodes在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 定义中可以看到所有的属性都访问via sys_dmi_field_show() 函数, 而该函数又调用 dmi_get_system_info(), 其从dmi_ident 队列中返回相应的元素. 该表在dmi_decode() 中被填充:
dmi_save_ident(dm, DMI_PRODUCT_SERIAL, 7);
dmi_save_uuid(dm, DMI_PRODUCT_UUID, 8);
因此product_uuid 是在dmi_save_uuid() 函数中生成的. 只需要阅读一下它的代码,便能理解.它是怎么实现的。
product_serial是在dmi_save_uuid_ident函数中生成的. 它的代码可以归结为如下::
(struct dmi_header *)(dmi_base)[7];
where dmi_base is address (remapped to virtual memory obviously) of DMI table, and 7 corresponds to DMI_PRODUCT_SERIAL constant.
为了更好的理解这个可以阅读SMBIOS specification, 特别是表格9 – 系统信息(类型1) 结构, 其中有相关命令的对应关系。
# dmidecode --type 1
2、 其中的区别是什么?
对于 product_uuid -- 查看SMBIOS specification, 章节7.2.1 System - UUID. 里面有具体的描述,并且有一个表格来解释每部分数字代表的含义,. 使用该表可以解码UUID并从中提取一些信息,例如时间戳等。
对于 product_serial -- 我相信这个是不用解释的, 它仅仅是你设备的一个序列号. 你通常可以在电脑的贴纸上找到该信息。 例如,我的笔记本电脑就在底部。它与我在/sys/class/dmi/id/product\u serial中看到的字符串相同。
3、我也可以修改这个文件值么?
实际上该文件并不是真正的文件,只是内核函数的接口。详细信息,可以参阅sysfs。因此,为了“更改”那些文件,您需要相应的编辑提到的内核文件,然后重建整个内核并引导它(而不是您的发行版提供的文件)。
此外,正如@christovu Brugier在评论中提到的,您可以在DMI表中更改这些值(尽管方式有些棘手)。但是我并不推荐修改这些值。这些值肯定有一定的意义,在某些情况下可能有用(可以对于你来说没有意义,但是对于你电脑中的某些软件来说是有意义的)。
4、重新安装操作系统后该值是否被保存的?
这些值实际上是从DMI表中获得的,DMI表与BIOS一起硬编码到存储器中(主板上带有BIOS的flash芯片),你仅仅通过使用内核函数从DMI表中读取这些值而已,通过访问这些文件。