Короткий ответ
Если диск не подключается к 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 |
| Цепочка AVHDX | checkpoint, merge |
| Файл разросся, том 0 байт | рост VHDX |
| Нужно увеличить размер | расширить VHDX |
Возможные причины
- Файл открыт: backup, другой узел CSV,
Mount-VHD, антивирус, второй VM с тем же путём. - ACL: после копирования с флешки нет ACE для
NT VIRTUAL MACHINE\<VM GUID>. - ParentPath указывает на переименованный/уехавший родитель.
- Подключают
.vhdкак VHDX или наоборот, либо VHD Set.vhdsне туда. - Диск ещё Fixed/Dynamic с хоста 2008, несовместимые флаги.
- Путь длиннее ограничения или том CSV не Online на этом узле.
- 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 $pACL:
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)
- Найдите VM или Mount, который держит диск.
Dismount-VHD -Path $pесли вы сами монтировали для копирования файлов. - Остановите backup job, который оставил VSS snapshot / lock.
- На кластере убедитесь, что 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 DynamicVM в это время 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 — его нет. Проблема подключения почти всегда в файле, не в номере контроллера.