DMIDecode product_uuid和product_serial.what有什么区别?

Ale*_*kov 2 linux linux-kernel

dir中有文件product_uuidproduct_serial文件/sys/class/dmi/id/.

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

Sam*_*nko 7

它是如何生成的?

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

$ git grep --all-match -n -e '\bdmi\b' -e product_uuid -e product_serial
Run Code Online (Sandbox Code Playgroud)

因此,product_uuidproduct_serial在创建的sysfs节点的驱动/固件/ 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);
Run Code Online (Sandbox Code Playgroud)

根据DEFINE_DMI_ATTR_WITH_SHOW定义,您可以看到两个属性都是通过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);
Run Code Online (Sandbox Code Playgroud)

因此product_uuiddmi_save_uuid()函数中生成.只需阅读其代码即可了解它是如何完成的.

product_serialdmi_save_ident()函数中生成.归结为代码如下:

(struct dmi_header *)(dmi_base)[7];
Run Code Online (Sandbox Code Playgroud)

其中dmi_base是DMI表的地址(显然重新映射到虚拟内存),并且7对应于DMI_PRODUCT_SERIAL常量.

为了更好地理解这一点,请参阅SMBIOS规范,具体来说Table 9 – System Information (Type 1) Structure,它对应于此命令:

# dmidecode --type 1
Run Code Online (Sandbox Code Playgroud)

有什么不同?

至于product_uuid- 看看SMBIOS规范,部分7.2.1 System - UUID.它有描述,也有这个数字的每个部分的解释表.使用该表,您可以解码您的UUID并从中提取一些信息,如时间戳等.

至于product_serial- 我相信这是不言自明的,它只是您设备的序列号.您通常可以在计算机上的贴纸上找到它.例如,对于我的笔记本电脑,它位于底部.它与我看到的字符串相同/sys/class/dmi/id/product_serial.

我可以更改这些文件吗?

这些文件实际上不是真正的文件,而只是内核函数的接口.阅读有关sysfs的详细信息.因此,为了"更改"这些文件,您需要相应地编辑所提到的内核文件,然后重建整个内核并启动它(而不是您的发行版提供的内核).

另外,正如@ChristopheVu-Brugier在评论中提到的那样,您可以在DMI表中更改这些值(虽然有些棘手).但我不推荐它.这些值肯定有一定的含义,在某些情况下可能有用(如果不适合你,那么对于PC中的某些软件).

重新安装操作系统后会保存一个值吗?

这些值实际上是从DMI表获得的,DMI表与BIOS一起硬编码到永久存储器(主板上带有BIOS的闪存芯片),你只需通过读取这些文件就可以使用内核函数从这个DMI表中读取这些值.

  • Linux内核中的DMI驱动程序只允许读取值.有一些驱动程序,如https://github.com/cmatsuoka/amibios_dmi,允许更改值.但这项行动有风险. (2认同)