Короткий ответ
Удаление checkpoint — это merge differencing-диска в родителя, не «файл на Delete». На VM-APP01 используйте Remove-VMCheckpoint / Failover Cluster Manager и ждите I/O. Если висит: нет места под merge, VM в состоянии где merge не стартует, дерево снимков сломано backup, или кто-то уже трогал .avhdx руками.
Симптомы и как отличить
Типичная картина:
- в дереве Checkpoints серый Delete, прогресс часами;
Get-VMCheckpointпоказывает снимок после «успеха» GUI;- рядом с VHDX лежит
VM-APP01_D0A1....avhdx; - статус VM
Merging disks.
Отличия:
| Что видно | Куда |
|---|---|
| Merge не заканчивается, цепочка ясна | AVHDX не объединяется |
| Том забит overlay | рост VHDX |
| Залипание на VSS backup | VM при backup |
| Export ругается на дерево | экспорт |
Возможные причины
- Недостаточно места на CSV для объединения (merge может временно требовать доп. объём).
- Backup держит recovery snapshot.
- VM Running под высокой записью — merge живой долгий, кажется «завис».
- Сломанное дерево: часть файлов переименовали, ParentPath мёртв.
- Кластер: операцию запустили не на OwnerNode.
- Одновременно второй checkpoint/export/replica.
Диагностика
Get-VM -Name 'VM-APP01' | Format-List Name, State, Status, CPUUsage, Uptime
Get-VMCheckpoint -VMName 'VM-APP01' | Format-Table Name, SnapshotType, CreationTime, ParentCheckpointName, Path
Get-VMHardDiskDrive -VMName 'VM-APP01' | ForEach-Object { Get-VHD -Path $_.Path | Format-List Path, VhdType, ParentPath, FileSize, Size }
Get-ChildItem 'C:\ClusterStorage\Volume1\VM-APP01' | Format-Table Name, Length, LastWriteTimeОчередь хранения:
Get-StorageJob -ErrorAction SilentlyContinue | Format-Table Name, JobState, PercentComplete, ElapsedTime
Get-Volume | Where-Object DriveLetter -eq $null | Format-Table FileSystemLabel, SizeRemaining
Get-ClusterSharedVolume | Format-Table Name, State, OwnerNodeЖурналы Microsoft-Windows-Hyper-V-VMMS-Admin и Microsoft-Windows-Hyper-V-Worker-Admin на предмет checkpoint/merge. Не запускайте второй Delete пока первый StorageJob не Finished/Failed.
Цепочка ParentPath должна сходиться к базовому .vhdx. Обрыв — не Delete, а ручной штатный Merge-VHD по инструкции с Off и backup.
Решение
Сценарий A. Merge идёт, просто долго
Не трогайте. Смотрите % StorageJob и уменьшение AVHDX. Высокая нагрузка диска удлиняет окно. Планируйте удаление снимка в период низкой записи.
Сценарий B. Нет места
Освободите CSV (ISO, чужие копии), не компактуя живой диск. Merge без запаса остановится. После появления гигабайт повторите:
Get-VMCheckpoint -VMName 'VM-APP01' | Format-Table Name, CreationTime
Remove-VMCheckpoint -VMName 'VM-APP01' -Name 'BeforePatch'Имя — точное из Get-VMCheckpoint.
Сценарий C. Backup recovery snapshot
Дождитесь конца backup job. В продукте резервного копирования найдите «Hyper-V checkpoint leftover». Удаляйте через тот же продукт или Remove-VMCheckpoint, не файлы.
Если job мёртвый: остановите агент backup на HV01 после понимания, что VSS writer не в Failed, затем штатный Remove.
Сценарий D. Операция не на владельце
Get-ClusterGroup -Name 'VM-APP01' | Format-List OwnerNode, StateВыполняйте checkpoint-операции на OwnerNode или через Cluster GUI, который сам целится в владельца.
Сценарий E. Нужно снять снимок с выключенной VM
Иногда merge стабильнее Off:
Stop-VM -Name 'VM-APP01' -Confirm:$false
Remove-VMCheckpoint -VMName 'VM-APP01' -Name 'BeforePatch'
Get-StorageJobНе применяйте Merge-VHD пока GUI/Remove-VMCheckpoint ещё работают — два merge на одной цепочке.
Что смотреть в каталоге во время merge
На C:\ClusterStorage\Volume1\VM-APP01 файл .avhdx должен менять LastWriteTime и размер. Если timestamp замер на десятки минут при нулевом Get-StorageJob — merge не идёт, это не «ещё подождать ночь». Тогда журнал Worker, место на CSV, не второй Delete.
Для clustered VM операция должна быть на OwnerNode. С HV02 Delete в GUI часто ставит задачу, которая не видит открытый диск на HV01. Сверьте Get-ClusterGroup -Name 'VM-APP01'.
Production checkpoint от backup иногда не виден в дереве Hyper-V Manager, но Get-VMCheckpoint его показывает. Удаляйте по точному Name, не «верхний в GUI». После успешного Remove подождите, пока Get-VHD текущего диска VM перестанет быть Differencing, иначе вы только сняли metadata, а overlay ещё пишется.
Не делайте compact VHDX, пока хотя бы один avhdx в каталоге VM. Compact и merge конкурируют за файл.
Как проверить, что проблема устранена
Get-VMCheckpoint -VMName 'VM-APP01'
Get-ChildItem 'C:\ClusterStorage\Volume1\VM-APP01' -Filter *.avhdx
Get-VHD -Path 'C:\ClusterStorage\Volume1\VM-APP01\VM-APP01.vhdx' | Format-List VhdType, ParentPath, FileSize
Get-VM -Name 'VM-APP01' | Format-List State, StatusСписок checkpoint пуст (или только осознанные). AVHDX нет, текущий диск Dynamic/Fixed без ParentPath. VM Running, гость консистентен (chkdsk не «на всякий» — только если были Turn Off).
Если не помогло
- ParentPath обрыв: переходите к статье AVHDX, Off, backup, Merge-VHD по цепочке снизу вверх.
- После «успеха» гость откатился на неделю: вы слили не ту ветку или применили Apply вместо Delete. Restore.
- Export всё ещё требует дерево: см. экспорт VM.
- Компакт после merge — отдельное окно, сжатие.
Профилактика
- Checkpoint не замена backup. TTL снимка — часы, не недели.
- Мониторинг наличия
Get-VMCheckpointна прод-VM. - Backup, который гарантированно merge recovery snapshot.
- Запас 20%+ на CSV под merge и рост.
- Запрет ручных операций с avhdx в runbook.
FAQ
Delete и Apply — одно и то же?
Нет. Apply возвращает VM к точке (потеря последующих данных). Delete сливает последующие изменения в родителя и убирает точку. Путаница в GUI стоит датасета.
Можно ли удалить только «средний» снимок в цепочке?
Hyper-V сольёт его в соседние. Всё равно нужен запас места. Не выдёргивайте средний avhdx файлом.
Production vs standard — какой мешает меньше?
Production не включает RAM, ближе к VSS backup. Standard замораживает и память — проще «откатить тест», тяжелее для прод-SQL. Для удаления merge диска всё равно нужен.
VM должна быть Off?
Не обязательно: live merge поддерживается. Off предсказуемее на аварийной цепочке.
Почему после Delete файл avhdx ещё виден?
Merge не закончен. Ждите StorageJob. Копия в Explorer «на всякий» во время merge — риск.
Remove-VMSnapshot или Remove-VMCheckpoint?
На 2019+ основное имя Checkpoint. Snapshot — алиас. Используйте одно и то же в скриптах кластера.