Condividi tramite


Come unire checkpoint con più dischi differenze

Si applica a: Windows Server 2022, Windows Server 2019, Windows Server 2016

Introduzione

Questo articolo descrive i metodi che è possibile usare per unire i checkpoint in una macchina virtuale (VM) se Hyper-V ha generato molti dischi diversi. Il metodo utilizzato dipende dai dettagli della situazione.

Unione di checkpoint che è possibile visualizzare nella console di gestione di Hyper-V

I checkpoint che è possibile visualizzare nella console di gestione di Hyper-V sono i più semplici da gestire. In genere, è possibile usare il comando Elimina checkpoint nel menu di scelta rapida per eliminare questi checkpoint.

Screenshot di un checkpoint nella console di gestione di Hyper-V in cui il menu di scelta rapida include il comando Elimina checkpoint.

In alcuni casi, Elimina checkpoint ed Elimina sottoalbero checkpoint non vengono visualizzati nel menu di scelta rapida. Ciò può verificarsi se il software di backup di terze parti genera checkpoint, ma non li elimina dopo un'operazione di backup.

In questi casi, è comunque possibile usare la chiave Delete per eliminare il checkpoint.

In sintesi, per eliminare i checkpoint nella console di gestione di Hyper-V (e unire i file del disco differenze), seguire questa procedura:

  1. Nella console di gestione di Hyper-V selezionare la macchina virtuale.
  2. Nell'elenco Checkpoint fare clic con il pulsante destro del mouse sul checkpoint da eliminare e quindi eseguire una delle azioni seguenti:
    • Selezionare Elimina checkpoint.
    • Se Elimina checkpoint non è disponibile, selezionare il checkpoint e quindi selezionare Canc.

Unione di checkpoint che non è possibile visualizzare nella console di gestione di Hyper-V

Potrebbe verificarsi una situazione in cui la console di gestione di Hyper-V non mostra checkpoint per una macchina virtuale specifica. Allo stesso tempo, la cartella del file system corrispondente mostra molti file di disco diversi. Ciò può verificarsi se il software di backup di terze parti genera checkpoint, ma non li elimina dopo un'operazione di backup.

È possibile unire i file del disco differenze in uno dei due modi, a seconda che sia possibile arrestare la macchina virtuale.

Quando è possibile arrestare la macchina virtuale

Per unire i file disco diversi, arrestare la macchina virtuale. In genere, i file del disco differenze si uniscono come parte del processo di arresto della macchina virtuale.

Quando non è possibile arrestare la macchina virtuale

È possibile unire dischi diversi in una macchina virtuale online. Tuttavia, si tratta di un processo in più passaggi che prevede script di Windows PowerShell. A tale scopo, seguire questa procedura generale:

  1. Eseguire il backup di tutti i file disco diversi (file VHD).
  2. Creare ed eseguire la Get-VHDChain funzione . Questo passaggio viene descritto in dettaglio più avanti in questa sezione.
  3. Creare ed eseguire comandi di merge. Questo passaggio viene descritto in dettaglio più avanti in questa sezione.
  4. Modificare le impostazioni della macchina virtuale in modo che punti al disco rigido virtuale padre unito.
  5. Avviare la VM. Un avvio riuscito indica che l'unione è stata completata correttamente.

Creare ed eseguire la funzione Get-VHDChain

  1. Nel server host Hyper-V aprire una finestra del prompt dei comandi di PowerShell amministrativa.

  2. Copiare lo script seguente e incollarlo nella finestra di 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++
                }
            }
        }
    }
    ==================================
    

    Questo script definisce una Get-VHDChain funzione che identifica la catena VHD (il set di dischi differenze per la macchina virtuale).

  3. Eseguire il comando riportato di seguito:

    Get-vhdchain -name <virtual machine name>
    

    Nota

    In questo comando il <nome> della macchina virtuale rappresenta il nome della macchina virtuale.

    Quando viene eseguito lo script, dovrebbe essere visualizzato un output simile all'output seguente.

    Screenshot dell'output dello script Get-VHDChain.

  4. Assicurarsi che Get-VHDChain venga eseguito senza errori.

    Importante

    Se l'output Get-VHDChain contiene errori, è necessario rimuovere i dischi che differiscono interessati dalla cartella. Nell'esempio seguente, Disk 24 ha generato un errore e deve essere rimosso dalla cartella disco differenze.

    Screenshot dell'output dello script Get-VHDChain quando lo script genera un errore.

Creare ed eseguire comandi di merge

  1. Le istruzioni seguenti creano uno script in C:\temp\merge.txt per unire i dischi. Seguire questa procedura:

    1. Nell'unità C: locale creare una cartella denominata temp.

    2. Aprire una finestra di PowerShell amministrativa e quindi eseguire il comando seguente:

      $vm = Read-Host("please enter the VMname") 
      
    3. Al prompt dei comandi immettere il nome della macchina virtuale.

    4. Copiare lo script seguente e incollarlo al prompt dei comandi.

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

      Lo script dovrebbe essere simile allo script seguente:

      Screenshot dello script dopo che è incollato in una finestra di PowerShell.

  2. Aprire C:\temp\merge.txt. Questo file contiene un elenco di comandi della riga di comando raggruppati in coppie. Ogni coppia di comandi definisce le operazioni di unione per un singolo disco differenze.

  3. Copiare il primo comando della prima coppia, incollarlo al prompt dei comandi e quindi eseguirlo. Eseguire quindi la stessa operazione per il secondo comando della prima coppia. Queste operazioni uniscono il disco differenze a cui puntano i comandi.

  4. Dopo l'unione del disco, ripetere i passaggi precedenti per il disco successivo che differisce nell'elenco. Continuare per tutti i dischi differenze a cui si rivolge il file merge.txt .