Открыть, прикрепить и назначить VHD

Мой пример использования следующий: у меня есть готовый образ VHD, и мне нужно смонтировать его по пути, например, D:\vhd\active. На данный момент мое решение представляет собой комбинацию команд Powershell Hyper-V и diskpart, но это выглядит очень грязно и взломано:

Mount-VHD -Path D:\vhd-file.vhd -NoDriveLetter 
diskpart> select vdisk file="D:\vhd-file.vhd"
diskpart> sel par 1
diskpart> assign mount="D:\vhd\active

Как вы можете видеть, я использовал "NoDriveLetter", потому что я не хочу автоматического назначения. "Sel par 1" мне нужно сделать, потому что я не нашел более простого способа выбрать правильный том (другие идеи заключались в том, чтобы проверить "lis vol" до Mount-VHD и после него... но да, у меня всегда есть только один раздел так что "sel par" ftw!)

Я нашел Microsoft VHD Reference и смог "открыть" и "присоединить" образ VHD через код пинвока C#. Я мог бы даже инициализировать его комбинацией CreateFile из kernel32.dll и DeviceIoControl с параметрами CREATE_DISK. Но я не нашел способа смонтировать его в путь к папке. Я пробовал SetVolumeMountPoint и GetVolumeNameForVolumeMountPoint из kernel32.dll, но Guid моего виртуального жесткого диска или VirtualDiskIdentifier, похоже, не подходят для этих функций.

Мой вопрос заключается в том, может ли кто-нибудь указать мне правильные функции / методы для достижения того же результата, что и у меня с помощью скриптового решения, но в коде. В коде означает C/C++ или C# ... Я могу написать свои собственные C#-рапперы, если проще выполнить эту задачу на простом C или C++.

1 ответ

SetVolumeMountPoint() потребует GUID подключенного тома; VirtualDiskIdentifier не будет работать здесь, так как это относительно диска.

Один из способов обойти это - дважды запустить цикл FindFirstVolume/FindNextVolume. Один раз перед креплением и один раз сразу после крепления. Разница между двумя результатами должна дать вам GUID подключенного тома.

Кроме того, если вы создаете виртуальный диск на основе GPT, вы можете напрямую передать "Уникальный идентификатор GUID раздела", который встроен в запись таблицы разделов GPT файла vhd, который вы пытаетесь смонтировать. Значение: в Windows после монтирования диска GPT результирующий GUID тома совпадает с тем, который встроен в соответствующую запись таблицы разделов GPT VHD/LUN. Смотрите изображение ниже. Для этого вам нужно прочитать несколько блоков сырых VHD-файлов и выполнить некоторый анализ. вывод mountvol - сравнение встроенного уникального идентификатора GUID PTE

Другие вопросы по тегам