Hyper-V. Часть 6: Как работают контрольные точки?

Все части серии «Hyper-V»

В третьей части мы видели разностные диски: пустой файл над родителем, куда пишутся все изменения. На них построены контрольные точки — способ зафиксировать состояние машины перед обновлением или экспериментом и вернуться к нему, если что-то пошло не так. Разберём, какими бывают контрольные точки, что происходит с файлами при создании, откате и удалении точки, как разобрать цепочку дисков без машины и почему контрольная точка не заменяет резервную копию.


Что такое контрольная точка

Контрольная точка (checkpoint, раньше — snapshot) фиксирует состояние машины, к которому можно вернуться. Технически это разностный диск: при создании точки Hyper-V замораживает текущий .vhdx и начинает писать изменения в новый .avhdx рядом с ним (контрольные точки).

до точки:        app1.vhdx  ◄── запись машины

после точки:     app1.vhdx            (заморожен, только чтение)
                     ▲
                 app1_6A1B….avhdx  ◄── запись машины

Каждая следующая точка добавляет ещё один .avhdx в цепочку. Чтение блока, которого нет в последнем файле, идёт вверх по цепочке до родителя, поэтому длинная цепочка замедляет диск.

Стандартные и рабочие точки

Видов два (стандартные и рабочие):

  • Стандартная (Standard) сохраняет диски и содержимое памяти — машина после отката продолжает с того же места, вплоть до открытых окон. Для систем, которые реплицируют данные между узлами, это опасно: откат контроллера домена или узла кластера баз данных возвращает его в прошлое, а соседи помнят будущее.
  • Рабочая (Production) памяти не сохраняет. Перед снимком Hyper-V через службу интеграции VSS из второй части просит Windows-гостя привести данные приложений в согласованное состояние, а в Linux замораживает файловую систему. После отката машина загружается как после корректного выключения. Этот вид выбран по умолчанию.

Тип выбирается для машины (Set-VM):

CheckpointType Что происходит
Production рабочая точка, а если она не получилась — молча стандартная; по умолчанию
ProductionOnly только рабочая; если не получилась — ошибка
Standard всегда стандартная
Disabled контрольные точки запрещены

Там же задаются папка для файлов точек и автоматические контрольные точки, которые Hyper-V создаёт при каждом запуске машины:

