Короткий ответ

Удаление 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 backupVM при backup
Export ругается на деревоэкспорт

Возможные причины

  1. Недостаточно места на CSV для объединения (merge может временно требовать доп. объём).
  2. Backup держит recovery snapshot.
  3. VM Running под высокой записью — merge живой долгий, кажется «завис».
  4. Сломанное дерево: часть файлов переименовали, ParentPath мёртв.
  5. Кластер: операцию запустили не на OwnerNode.
  6. Одновременно второй 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 — алиас. Используйте одно и то же в скриптах кластера.