使用 Power Shell 修改 Hyper-V 虛擬機器器 UUID 的解決方案

2023-12-18 06:00:35

前言

在研究了一下午 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 的次數都變少了,關鍵詞一開始沒有找準走了一點彎路,找資料的過程發現挺多人遇到這個問題,遂再次記錄。

參考檔案