適用於: Windows Server 2022、Windows Server 2019、Windows Server 2016
簡介
本文說明當 Hyper-V 產生許多差異磁碟時,可用來將檢查點合併到虛擬機 (VM) 的方法。 您使用的方法取決於情況的詳細數據。
合併可在 Hyper-V 管理員中檢視的檢查點
您可以在 Hyper-V 管理員中檢視的檢查點是最簡單的處理點。 通常,您可以使用 操作功能表上的 [刪除檢查點 ] 命令來刪除這些檢查點。
在某些情況下,[刪除檢查點] 和 [刪除檢查點子樹] 不會出現在操作功能表上。 如果第三方備份軟體產生檢查點,但在備份作業之後不會刪除它們,就可能發生此情況。
在這些情況下,您仍然可以使用Delete索引鍵來刪除檢查點。
總而言之,若要刪除 Hyper-V 管理員中的檢查點(並合併差異磁碟檔案),請遵循下列步驟:
- 在 Hyper-V 管理員中,選取虛擬機器。
- 在 [檢查點] 列表中,以滑鼠右鍵按下您想要刪除的檢查點,然後採取下列其中一個動作:
- 選取 [ 刪除檢查點]。
- 如果 [刪除檢查點] 無法使用,請選取檢查點 ,然後選取 [ Del]。
合併您無法在 Hyper-V 管理員中檢視的檢查點
您可能會遇到 Hyper-V 管理員未顯示特定 VM 檢查點的情況。 同時,對應的文件系統資料夾會顯示許多差異磁碟檔案。 如果第三方備份軟體產生檢查點,但在備份作業之後不會刪除它們,就可能發生此情況。
您可以根據是否可以關閉 VM,以兩種方式之一合併差異磁碟檔案。
何時可以關閉 VM
若要合併差異磁碟檔案,請關閉 VM。 一般而言,差異磁碟檔案會合併為 VM 關機程式的一部分。
當您無法關閉 VM 時
您可以將差異磁碟合併到線上 VM。 不過,這是涉及 Windows PowerShell 腳本的多步驟程式。 若要這樣做,請遵循下列一般步驟:
- 備份所有差異磁碟檔案 (VHD 檔案)。
- 建立並執行函
Get-VHDChain
式。 本節稍後會詳細說明此步驟。 - 建立並執行合併命令。 本節稍後會詳細說明此步驟。
- 將 VM 設定變更為指向合併的父 VHD。
- 啟動 VM。 成功的啟動表示合併已順利完成。
建立並執行 Get-VHDChain 函式
在 Hyper-V 主機伺服器上,開啟系統管理 PowerShell 命令提示字元視窗。
複製下列文稿,然後將它貼到 PowerShell 視窗中:
function Get-VHDChain { [CmdletBinding()] param( [string]$ComputerName = $env:COMPUTERNAME, [string[]]$Name = '*' ) try { $VMs = Get-VM -ComputerName $ComputerName -Name $Name -ErrorAction Stop } catch { Write-Warning $_.Exception.Message } foreach ($vm in $VMs){ $VHDs = ($vm).harddrives.path foreach ($vhd in $VHDs){ Clear-Variable VHDType -ErrorAction SilentlyContinue try { $VHDInfo = $vhd | Get-VHD -ComputerName $ComputerName -ErrorAction Stop } catch { $VHDType = 'Error' $VHDPath = $vhd Write-Verbose $_.Exception.Message } $i = 1 $problem = $false while (($VHDInfo.parentpath -or $i -eq 1) -and (-not($problem))){ If ($VHDType -ne 'Error' -and $i -gt 1){ try { $VHDInfo = $VHDInfo.ParentPath | Get-VHD -ComputerName $ComputerName -ErrorAction Stop } catch { $VHDType = 'Error' $VHDPath = $VHDInfo.parentpath Write-Verbose $_.Exception.Message } } if ($VHDType -ne 'Error'){ $VHDType = $VHDInfo.VhdType $VHDPath = $VHDInfo.path } else { $problem = $true } [pscustomobject]@{ Name = $vm.name VHDNumber = $i VHDType = $VHDType VHD = $VHDPath } $i++ } } } } ==================================
此腳本會定義可
Get-VHDChain
識別 VHD 鏈結的函式(VM 的差異磁碟集)。執行下列命令:
Get-vhdchain -name <virtual machine name>
注意
在此命令中, <虛擬機名稱> 代表虛擬機的名稱。
當文稿執行時,您應該會看到類似下列輸出的輸出。
請確定執行
Get-VHDChain
時不會發生錯誤。重要
Get-VHDChain
如果輸出包含錯誤,您必須從資料夾移除受影響的差異磁碟。 在下列範例中,磁碟 24 產生錯誤,而且必須從差異磁碟資料夾移除。
建立和執行合併命令
下列指示會在 C:\temp\merge.txt 中建立腳本,以合併磁碟。 執行下列步驟:
在本機 C: 磁碟驅動器上,建立名為 temp 的資料夾。
開啟系統管理 PowerShell 視窗,然後執行下列命令:
$vm = Read-Host("please enter the VMname")
在命令提示字元中,輸入虛擬機名稱。
複製下列腳本,然後在命令提示字元貼上它。
$vhds=Get-VM $vm | Select-Object -Property VMId | Get-VHD if (Test-Path '.\merge.txt'){Remove-Item -Path '.\merge.txt'} foreach($vhd in $vhds){ $chain=[ordered]@{} while ($vhd.ParentPath){ $chain.add($vhd.Path,$vhd.ParentPath) $vhd=Get-VHD -Path $vhd.ParentPath } $chain.GetEnumerator() | ForEach-Object { $line='Merge-VHD -Path "{0}" -Destination "{1}"' -f $_.key, $_.value $line | Out-File -FilePath .\merge.txt -Append } }
文稿應該類似下列腳本:
開啟 C:\temp\merge.txt。 此檔案包含一份命令列命令清單,這些命令會分組成組。 每個命令組都會定義單一差異磁碟的合併作業。
複製第一組的第一個命令,將它貼到命令提示字元,然後執行它。 然後,針對第一組的第二個命令執行相同的動作。 這些作業會合併命令尋址的不同磁碟。
在磁碟合併之後,針對清單中的下一個差異磁碟重複上述步驟。 針對merge.txt檔案位址的所有差異磁碟繼續進行。