Поделиться через


Объединение контрольных точек с несколькими различающимися дисками

Область применения: Windows Server 2022, Windows Server 2019, Windows Server 2016

Введение

В этой статье описываются методы, которые можно использовать для объединения контрольных точек на виртуальную машину, если Hyper-V создал множество разных дисков. Используемый метод зависит от сведений о ситуации.

Объединение контрольных точек, которые можно просмотреть в диспетчере Hyper-V

Контрольные точки, которые можно просмотреть в диспетчере Hyper-V, являются самыми простыми для обработки. Обычно можно использовать команду "Удалить контрольную точку" в контекстном меню для удаления этих контрольных точек.

Снимок экрана: контрольная точка в диспетчере Hyper-V, в которой контекстное меню содержит команду

В некоторых случаях поддерев "Удалить контрольную точку" и "Удалить контрольную точку" не отображаются в контекстном меню. Это может произойти, если стороннее программное обеспечение резервного копирования создает контрольные точки, но не удаляет их после операции резервного копирования.

В этих случаях можно по-прежнему использовать ключ Delete для удаления контрольной точки.

Чтобы удалить контрольные точки в диспетчере Hyper-V (и объединить разностные файлы дисков), выполните следующие действия.

  1. В диспетчере Hyper-V выберите виртуальную машину.
  2. В списке контрольных точек щелкните правой кнопкой мыши контрольную точку, которую требуется удалить, и выполните одно из следующих действий:
    • Выберите " Удалить контрольную точку".
    • Если удалить контрольную точку недоступен, выберите контрольную точку и выберите del.

Объединение контрольных точек, которые невозможно просмотреть в диспетчере Hyper-V

Может возникнуть ситуация, в которой диспетчер Hyper-V не отображает контрольные точки для определенной виртуальной машины. В то же время в соответствующей папке файловой системы отображается множество разных дисковых файлов. Это может произойти, если стороннее программное обеспечение резервного копирования создает контрольные точки, но не удаляет их после операции резервного копирования.

Файлы разных дисков можно объединить двумя способами в зависимости от того, можно ли завершить работу виртуальной машины.

Когда вы можете завершить работу виртуальной машины

Чтобы объединить разностные файлы дисков, завершите работу виртуальной машины. Как правило, разностные файлы дисков объединяются в рамках процесса завершения работы виртуальной машины.

Если не удается завершить работу виртуальной машины

Вы можете объединить разностные диски на виртуальную машину в сети. Однако это многоэтапный процесс, который включает скрипты Windows PowerShell. Для этого выполните следующие общие действия.

  1. Создайте резервную копию всех разностных файлов дисков (VHD-файлы).
  2. Создайте и запустите функциюGet-VHDChain. Этот шаг подробно описан далее в этом разделе.
  3. Создание и выполнение команд слияния. Этот шаг подробно описан далее в этом разделе.
  4. Измените параметры виртуальной машины, чтобы указать на объединенный родительский виртуальный жесткий диск.
  5. Запустите виртуальную машину. Успешный запуск означает, что слияние успешно завершено.

Создание и запуск функции 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 (набор разных дисков для виртуальной машины).

  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 адреса файлов.