在Linux中,是否有一种UUID类型的值可以唯一标识虚拟机实例?

3
我有一个在Linux上运行的应用程序。每个应用程序都会尝试从操作系统获取UUID并报告给集中式服务器。我想确保所有实例都使用全局唯一的UUID。
如果Linux是裸机安装,可以直接读取UUID(例如从dmidecode命令中)。但如果它在虚拟机上运行,UUID(来自dmidecode)可能相等,因为虚拟机可以被复制或移动。
有什么想法吗?
顺便说一下,对于在物理硬件上运行的Linux(而不是在虚拟机上),如果用户更改内存、网卡等,UUID会改变吗?
提前致谢。
4个回答

2
如果您的UUID不需要与特定的操作系统安装绑定,只需使用 uuid_generate 生成一个适用于您的特定应用程序的UUID即可。根据您目前所写的内容,这似乎是您用例的很好解决方案。

感谢约翰提供的想法。很抱歉我没有清楚地说明需要什么。这里是 UUID 预期的使用情况。 -- 当其他人拿到我的应用程序并在他的电脑上尝试时 这里需要的是系统生成的 UUID。更具体地说,应用程序将使用它来唯一标识该用户。 - pktCoder
抱歉,格式对我来说很难处理。按下“Enter”将导致消息被提交。这是它的内容。感谢约翰提供的想法。抱歉我没有清楚地说明需要什么。以下是UUID的预期用途。 1)当用户获取我的应用程序并在他的PC上尝试时,此应用程序将提取UUID并要求他注册 2)当用户注册UUID并获得哈希后,他将使用哈希运行应用程序,然后应用程序将运行。UUID的目标是防止用户只进行一次注册并在多台PC(Linux)上运行应用程序。 - pktCoder

2
如果Linux安装在裸机上,它可以直接读取UUID(例如通过dmidecode命令)。但如果它是在虚拟机上运行,则UUID(来自dmidecode)可能相同,因为虚拟机可以被复制或移动。
然而,VMware产品实际上并非如此。BIOS UUID(由dmidecode返回的UUID)被用作ESX主机和vCenter的库存UUID属性,并且不允许复制UUID在同一系统中。这意味着每个vCenter或每个主机只能有一个具有该UUID的机器。我过去成功地将此UUID用作标识符。
要多次运行程序,必须在单独的主机上的虚拟机中安装它,或者在完全不同的vCenter中安装它。这需要大量资源来运行多个程序,我认为这已经超出了许可证执行的收益递减。
Workstation使用与ESX/vCenter相同的数据布局,因此我预计它也具有相同的限制。

非常感谢您提供的信息,Evan。但愿我能收到通知电子邮件。使用UUID的目的是防止用户在获取程序许可证(在虚拟机中)后将VM复制到不同的硬件上运行的情况。您是说Vmware中间件将基于实际硬件生成UUID,并且总是会生成不同的UUID吗?再次感谢。 - pktCoder
VMware在特定范围内生成UUID,但它并不依赖于硬件。实际上,用户可以通过.vmx文件或API更改UUID。在单个VMware产品中不允许存在相同的UUID - 在vCenter的情况下,这可能涵盖了他们整个虚拟基础架构。在这种情况下,vCenter将为您执行唯一的UUID强制执行,您不必担心。如果他们不使用vCenter,则可以将VM复制到不同的主机硬件上,这样也可以工作。这似乎是一个绕过许可证的长途跋涉,而该许可证可能比服务器便宜。 - Evan Powell

2

Linux

root@vmtest:~#dmidecode | grep -i uuid | awk '{print $2}' | tr '[:upper:]' '[:lower:]'

564d7abb-2403-eb3b-2fde-81cd440fc49b

在Esxi中

cat vmtest.vmx
...
uuid.bios = "56 4d 7a bb 24 03 eb 3b-2f de 81 cd 44 0f c4 9b"
...

SNMP Esxi

iso.3.6.1.4.1.6876.2.1.1.10.<vmID> = = STRING: "564d7abb-2403-eb3b-2fde-81cd440fc49b"

请注意,dmidecode需要管理员权限 - pynexj

0

VMware UUID也可以通过以下方式找到:

$ sudo cat /sys/class/dmi/id/product_serial /sys/class/dmi/id/product_uuid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接