虚拟机查看UUID命令并不通用,Linux虚拟机用dmidecode -s system-uuid,Windows虚拟机用wmic csproduct get uuid或PowerShell,而KVM、Hyper-V、ESXi在宿主机层面各有专属命令。 很多朋友在网上搜到一条命令,跑到另一套环境里发现根本不好使,原因就在这你查的“UUID”在不同的虚拟化平台里可能指的不是同一个东西。
Linux虚拟机查看UUID命令是什么
在Linux发行版里,查看虚拟机UUID最直接的方式是读取SMBIOS中的系统UUID,常用的命令有三个:
sudo dmidecode -s system-uuid:输出一行形如4c4c4544-0033-4d10-8052-b4c04f4f5332的字符串,这就是当前虚拟机的UUID。cat /sys/class/dmi/id/product_uuid:不需要安装dmidecode,直接读sysfs文件,效果相同。sudo dmidecode -t system | grep UUID:输出更详细的信息,但核心值一样。
实际操作时,/sys/class/dmi/id/product_uuid在部分发行版上对普通用户可读,但有些内核版本限制为root只读,遇到权限不足,执行sudo cat /sys/class/dmi/id/product_uuid即可。
为什么Linux里命令这么多,优先选哪个
优先用cat /sys/class/dmi/id/product_uuid,因为它不依赖额外软件包,也不需要解析命令行输出。 如果系统里没有这个路径,比如精简容器或WSL环境,再改用dmidecode。
dmidecode在不少云端虚拟机里默认没装,可以用sudo apt install dmidecode或sudo yum install dmidecode装上,CentOS/RHEL系一般自带,如果在容器里执行命令,得到的很可能是宿主机的UUID,而不是容器自己的,因为容器没有独立的固件表。
Windows虚拟机UUID怎么查
Windows虚拟机内部查看UUID,和物理机一样,读取的是系统固件信息,最常用的两种方法:

- CMD窗口执行
wmic csproduct get uuid,回车后直接显示一个UUID。 - PowerShell执行
(Get-CimInstance Win32_ComputerSystemProduct).UUID,输出同样的值。
如果你的Windows版本较老,Get-CimInstance不可用,可以用(Get-WmiObject Win32_ComputerSystemProduct).UUID,CIM是WMI的新版接口,Win10/Server 2012以上都支持,而wmic命令在较新的Windows 11和Server 2026中已经被默认移除,所以长期使用,PowerShell方式更可靠。
Windows虚拟机UUID怎么查时需要注意什么
第一,别把wmic csproduct get uuid的输出结果和硬盘序列号搞混,它取的是系统固件UUID,不是硬盘GUID,第二,如果PowerShell返回FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF,意味着当前环境没有有效的SMBIOS UUID,常见于部分超融合平台的虚拟机,或者启动方式特殊的老机器。
虚拟机UUID命令不同系统通用吗
直接回答:不通用,UUID本身是标准格式,但Linux通过SMBIOS暴露,Windows通过WMI/CIM暴露,访问路径完全不同,同一个虚拟机里,Linux和Windows看到的UUID值通常一致,因为SMBIOS表是虚拟硬件的一部分,不过命令本身没法跨系统用。
从宿主机层面看,各虚拟化平台维护着另一套标识:
| 平台 | 查看命令 | 说明 |
|---|---|---|
| KVM/libvirt | virsh dumpxml <虚拟机名> |
XML文件里的<uuid>字段 |
| VMware ESXi | vim-cmd vmsvc/getallvms |
结果中直接有一列UUID |
| Hyper-V | PowerShell (Get-VM -Name <名称>).Id
|
返回GUID格式,但不能和客户机内部UUID画等号 |
宿主机查到的UUID和虚拟机内部看到的UUID,在KVM和ESXi里不是同一个东西。KVM的<uuid>是libvirt对虚拟机的唯一标识,客户机看到的UUID是BIOS SMBIOS里的值。 只有两者被配置成相同时,你才会看到完全一样的字符串,VMware也一样,ESXi的getallvms列出的UUID是BIOS UUID,和客户机内部dmidecode看到的值一致;但VMware的moRef ID又不同。
行业共识认为,迁移虚拟机时若希望客户机系统授权不失效,应尽量保持SMBIOS UUID不变,比如VMware克隆虚拟机时,如果选择“复制”而非“移动”,有时会生成新UUID,导致Windows激活或部分软件绑定失效。
从宿主机查看虚拟机UUID:以ESXi为例
如果你想在ESXi主机上查某个虚拟机的UUID,操作比较稳定:
- 先执行
vim-cmd vmsvc/getallvms,记下虚拟机的Vmid和右侧的UUID。 - 如果需要更完整的配置信息,执行
vim-cmd vmsvc/get.config <Vmid>,里面也有uuid字段。
这个命令属于vim-cmd服务,SSH登录ESXi后就能直接运行,不需要装额外工具,这里展示的UUID是BIOS UUID,和生产环境里客户机看到的一致,要修改的话,可以通过虚拟机配置文件里的uuid参数控制,但生产环境不建议乱改。
运维脚本里怎么顺手抓UUID
日常运维中,写脚本批量读取UUID很常见,比如给虚拟机做硬件指纹采集,或者把UUID作为机器唯一标识写进监控系统,这里给两个可直接套用的片段:
- Linux下拿去重后的值:
sudo cat /sys/class/dmi/id/product_uuid | tr -d 'n' - Windows PowerShell输出到文件:

(Get-CimInstance Win32_ComputerSystemProduct).UUID | Out-File C:uuid.txt
还有一点容易被忽略:如果虚拟机所在宿主机本身是虚拟机(嵌套虚拟化),查出的UUID来自最内层的SMBIOS,这没问题,但如果你在普通容器里跑命令,得到的往往是宿主机的UUID,这时要准确标识容器,应该看容器ID,而不是UUID。
虚拟机查看UUID命令常见问答
问:虚拟机查看UUID命令是什么?
答:Linux虚拟机和Windows虚拟机各有不同,Linux优先用cat /sys/class/dmi/id/product_uuid,没权限就加sudo;Windows优先用PowerShell的(Get-CimInstance Win32_ComputerSystemProduct).UUID,从宿主机管理端查,KVM用virsh dumpxml,ESXi用vim-cmd vmsvc/getallvms。
问:为什么在虚拟机里看到的UUID和宿主机上查到的不一致?
答:因为客户机读的是虚拟BIOS提供的SMBIOS UUID,宿主机平台管理的是VM配置里的独立标识,在KVM中,libvirt的<uuid>和客户机SMBIOS UUID可以不同,只有创建时指定了相同值才会一致,VMware里也有类似情况,getallvms展示的UUID对应BIOS UUID,另有一个instanceUuid用于平台内部管理。
问:Windows虚拟机uuid怎么查最简单?
答:在Windows虚拟机内打开PowerShell,输入(Get-CimInstance Win32_ComputerSystemProduct).UUID,回车即得结果,系统是Windows 7或更老版本时,改用wmic csproduct get uuid。
说到底,虚拟机查看UUID命令没有一条万能路径,先确认自己的场景是虚拟机内部还是宿主机,再选对应命令,三分钟就能拿到结果,想在迁移后保持UUID稳定,记得关注虚拟化平台的克隆和复制选项,别让默认行为偷偷把你的UUID换掉。
