前言
在研究了一下午 k8s 文檔的時候,正準備開幹,萬萬沒想到一個 uuid 的問題卡了我幾個小時,一直想在系統中解決,沒想到最後在外部使用PowerSheel解決了,分享記錄一二
問題描述與嘗試解決
- 根據官方文檔 使用 kubeadm 創建 k8s 集羣的準備,所以準備在之前文章中使用 Hyper-V 安裝的 CentOS8.5 的虛擬機搭建
需要確保每個節點上 MAC 地址和 product_uuid 的唯一性
可以使用命令ip link
或ifconfig -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 的次數都變少了,關鍵詞一開始沒有找準走了一點彎路,找資料的過程發現挺多人遇到這個問題,遂再次記錄。