Set-VM -Name app1 -CheckpointType ProductionOnly -AutomaticCheckpointsEnabled $false `
       -SnapshotFileLocation 'D:\Hyper-V\Checkpoints'
Set-VM -Name dc1  -CheckpointType Disabled
Get-VM | Format-Table Name, CheckpointType, AutomaticCheckpointsEnabled, SnapshotFileLocation

ProductionOnly полезен там, где молчаливая подмена на стандартную точку опасна: лучше получить ошибку, чем точку с памятью у сервера базы данных. Папку для точек (-SnapshotFileLocation) можно сменить, только пока у машины нет ни одной точки: иначе Set-VM откажет с «Cannot change the storage location of checkpoints because one or more checkpoints exist».

Создать, откатиться, переименовать

Checkpoint-VM -Name app1 -SnapshotName 'before-update'
Get-VMSnapshot -VMName app1 | Format-Table Name, SnapshotType, CreationTime, ParentSnapshotName
Restore-VMSnapshot -VMName app1 -Name 'before-update' -Confirm:$false
Rename-VMSnapshot  -VMName app1 -Name 'before-update' -NewName 'before-KB-2026-10'

Restore-VMSnapshot выбрасывает всё, что было записано после точки: текущий .avhdx удаляется, и машина начинает писать в новый над той же точкой (Restore-VMSnapshot). Если текущее состояние может пригодиться, перед откатом делают ещё одну точку.

Точки образуют дерево: после отката к старой точке и новых изменений появляется вторая ветка. Get-VMSnapshot -ParentOf и -ChildOf принимают точку и показывают её соседей по дереву (Get-VMSnapshot):

Get-VMSnapshot -ChildOf (Get-VMSnapshot -VMName app1 -Name 'before-update')

Удаление — это слияние

Удалить точку значит слить её .avhdx с родительским диском: Hyper-V делает это сам, в фоне и на работающей машине, а .avhdx удаляет по окончании. Удалять файлы .avhdx руками нельзя — машина потеряет все изменения после точки, а цепочка сломается (контрольные точки):

Remove-VMSnapshot -VMName app1 -Name 'before-update'                                    # одна точка
Get-VMSnapshot -VMName app1 -Name 'test-*' | Remove-VMSnapshot -IncludeAllChildSnapshots   # ветка целиком
Get-VM -Name app1 | Format-List Name, Status                                             # ход слияния

Параметры — в Remove-VMSnapshot. Пока идёт слияние, в Status машины виден его ход. Слияние большого .avhdx — долгая запись на весь объём изменений, поэтому точки, которые жили неделями, удаляют в спокойное время.

Цепочка без машины

Слияние вручную нужно, когда цепочка осталась без машины: машину удалили, импортировали без точек или конфигурация потерялась, а на томе лежат .vhdx и .avhdx. Тогда цепочку изучают по ParentPath и сливают на неподключённых дисках — от последнего .avhdx к родителю (Merge-VHD):

$d = Get-VHD -Path 'D:\Hyper-V\Virtual Hard Disks\old_6A1B….avhdx'
while ($d) { $d | Format-List Path, VhdType, ParentPath; $d = if ($d.ParentPath) { Get-VHD -Path $d.ParentPath } }

Merge-VHD -Path 'D:\Hyper-V\Virtual Hard Disks\old_6A1B….avhdx' -DestinationPath 'D:\Hyper-V\Virtual Hard Disks\old.vhdx'

Цикл проходит цепочку от последнего файла до корня. Merge-VHD с -DestinationPath сливает все промежуточные файлы до указанного родителя. Перед ручным слиянием файлы копируют: ошибка в порядке цепочки необратима. Если родительский файл переехал и ParentPath указывает в пустоту, путь к нему исправляет Set-VHD -Path child.avhdx -ParentPath new\parent.vhdx (Set-VHD).

Точка как отдельная машина

Из точки можно сделать отдельную машину — экспортировать её: Export-VMSnapshot создаёт экспорт машины в том состоянии, которое было в точке (Export-VMSnapshot):

Export-VMSnapshot -VMName app1 -Name 'before-update' -Path '\\fs1\export'

Дальше — обычный импорт копией с новым идентификатором, Import-VM -Copy -GenerateNewId; режимы импорта разобраны в части о переносе машин.

Не резервная копия

Контрольная точка — не резервная копия: она лежит на том же томе, что и машина, и без родительского диска бесполезна. Сломается том — пропадут и машина, и все её точки. Каждая точка удлиняет цепочку разностных дисков, замедляя чтение и съедая место; лимит — 50 точек на машину (лимиты).

Правило эксплуатации: точку делают перед изменением и удаляют сразу, как только изменение проверено. Средства резервного копирования тоже используют контрольные точки — создают их на время копирования и удаляют после, — и забытая такая точка выглядит в Get-VMSnapshot как Recovery или Replica.

Смотрим руками

Все контрольные точки старше недели:

Get-VM | Get-VMSnapshot | Where-Object CreationTime -lt (Get-Date).AddDays(-7) |
    Format-Table VMName, Name, SnapshotType, CreationTime

Длина цепочки дисков у каждой машины — диски с .avhdx в пути означают, что машина работает поверх точек:

Get-VM | Get-VMHardDiskDrive | Where-Object Path -like '*.avhdx' |
    Format-Table VMName, ControllerLocation, Path

Сколько места занимают файлы точек на томе:

Get-ChildItem 'D:\Hyper-V' -Recurse -Filter *.avhdx |
    Measure-Object Length -Sum | ForEach-Object { '{0:N1} GB' -f ($_.Sum / 1GB) }

Источники


Контрольная точка — это заморозка диска и цепочка .avhdx над ним: откат выбрасывает изменения, удаление сливает их с родителем, а сама точка живёт на томе машины и годится только как короткая страховка перед изменением.

Дальше — часть 7: управляем Hyper-V с рабочей станции. Средства управления на Windows 10 и 11, группа Hyper-V Administrators, подключение к хосту в домене и вне домена, консоль vmconnect и расширенный сеанс, PowerShell Direct.

Оставить комментарий могут только зарегистрированные пользователи.

Войдите на сайт или зарегистрируйтесь, чтобы оставить комментарий.