Я недавно столкнулся с этой проблемой, и после нескольких дней отладки я обнаружил проблему и исправил ее.
Барабанная дробь, пожалуйста:
После установки Hyper-V Server 2016 используйте автономный инструмент (например, Windows PE), чтобы смонтировать куст SYSTEM новой установки, и измените DWORD ControlSet001 \ Control \ BootDriverFlags с 0x04 на 0x1c. (Вам, вероятно, следует также изменить версию ControlSet002, и вы можете сохранить изменения в своем файле install.wim, чтобы избежать необходимости делать это после каждой установки.)
(Потому что, конечно, требуется неделя и отладчик ядра, чтобы выяснить, что для этого просто требуется двухразрядное изменение неясного и полностью недокументированного битового поля.)
Вот почему
Загрузчик Windows использует встроенные процедуры UEFI для поиска установки Windows и загружает ядро и драйверы загрузки в ОЗУ перед вызовом ExitBootServices. Как только это будет сделано и передано управление ядру, ядро не сможет получить доступ к загрузочному тому, если соответствующие драйверы уже не присутствуют в оперативной памяти.
Но вот что важно: winload.efi не достаточно сложен, чтобы перечислять оборудование и определять, какие драйверы действительно требуются. В старых версиях он загружал только те вещи, которые установлены в Boot Start. Однако загрузка посторонних драйверов влечет за собой снижение производительности, и поскольку Windows начала поддерживать больше классов загрузочных устройств, потребовалась более совершенная система.
Введите значение BootFlags для отдельных драйверов и общесистемное значение BootDriverFlags. Если (BootFlags & BootDriverFlags)! = 0, драйвер будет загружен, даже если для него не установлен Boot Start. Предполагается, что каждый бит в значении соответствует другому типу оборудования, поэтому значение BootDriverFlags определяет, с каких типов оборудования можно загружаться.
Когда этот механизм был введен, бит 3 предназначался для загрузочных USB-устройств, но загрузка с USB-устройств не поддерживалась в стандартной Windows. Версия Hyper-V Server 2008 R2 добавила особую поддержку загрузки с USB, установив для этого значения значение 0x04, и это значение было установлено в каждой версии Hyper-V Server, выпущенной с тех пор.
Общие улучшения, сделанные с тех пор для поддержки функции Windows To Go, означают, что вам не нужно использовать прием загрузки с VHD, рекомендованный для предыдущих версий Hyper-V Server, установленных на USB-устройствах. Однако они также меняют значение значения BootDriverFlags. Устройствам USB 3 был выделен отдельный бит, а SD-картам - еще один бит.
В версии 2016 года это означает, что значение 0x04 теперь позволяет загружаться только с дисков USB2, которые не являются SD-картами. Все версии Server 2016, за исключением сервера Hyper-V, поставляются со значением по умолчанию 0x1c, что позволяет загружать USB2, USB3 и SD-карту; однако значение 0x04 по-прежнему установлено в сервере Hyper-V, поскольку оно было добавлено в качестве переопределения в процессе построения образа для версии 2008R2. Однако вместо добавления функции это значение теперь удаляет ее.
Это объясняет, почему некоторые предыдущие решения этой проблемы рекомендовали отключение USB3 и загрузку с USB-накопителя вместо SD-карты: это заставило бы категорию загрузочного устройства быть чем-то, что все еще охватывается теперь более ограниченным определением «USB "бит в BootDriverFlags.