次の方法で共有


複数の差分ディスクがあるチェックポイントをマージする方法

適用対象: Windows Server 2022、Windows Server 2019、Windows Server 2016

はじめに

この記事では、Hyper-V が多数の差分ディスクを生成した場合に、チェックポイントを仮想マシン (VM) にマージするために使用できる方法について説明します。 使用する方法は、状況の詳細によって異なります。

Hyper-V マネージャーで表示できるチェックポイントのマージ

Hyper-V マネージャーで表示できるチェックポイントは、最も簡単に処理できます。 通常、コンテキスト メニューの Delete Checkpoint コマンドを使用して、これらのチェックポイントを削除できます。

コンテキスト メニューに [チェックポイントの削除] コマンドが含まれている Hyper-V マネージャーのチェックポイントのスクリーンショット。

場合によっては、 チェックポイントの削除チェックポイント サブツリーの削除 がコンテキスト メニューに表示されない場合があります。 これは、サードパーティのバックアップ ソフトウェアがチェックポイントを生成するが、バックアップ操作後にチェックポイントを削除しない場合に発生する可能性があります。

このような場合でも、Delete キーを使用してチェックポイントを削除できます。

まとめると、Hyper-V マネージャーでチェックポイントを削除する (差分ディスク ファイルをマージする) には、次の手順に従います。

  1. Hyper-V マネージャーで仮想マシンを選びます。
  2. Checkpoints一覧で、削除するチェックポイントを右クリックし、次のいずれかの操作を実行します。
    • [チェックポイントの削除 を選択
    • Delete Checkpointを使用できない場合は、チェックポイントを選択し、Del を選択します。

Hyper-V マネージャーで表示できないチェックポイントのマージ

Hyper-V マネージャーで特定の VM のチェックポイントが表示されない場合があります。 同時に、対応するファイル システム フォルダーには、多くの差分ディスク ファイルが表示されます。 これは、サードパーティのバックアップ ソフトウェアがチェックポイントを生成するが、バックアップ操作後にチェックポイントを削除しない場合に発生する可能性があります。

VM をシャットダウンできるかどうかに応じて、差分ディスク ファイルを 2 つの方法のいずれかでマージできます。

VM をシャットダウンできるタイミング

差分ディスク ファイルをマージするには、VM をシャットダウンします。 通常、差分ディスク ファイルは、VM シャットダウン プロセスの一部としてマージされます。

VM をシャットダウンできない場合

差分ディスクをオンライン VM にマージできます。 ただし、これは Windows PowerShell スクリプトを含むマルチステップ プロセスです。 これを行うには、次の一般的な手順に従います。

  1. 差分ディスク ファイル (VHD ファイル) をすべてバックアップします。
  2. Get-VHDChain関数を作成して実行します。 この手順については、このセクションの後半で詳しく説明します。
  3. マージ コマンドを作成して実行します。 この手順については、このセクションの後半で詳しく説明します。
  4. マージされた親 VHD を指す VM 設定を変更します。
  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++
                }
            }
        }
    }
    ==================================
    

    このスクリプトでは、VHD チェーン (VM の差分ディスクのセット) を識別する Get-VHDChain 関数を定義します。

  3. 次のコマンドを実行します。

    Get-vhdchain -name <virtual machine name>
    

    Note

    このコマンドでは、仮想マシン名<>は仮想マシンの名前を表します。

    スクリプトを実行すると、次のような出力が表示されます。

    Get-VHDChain スクリプトの出力のスクリーンショット。

  4. Get-VHDChainがエラーなしで実行されていることを確認します。

    重要

    Get-VHDChain出力にエラーが含まれている場合は、影響を受ける差分ディスクをフォルダーから削除する必要があります。 次の例では、Disk 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 を開きます。 このファイルには、ペアにグループ化されたコマンド ライン コマンドの一覧が含まれています。 コマンドの各ペアは、1 つの差分ディスクのマージ操作を定義します。

  3. 最初のペアの最初のコマンドをコピーし、コマンド プロンプトに貼り付けて実行します。 次に、最初のペアの 2 番目のコマンドに対して同じ操作を行います。 これらの操作により、コマンドがアドレス指定する差分ディスクがマージされます。

  4. ディスクがマージされたら、一覧の次の差分ディスクに対して上記の手順を繰り返します。 merge.txt ファイルがアドレス指定するすべての差分ディスクに対して続行します。