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) }
Источники
- Using checkpoints to revert virtual machines to a previous state — виды точек, типы
CheckpointType, удаление и слияние; - Set-VM — тип точек, папка, автоматические точки;
- Checkpoint-VM, Get-VMSnapshot, Restore-VMSnapshot и Remove-VMSnapshot — работа с точками;
- Merge-VHD и Set-VHD — ручное слияние и путь к родителю;
- Export-VMSnapshot — экспорт точки;
- Plan for Hyper-V scalability — лимит точек на машину.
Контрольная точка — это заморозка диска и цепочка .avhdx над ним: откат выбрасывает изменения, удаление сливает их с родителем, а сама точка живёт на томе машины и годится только как короткая страховка перед изменением.
Дальше — часть 7: управляем Hyper-V с рабочей станции. Средства управления на Windows 10 и 11, группа Hyper-V Administrators, подключение к хосту в домене и вне домена, консоль vmconnect и расширенный сеанс, PowerShell Direct.
Оставить комментарий могут только зарегистрированные пользователи.
Войдите на сайт или зарегистрируйтесь, чтобы оставить комментарий.