共用方式為


如何合併具有多個差異磁碟的檢查點

適用於: Windows Server 2022、Windows Server 2019、Windows Server 2016

簡介

本文說明當 Hyper-V 產生許多差異磁碟時,可用來將檢查點合併到虛擬機 (VM) 的方法。 您使用的方法取決於情況的詳細數據。

合併可在 Hyper-V 管理員中檢視的檢查點

您可以在 Hyper-V 管理員中檢視的檢查點是最簡單的處理點。 通常,您可以使用 操作功能表上的 [刪除檢查點 ] 命令來刪除這些檢查點。

Hyper-V 管理員中檢查點的螢幕快照,其中操作功能表包含 [刪除檢查點] 命令。

在某些情況下,[刪除檢查點] 和 [刪除檢查點子樹] 不會出現在操作功能表上。 如果第三方備份軟體產生檢查點,但在備份作業之後不會刪除它們,就可能發生此情況。

在這些情況下,您仍然可以使用Delete索引鍵來刪除檢查點。

總而言之,若要刪除 Hyper-V 管理員中的檢查點(並合併差異磁碟檔案),請遵循下列步驟:

  1. 在 Hyper-V 管理員中,選取虛擬機器。
  2. [檢查點] 列表中,以滑鼠右鍵按下您想要刪除的檢查點,然後採取下列其中一個動作:
    • 選取 [ 刪除檢查點]。
    • 如果 [刪除檢查點] 無法使用,請選取檢查點 ,然後選取 [ Del]。

合併您無法在 Hyper-V 管理員中檢視的檢查點

您可能會遇到 Hyper-V 管理員未顯示特定 VM 檢查點的情況。 同時,對應的文件系統資料夾會顯示許多差異磁碟檔案。 如果第三方備份軟體產生檢查點,但在備份作業之後不會刪除它們,就可能發生此情況。

您可以根據是否可以關閉 VM,以兩種方式之一合併差異磁碟檔案。

何時可以關閉 VM

若要合併差異磁碟檔案,請關閉 VM。 一般而言,差異磁碟檔案會合併為 VM 關機程式的一部分。

當您無法關閉 VM 時

您可以將差異磁碟合併到線上 VM。 不過,這是涉及 Windows PowerShell 腳本的多步驟程式。 若要這樣做,請遵循下列一般步驟:

  1. 備份所有差異磁碟檔案 (VHD 檔案)。
  2. 建立並執行函 Get-VHDChain。 本節稍後會詳細說明此步驟。
  3. 建立並執行合併命令。 本節稍後會詳細說明此步驟。
  4. 將 VM 設定變更為指向合併的父 VHD。
  5. 啟動 VM。 成功的啟動表示合併已順利完成。

建立並執行 Get-VHDChain 函式

  1. 在 Hyper-V 主機伺服器上,開啟系統管理 PowerShell 命令提示字元視窗。

  2. 複製下列文稿,然後將它貼到 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 的差異磁碟集)。

  3. 執行下列命令:

    Get-vhdchain -name <virtual machine name>
    

    注意

    在此命令中, <虛擬機名稱> 代表虛擬機的名稱。

    當文稿執行時,您應該會看到類似下列輸出的輸出。

    Get-VHDChain 腳本輸出的螢幕快照。

  4. 請確定執行 Get-VHDChain 時不會發生錯誤。

    重要

    Get-VHDChain如果輸出包含錯誤,您必須從資料夾移除受影響的差異磁碟。 在下列範例中,磁碟 24 產生錯誤,而且必須從差異磁碟資料夾移除。

    當腳本產生錯誤時,Get-VHDChain 腳本輸出的螢幕快照。

建立和執行合併命令

  1. 下列指示會在 C:\temp\merge.txt建立腳本,以合併磁碟。 執行下列步驟:

    1. 在本機 C: 磁碟驅動器上,建立名為 temp 的資料夾。

    2. 開啟系統管理 PowerShell 視窗,然後執行下列命令:

      $vm = Read-Host("please enter the VMname") 
      
    3. 在命令提示字元中,輸入虛擬機名稱。

    4. 複製下列腳本,然後在命令提示字元貼上它。

      $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
          }    
      }
      

      文稿應該類似下列腳本:

      將腳本貼入 PowerShell 視窗之後的螢幕快照。

  2. 開啟 C:\temp\merge.txt。 此檔案包含一份命令列命令清單,這些命令會分組成組。 每個命令組都會定義單一差異磁碟的合併作業。

  3. 複製第一組的第一個命令,將它貼到命令提示字元,然後執行它。 然後,針對第一組的第二個命令執行相同的動作。 這些作業會合併命令尋址的不同磁碟。

  4. 在磁碟合併之後,針對清單中的下一個差異磁碟重複上述步驟。 針對merge.txt檔案位址的所有差異磁碟繼續進行。