DMIDecode product_uuid和product_serial。有什么区别?

dir /sys/class/dmi/id/product_uuidproduct_serial文件。

  1. 它是如何生成的? 有什么不同?
  2. 我可以更改这个文件吗?
  3. 重装操作系统后是否保存一个值?

它是如何生成的?

这些值是在内核代码中生成的。 你可以使用git grep命令(你感兴趣的关键字)在你的内核源代码目录中找到它们:

 $ git grep --all-match -n -e '\bdmi\b' -e product_uuid -e product_serial 

因此, product_uuidproduct_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表中读取这些值。