使用 Power Shell 修改 Hyper-V 虚拟机 UUID 的解决方案

前言

在研究了一下午 k8s 文档的时候,正准备开干,万万没想到一个 uuid 的问题卡了我几个小时,一直想在系统中解决,没想到最后在外部使用PowerSheel解决了,分享记录一二

问题描述与尝试解决

需要确保每个节点上 MAC 地址和 product_uuid 的唯一性

可以使用命令 ip linkifconfig -a 来获取网络接口的 MAC 地址

可以使用 sudo cat /sys/class/dmi/id/product_uuid命令对 product_uuid 校验

  • 检查 mac 地址,因为之前就修改过IP,在Hyper-V管理器中就可以看到是不一样
  • 接着检查 product_uuid,使用了之前安装的jumpserver批量执行了下,好家伙,都一样
  • 于是问了 ChatGPT 后开始修改
  • 然后,好家伙,无权限
  • 然后,就结合 GPT 和搜索找寻答案,尝试了 禁用 SELinux,修改文件权限,修改 GRUB 配置,未果
  • 终于,皇天不负有心人,在我不停迭代搜索词后,还是让我找到了一篇看得懂行得通的博客 PowerShell修改Hyper-V虚拟机的UUID
  • 尝试了文章引用的国外大佬的工具,发现已经无法运行,好在博主提供了一个可以直接使用的脚本
  • 下面结合个人实践来做一些补充说明

使用 PowerShell 查询虚拟机UUID

  • 系统:win10
  • HyperV版本:10.0.19041
  • 虚拟机名称:devops01
  • 通过查询验证可行性,修改名称为自己的虚拟机名,使用 PowerSheel(管理员) 执行命令即可查询到
ps 复制代码
Get-VM "devops04" | % { (gwmi -Namespace root\virtualization\v2 -Class msvm_computersystem -Filter ('ElementName="{0}"' -f $_.Name)).GetRelated('msvm_virtualsystemsettingdata') | select BIOSGUID }
  • 检查点会影响查询结果,所以优化了一下,可以使用这个来查询

    (Get-WmiObject -Namespace root\virtualization\v2 -Class Msvm_VirtualSystemSettingData -Filter "ElementName='devops04'").BIOSGUID

关闭虚拟机!

重要,尝试了两次,确认需要在虚拟机关闭的时候执行才有用

执行命令

  • 修改虚拟机名称变量:devops04 为你的虚拟机名称
  • 然后直接粘贴下面命令到 PowerShell 终端执行即可
  • 也可以存为.ps1 文件执行
ps 复制代码
#这里假设虚拟机的VMname是devops01,自行替换即可
$VMname="devops04"
$vmx = Get-WmiObject -Namespace root\virtualization\v2 -Class msvm_virtualsystemsettingdata 
#每次操作选择一台虚拟机
$CurrentSettingsData = $vmx | Where-Object { $_.ElementName -eq $VMname }
#检查一下老的GUID
$CurrentSettingsData.BIOSGUID
#生成新GUID
$GUID = [System.Guid]::NewGuid()
#重新写入GUID,注意要带{},这是非常重要的细节
$CurrentSettingsData.BIOSGUID = "{" + $GUID.Guid.ToUpper() + "}" 
#生成一个ModifySystemSettings的空对象
$VMMS = Get-WmiObject -Namespace root\virtualization\v2 -Class msvm_virtualsystemmanagementservice
$ModifySystemSettingsParams = $VMMS.GetMethodParameters('ModifySystemSettings')
#配置这个属性,需要特殊的转换方式
$ModifySystemSettingsParams.SystemSettings = $CurrentSettingsData.GetText([System.Management.TextFormat]::CimDtd20)
#写入
$VMMS.InvokeMethod('ModifySystemSettings', $ModifySystemSettingsParams, $null)
  • 执行成功,再次查询uuid也已经更新
  • 开机启动使用命令查询Linux发现已经变更,因为UUID的表示形式是不区分大小写的,因此大小写字母的顺序不会影响其唯一性。所以看到一个大写,一个小写其实没关系

    将所有虚拟机执行完一遍后,检查可以看到已经成功修改

结语

习惯了 ChatGPT 的便捷,发现 Google 的次数都变少了,关键词一开始没有找准走了一点弯路,找资料的过程发现挺多人遇到这个问题,遂再次记录。

参考文档

相关推荐
热爱运维的小七1 天前
告别内存溢出:ActiveMQ 性能诊断与全流程优化
数据库·it运维·activemq·devops
云达闲人2 天前
搭建DevOps企业级仿真实验环境:007Proxmox 虚拟机模板制作
devops·proxmox ve·虚拟化运维·虚拟机模板制作·pve 模板·企业级仿真实验环境·虚拟机克隆
云达闲人2 天前
搭建DevOps企业级仿真实验环境:006Proxmox 基础环境验证
运维·devops·proxmox ve·sre·仿真实验环境·快照与克隆·运维实操教程
行者-全栈开发3 天前
Linux 核弹级高危漏洞 CVE-2026-31431 完整修复指南
linux·运维·服务器·ci/cd·devops·cve·核弹级高危漏洞
AC赳赳老秦4 天前
项目闭环管理:用 OpenClaw 对接 Jira / 禅道,实现需求 - 任务 - 进度 - 验收全流程自动化
运维·人工智能·python·自动化·devops·jira·openclaw
Misnice4 天前
DevOps 介绍
运维·devops
炸裂狸花猫5 天前
开源身份认证与访问管理平台 - Keycloak(一)
docker·云原生·kubernetes·开源·devops
云达闲人5 天前
搭建DevOps企业级仿真实验环境:005Proxmox Web 界面操作入门
运维·devops·proxmox ve·web界面·虚拟机创建
云达闲人5 天前
搭建DevOps企业级仿真实验环境:004Proxmox 内核调优与虚拟化优化
linux·服务器·devops·硬件加速·linux内核调优·虚拟化优化·内存气球
ezreal_pan5 天前
Kafka Docker 部署持久化避坑指南:解决重启后 Cluster ID 不匹配问题
分布式·docker·zookeeper·容器·kafka·devops