使用 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(管理員) 執行命令即可查詢到
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 文件執行
#這裏假設虛擬機的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 的次數都變少了,關鍵詞一開始沒有找準走了一點彎路,找資料的過程發現挺多人遇到這個問題,遂再次記錄。

參考文檔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章