查找虚拟机UUID最快的办法,就是根据虚拟化平台选用对应命令,例如Linux里执行dmidecode -s system-uuid,Windows里用wmic csproduct get uuid,几秒钟就能拿到结果。
为什么你需要快速拿到虚拟机UUID?
UUID是虚拟机在虚拟化环境里的“身份证号”,全局唯一,不管是做资产登记、自动化运维脚本,还是排查License授权问题,没有UUID很多操作都卡住,手动翻图形界面点来点去太慢,尤其当你有几十台虚拟机要处理时,命令行才是效率王道,下面我把不同场景下的查询命令拆开讲,你照着复制粘贴就能用。
Linux查询虚拟机UUID的实用命令有哪些?
Linux虚拟机里查UUID,命令选择不少,但得注意你用的是物理机还是虚拟机,以及有没有安装dmidecode工具。
首选命令:dmidecode
这是最通用、最直接的方式,在终端输入:
sudo dmidecode -s system-uuid
输出就是一组形如4c4c4544-0034-3910-8056-c4c04f584433的字符串。这个值来自主板BIOS/EFI,虚拟化平台(KVM、Xen、Hyper-V)一般都会映射到这里,所以准确率最高,如果提示dmidecode: command not found,说明没装,Debian/Ubuntu用apt install dmidecode,CentOS/RHEL用yum install dmidecode装上再执行。
备用命令:cat /sys/class/dmi/id/product_uuid
有些精简系统不想装额外软件,可以直接读sysfs:
cat /sys/class/dmi/id/product_uuid
不需要sudo权限,输出效果和dmidecode一样,不过极少数老内核或容器环境下这个文件可能不存在,那就回去用dmidecode。
注意虚拟机与物理机的区别
如果是在KVM虚拟机里运行,system-uuid通常就是虚拟机的UUID,但如果你在Docker容器里执行,读到的会是宿主机ID,不是虚拟机UUID,别搞混,某些云服务器(比如按小时计费的临时实例)可能只暴露实例ID,不让你读底层UUID,此时应该查云平台提供的metadata服务,而不是本地命令。
批量查询多台Linux虚拟机的UUID
运维场景下你可能有几十台机器,一台台登录太累,可以用SSH循环批量抓取,
for ip in 192.168.1.10 192.168.1.11; do ssh $ip "sudo dmidecode -s system-uuid"; done
前提是配置了免密登录,如果你想同时拿到IP和UUID,改成:
for ip in $(cat hosts.txt); do echo "$ip: $(ssh $ip cat /sys/class/dmi/id/product_uuid)"; done
这样输出结果一目了然,方便后续写进资产表。
Windows虚拟机唯一标识符查询的两种高效姿势
Windows虚拟机同样能用命令行查UUID,不会比Linux慢,分别用WMIC和PowerShell,看你习惯哪个。
wmic命令:老牌选手
打开CMD或PowerShell,运行:
wmic csproduct get uuid
输出只有一行UUID,干净利落,这个命令在Windows Server 2008到2019以及Win10/11上都能用,注意wmic在较新的Windows 11版本里已被弃用,但短期内依然能运行,如果你碰到“Invalid query”报错,换成下面PowerShell的方式。
PowerShell命令:现代推荐
在PowerShell里执行:
(Get-CimInstance -ClassName Win32_ComputerSystemProduct).UUID
或者用旧的CIM命令:
Get-WmiObject Win32_ComputerSystemProduct | Select-Object -ExpandProperty UUID
输出结果和wmic完全一致,PowerShell方式更稳定,也不会触发弃用警告。
远程批量获取Windows虚拟机UUID
管理域内多台Windows虚拟机时,用WinRM远程执行命令批量拿UUID,示例:
$computers = "vm01", "vm02", "vm03"
Invoke-Command -ComputerName $computers -ScriptBlock { (Get-CimInstance -ClassName Win32_ComputerSystemProduct).UUID }
前提是已开启WinRM并配置信任主机,如果机器不在域里,需要先设置Set-Item WSMan:localhostClientTrustedHosts -Value "vm01,vm02",否则会被拒绝连接。
VMware虚拟机UUID查看方法与注意事项
VMware是虚拟机中使用最广泛的平台之一,它的UUID分两种:BIOS UUID和实例UUID(instance UUID),查法也不只一条路。
在虚拟机内部查看
- Linux客户机里,同样用
dmidecode -s system-uuid,读出的就是VMware分配的BIOS UUID。 - Windows客户机里,用
wmic csproduct get uuid同理。
这个UUID在VMware的.vmx配置文件里也有一份,对应uuid.bios参数,如果你在创建虚机时没有手动指定,VMware会自动生成。
在宿主机上用命令行查所有虚拟机UUID
如果你有ESXi主机的SSH权限,可以执行:
vim-cmd vmsvc/getallvms
输出列表包含VMID、名称、文件路径和UUID。
Vmid Name File Guest OS Version Annotation
1 test-vm [datastore1] test-vm/test-vm.vmx ubuntu64Guest v7
UUID就在最后一列,类似56 4b d5 2a 3a 4b 5c 6d-7e 8f 90 12 34 56 78 9a,带空格和分隔符,使用时要去掉空格并统一格式,另外用
vim-cmd vmsvc/get.summary <vmid>可以只看指定虚拟机的详细属性,里面也有UUID。
外部工具替代方案
不想记命令的话,可以用PowerCLI(VMware的官方PowerShell模块)在Windows管理机上批量获取:
Get-VM | Select-Object Name, Id
这里的Id就是UUID,需要先安装VMware.PowerCLI模块,连接vCenter或ESXi主机,这条命令特别适合上百台虚拟机的大规模资产盘点。
虚拟化平台与操作系统下UUID查询对照
为了让你一眼找到适合自己的方法,我把常见场景和命令整理成表格:
| 平台/系统 | 查询命令 | 输出特点 |
|---|---|---|
| Linux物理机/虚拟机 | dmidecode -s system-uuid |
需要sudo,依赖dmidecode包 |
| Linux精简系统 | cat /sys/class/dmi/id/product_uuid |
无需额外安装 |
| Windows CMD | wmic csproduct get uuid |
最老牌,可能偶发弃用提示 |
| Windows PowerShell | (Get-CimInstance Win32_ComputerSystemProduct).UUID |
推荐,无兼容问题 |
| VMware ESXi宿主机 | vim-cmd vmsvc/getallvms |
同时列出所有虚机,但需SSH权限 |
| VMware PowerCLI | Get-VM | Select Name, Id |
适合大规模批量,需提前导入模块 |
这个表格覆盖了90%以上的真实需求,遇到命令不存在的报错,先检查对应工具包是否安装,再确认权限是否足够。
命令行查UUID时遇到的常见坑
权限不足踩坑
Linux下直接跑dmidecode不带sudo,会提示“Permission denied”或“Operation not permitted”。正确姿势永远是sudo dmidecode -s system-uuid,Windows下CMD如果不以管理员身份打开,wmic通常也能运行,但遇到UAC拦截的怪异环境,建议右键“以管理员身份运行”再执行。
UUID格式不一致
同一种虚拟机,不同来源的UUID可能显示格式不同,比如VMware的vsphere客户端显示的UUID带中划线,而vmx文件里可能没有。标准化处理很简单:去掉空格、将大写字母统一转小写,再对比是否一致,如果你写程序自动比对,建议先做归一化。
容器环境误导你
Docker容器里执行dmidecode或读/sys/class/dmi/id/product_uuid,拿到的是宿主机信息,不是容器自己的。容器没有传统意义上的UUID,你需要的可能是容器ID(
cat /proc/self/cgroup里的hash串),别把两者混为一谈。
云主机无法读取
简米云、酷番云等云服务器默认隐藏底层物理机UUID,你在系统内查到的UUID可能每次重启会变,也可能全是零,这类环境应该使用云平台API获取实例唯一标识,比如简米云的instance-id,行业共识认为,云虚拟机的本地UUID只对操作系统授权有效,不能作为云资源唯一键。
命令行之外的UUID验证技巧
拿到UUID后怎么确认它确实是这台虚拟机唯一的?有个小技巧:先记录当前值,然后在宿主机上用vim-cmd vmsvc/reload <vmid>重新加载配置,再回虚拟机里查一次,如果值变了,说明UUID是可变的,不能作为持久标识符,正常虚拟机平台的UUID在生命周期内保持不变。
Linux虚拟机里还可以交叉验证:
sudo dmidecode | grep -i uuid cat /sys/class/dmi/id/product_uuid
两个输出应该一致,如果不一致,说明系统DMI表有问题,或者你开了UUID重映射功能(比如VMware的宏VM_UUID)。
Q&A:关于查询虚拟机UUID的常见疑问
怎么在Hyper-V虚拟机里查UUID?
Hyper-V虚拟机内部,Linux用dmidecode -s system-uuid,Windows用wmic csproduct get uuid都可以读到。注意Hyper-V的UUID默认是动态生成的,如果你在宿主机上复制或导入虚拟机,可能生成新的UUID,导致系统激活失效,可以在Hyper-V管理器里查看虚拟机设置中的“ID”字段,但命令行方式在客户机里更快。
远程查多台虚拟机uuid怎么最快?
对于Linux批量,写一个for循环SSH命令即可,比如for ip in $(cat list); do echo -n "$ip "; ssh $ip sudo cat /sys/class/dmi/id/product_uuid; done,对于Windows,用PowerShell的Invoke-Command并行执行,更正规的做法是用开源的自动化工具(如Ansible),但几百台以内命令行循环完全够用。
为什么云服务器查到UUID和创建时不一致?
云服务器底层是物理硬件虚拟化出来的,部分云平台为了隐私和安全,会在系统内伪造一个随机UUID,重启后可能变化。如果要用UUID做资产唯一标识,请调用云厂商的Metadata服务,比如AWS的instance-id,简米云的实例ID,本地UUID只适合用来申请微软或Oracle的软件许可,不适合做基础设施台账。
最后说回正题:无论你面对的是Linux、Windows还是VMware环境,上面这些命令足以帮你快速拿到虚拟机UUID,下次需要时,别再打开图形界面慢慢翻了,一条命令的事。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/612020.html





