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

Если диск не подключается к VM-APP01, Hyper-V почти никогда «не любит VHDX» — файл занят, нет ACL для GUID машины, оборвана цепочка differencing, либо формат/версия не те. Снимите Get-VHD и кто открыл файл, прежде чем копировать диск в Explorer или делать Mount-VHD поверх.

Не удаляйте .avhdx «мешающий» файл. Это текущие данные гостя, пока не выполнен штатный merge.

Симптомы и как отличить

Типичная картина:

  • в настройках SCSI «Error applying hard drive changes»;
  • Get-VHD : Attached : True, но VM Off — диск держит другой процесс или Mount;
  • сообщение sharing violation 0x80070020;
  • Access Denied 0x80070005 на C:\ClusterStorage\Volume1\VM-APP01\.

Отличия:

Что видноКуда
Диск есть, VM не стартует по другой причинестарт VM
Цепочка AVHDXcheckpoint, merge
Файл разросся, том 0 байтрост VHDX
Нужно увеличить размеррасширить VHDX

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

  1. Файл открыт: backup, другой узел CSV, Mount-VHD, антивирус, второй VM с тем же путём.
  2. ACL: после копирования с флешки нет ACE для NT VIRTUAL MACHINE\<VM GUID>.
  3. ParentPath указывает на переименованный/уехавший родитель.
  4. Подключают .vhd как VHDX или наоборот, либо VHD Set .vhds не туда.
  5. Диск ещё Fixed/Dynamic с хоста 2008, несовместимые флаги.
  6. Путь длиннее ограничения или том CSV не Online на этом узле.
  7. Shared VHDX для гостевого кластера подключён без sharing mode.

Диагностика

Get-VM -Name 'VM-APP01' | Format-List Id, State, Path
Get-VMHardDiskDrive -VMName 'VM-APP01' | Format-Table ControllerType, ControllerNumber, ControllerLocation, Path
$p = 'C:\ClusterStorage\Volume1\VM-APP01\VM-APP01.vhdx'
Get-Item $p | Format-List FullName, Length, IsReadOnly, Attributes
Get-VHD -Path $p | Format-List Path, VhdFormat, VhdType, FileSize, Size, MinimumSize, ParentPath, FragmentationPercentage, Attached
Test-VHD -Path $p

ACL:

icacls $p
Get-Acl $p | Format-List

Ищите SID вида S-1-5-83-... или имя NT VIRTUAL MACHINE\.... Если только Administrators с флешки — вот ваш 0x80070005.

Кто держит файл (штатный способ без Sysinternals, если роль File Server / openfiles не включена — смотрите backup job и Get-VHD -DiskNumber):

Get-Disk | Where-Object Location -like '*VM-APP01*'
Get-VHD -Path $p
Get-VM | Get-VMHardDiskDrive | Where-Object Path -eq $p | Format-Table VMName, Path

Два VMName на одном Path — конфликт. Cluster Shared Volume:

Get-ClusterSharedVolume | Format-Table Name, State, OwnerNode

Журнал Hyper-V-VMMS и Hyper-V-Worker: Access Denied, sharing violation, «failed to open attachment».

Решение

Сценарий A. Sharing violation (0x80070020)

  1. Найдите VM или Mount, который держит диск. Dismount-VHD -Path $p если вы сами монтировали для копирования файлов.
  2. Остановите backup job, который оставил VSS snapshot / lock.
  3. На кластере убедитесь, что VM не Running на другом узле (split). Не подключайте тот же файл второй VM «для теста».
Dismount-VHD -Path $p -ErrorAction SilentlyContinue
Get-VHD -Path $p | Format-List Attached

Затем Add-VMHardDiskDrive / Start-VM.

Сценарий B. Access Denied

Сравните (Get-VM VM-APP01).Id с ACL. Штатный ремонт — дать VM доступ через Hyper-V (пересоздание вложения часто прописывает ACE) или icacls по модели существующих рабочих VM на этом CSV. Не Everyone:F.

После копирования диска между томами:

Add-VMHardDiskDrive -VMName 'VM-APP01' -ControllerType SCSI -Path $p

Если диск уже в конфиге, снимите и добавьте снова после ACL, не оставляя два одинаковых Path.

Сценарий C. Цепочка ParentPath

Get-VHD -Path 'C:\ClusterStorage\Volume1\VM-APP01\VM-APP01.avhdx' | Format-List Path, ParentPath

Верните родителя на место или завершите merge AVHDX штатно. Не Set-VHD -ParentPath на прод, пока не поняли цепочку и нет backup.

Сценарий D. Не тот формат

Get-VHD покажет VhdFormat : VHD vs VHDX. Конвертация:

Convert-VHD -Path 'D:\import\disk.vhd' -DestinationPath 'C:\ClusterStorage\Volume1\VM-APP01\VM-APP01.vhdx' -VHDType Dynamic

VM в это время Off. Места на томе должно хватить на весь новый файл плюс запас.

Сценарий E. Read-only и «диск с DVD»

Снимите Read-only атрибут файла и NTFS. ISO на DVD-контроллере не путайте с VHDX на SCSI.

Как проверить, что проблема устранена

Get-VMHardDiskDrive -VMName 'VM-APP01'
Get-VHD -Path $p | Format-List Attached, FileSize, ParentPath
Start-VM -Name 'VM-APP01' -ErrorAction SilentlyContinue
Get-VM -Name 'VM-APP01' | Format-List State, Status

Диск в конфиге, после старта Attached : True, гость видит диск в Disk Management. Нет повторных 0x80070020 в VMMS.

Если не помогло

  • CSV Redirected/Offline: CSV.
  • Test-VHD падает на середине цепочки: checkpoint.
  • После антивируса снова lock: исключения каталога VM, не отключение Defender навсегда.
  • Путь на локальном диске узла, а VM clustered: перенесите VHDX на C:\ClusterStorage\Volume1, иначе второй узел диск не увидит.
  • 4K native vs 512e: смотрите PhysicalSectorSize в Get-VHD; не «выравнивайте» сторонними утилитами без backup.

Профилактика

  • VHDX только на CSV/Cluster Storage для clustered VM.
  • Исключения антивируса по рекомендации Microsoft для Hyper-V.
  • Запрет Mount-VHD на прод-диски без окна.
  • Backup, который отпускает VSS writer, а не держит файл часами.
  • Клонирование через Export/Import или Copy-VM, не Copy-Item поверх GUID.

FAQ

Можно ли подключить один VHDX к двум VM?

К обычным — нет, будет порча. Исключение: Shared VHDX/VHD Set для гостевого кластера, явно настроенный sharing.

Mount-VHD безопасен на работающей VM?

Нет. Монтируйте только Offline копию. Живой файл — lock и риск.

icacls Reset на весь CSV?

Нет. Сбросите ACE всех VM. Правите ACE конкретного файла/каталога VM.

Ошибка про «incompatible disk» после переноса с 2012 R2?

Иногда нужен Convert-VHD в новый VHDX на хосте 2019+. Не меняйте сигнатуру hex-редактором.

Диск виден в Explorer хоста как файл, но Get-VHD падает?

Повреждён заголовок или это не VHDX (переименованный ISO). Test-VHD и копия из backup, не repair «с форума».

Нужен ли SCSI-контроллер второй?

Generation 2: SCSI норма. Не добавляйте IDE «для совместимости» на Gen2 — его нет. Проблема подключения почти всегда в файле, не в номере контроллера.