Partager via


Comment fusionner des points de contrôle qui ont plusieurs disques de différenciation

S’applique à : Windows Server 2022, Windows Server 2019, Windows Server 2016

Introduction

Cet article décrit les méthodes que vous pouvez utiliser pour fusionner des points de contrôle dans une machine virtuelle si Hyper-V a généré de nombreux disques de différenciation. La méthode que vous utilisez dépend des détails de la situation.

Fusion de points de contrôle que vous pouvez afficher dans le Gestionnaire Hyper-V

Les points de contrôle que vous pouvez afficher dans le Gestionnaire Hyper-V sont les plus simples à gérer. En règle générale, vous pouvez utiliser la commande Supprimer le point de contrôle dans le menu contextuel pour supprimer ces points de contrôle.

Capture d’écran d’un point de contrôle dans le Gestionnaire Hyper-V dans lequel le menu contextuel inclut la commande Supprimer le point de contrôle.

Dans certains cas, supprimer le point de contrôle et supprimer la sous-arborescence de point de contrôle n’apparaissent pas dans le menu contextuel. Cela peut se produire si le logiciel de sauvegarde tiers génère des points de contrôle, mais ne les supprime pas après une opération de sauvegarde.

Dans ces cas, vous pouvez toujours utiliser la clé Delete pour supprimer le point de contrôle.

En résumé, pour supprimer des points de contrôle dans le Gestionnaire Hyper-V (et fusionner les fichiers de disque de différenciation), procédez comme suit :

  1. Dans le Gestionnaire Hyper-V, sélectionnez la machine virtuelle.
  2. Dans la liste Points de contrôle, cliquez avec le bouton droit sur le point de contrôle que vous souhaitez supprimer, puis effectuez l’une des actions suivantes :
    • Sélectionnez Supprimer le point de contrôle.
    • Si supprimer le point de contrôle n’est pas disponible, sélectionnez le point de contrôle, puis sélectionnez Del.

Fusion de points de contrôle que vous ne pouvez pas afficher dans le Gestionnaire Hyper-V

Vous pouvez rencontrer une situation dans laquelle le Gestionnaire Hyper-V n’affiche pas de points de contrôle pour une machine virtuelle spécifique. En même temps, le dossier de système de fichiers correspondant affiche de nombreux fichiers de disque de différenciation. Cela peut se produire si le logiciel de sauvegarde tiers génère des points de contrôle, mais ne les supprime pas après une opération de sauvegarde.

Vous pouvez fusionner les fichiers de disque de différenciation de deux façons, selon que vous pouvez arrêter la machine virtuelle.

Quand vous pouvez arrêter la machine virtuelle

Pour fusionner les fichiers de disque de différenciation, arrêtez la machine virtuelle. En règle générale, les fichiers de disque de différenciation fusionnent dans le cadre du processus d’arrêt de la machine virtuelle.

Quand vous ne pouvez pas arrêter la machine virtuelle

Vous pouvez fusionner des disques de différenciation dans une machine virtuelle en ligne. Toutefois, il s’agit d’un processus en plusieurs étapes qui implique des scripts Windows PowerShell. Pour ce faire, procédez comme suit :

  1. Sauvegardez tous les fichiers de disque de différenciation (fichiers VHD).
  2. Créez et exécutez la Get-VHDChain fonction. Cette étape est décrite en détail plus loin dans cette section.
  3. Créez et exécutez des commandes de fusion. Cette étape est décrite en détail plus loin dans cette section.
  4. Modifiez les paramètres de la machine virtuelle pour qu’il pointe vers le disque dur virtuel parent fusionné.
  5. Démarrez la machine virtuelle. Un démarrage réussi signifie que la fusion s’est terminée correctement.

Créer et exécuter la fonction Get-VHDChain

  1. Sur le serveur hôte Hyper-V, ouvrez une fenêtre d’invite de commandes PowerShell d’administration.

  2. Copiez le script suivant, puis collez-le dans la fenêtre 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++
                }
            }
        }
    }
    ==================================
    

    Ce script définit une Get-VHDChain fonction qui identifie la chaîne de disque dur virtuel (ensemble de disques de différenciation pour la machine virtuelle).

  3. Exécutez la commande suivante :

    Get-vhdchain -name <virtual machine name>
    

    Note

    Dans cette commande, <le nom> de la machine virtuelle représente le nom de la machine virtuelle.

    Lorsque le script s’exécute, vous devez voir la sortie qui ressemble à la sortie suivante.

    Capture d’écran de la sortie du script Get-VHDChain.

  4. Assurez-vous que cela s’exécute Get-VHDChain sans erreur.

    Important

    Si la Get-VHDChain sortie contient des erreurs, vous devez supprimer les disques de différenciation affectés du dossier. Dans l’exemple suivant, le disque 24 a généré une erreur et doit être supprimé du dossier de disque de différenciation.

    Capture d’écran de la sortie du script Get-VHDChain lorsque le script génère une erreur.

Créer et exécuter des commandes de fusion

  1. Les instructions suivantes créent un script en C :\temp\merge.txt pour fusionner les disques. Effectuez les étapes suivantes :

    1. Sur le lecteur C : local, créez un dossier nommé temp.

    2. Ouvrez une fenêtre PowerShell d’administration, puis exécutez la commande suivante :

      $vm = Read-Host("please enter the VMname") 
      
    3. À l’invite de commandes, entrez le nom de la machine virtuelle.

    4. Copiez le script suivant, puis collez-le à l’invite de commandes.

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

      Le script doit ressembler au script suivant :

      Capture d’écran du script après son collage dans une fenêtre PowerShell.

  2. Ouvrez C :\temp\merge.txt. Ce fichier contient une liste de commandes de ligne de commande regroupées en paires. Chaque paire de commandes définit les opérations de fusion pour un disque de différenciation unique.

  3. Copiez la première commande de la première paire, collez-la à l’invite de commandes, puis exécutez-la. Ensuite, procédez de la même façon pour la deuxième commande de la première paire. Ces opérations fusionnent le disque de différenciation que les commandes adressent.

  4. Une fois le disque fusionné, répétez les étapes précédentes pour le disque de différenciation suivant dans la liste. Continuez pour tous les disques de différenciation que les adresses de fichier merge.txt .