Saya mengalami masalah ini baru-baru ini, dan setelah beberapa hari melakukan debug, saya menemukan masalah dan memperbaikinya.
Drumroll, silakan:
Setelah menginstal Hyper-V Server 2016, gunakan alat offline (seperti, katakanlah, Windows PE) untuk memasang sarang SISTEM dari instalasi baru, dan mengubah DWORD ControlSet001 \ Control \ BootDriverFlags dari 0x04 ke 0x1c. (Anda mungkin harus mengubah versi ControlSet002 juga untuk ukuran yang baik, dan Anda dapat memanggang perubahan ke install.wim Anda untuk menghindari harus melakukan ini setelah setiap pemasangan.)
(Karena tentu saja dibutuhkan satu minggu dan debugger kernel untuk mengetahui bahwa itu hanya membutuhkan perubahan dua-bit dalam bitfield yang tidak jelas dan tidak terdokumentasi secara menyeluruh.)
Inilah sebabnya.
Pemuat boot Windows menggunakan rutin UEFI bawaan untuk menemukan instalasi Windows, dan memuat driver kernel dan boot ke dalam RAM sebelum memanggil ExitBootServices. Setelah melakukan itu dan memberikan kontrol ke kernel, kernel tidak dapat mengakses volume boot kecuali driver yang sesuai sudah ada dalam RAM.
Inilah kickernya: winload.efi tidak cukup rumit untuk menyebutkan perangkat keras dan menentukan driver apa yang sebenarnya diperlukan. Dalam versi yang lebih lama itu hanya akan memuat hal-hal yang diatur ke Boot Start. Namun, memuat driver asing menimbulkan penalti kinerja, dan ketika Windows mulai mendukung lebih banyak kelas perangkat boot, diperlukan sistem yang lebih baik.
Masukkan nilai BootFlags pada driver individual dan nilai BootDriverFlags di seluruh sistem. Jika (BootFlags & BootDriverFlags)! = 0, driver akan dimuat meskipun tidak diatur ke Boot Start. Setiap bit dalam nilai seharusnya sesuai dengan jenis perangkat keras yang berbeda, sehingga nilai BootDriverFlags menentukan jenis perangkat keras mana yang dapat di-boot dari.
Ketika mekanisme ini diperkenalkan, Bit 3 ditujukan untuk perangkat boot USB, tetapi boot dari perangkat USB tidak didukung di Windows standar. Versi Hyper-V Server 2008 R2 menambahkan dukungan khusus untuk boot dari USB dengan menetapkan nilai ini ke 0x04, dan nilai ini telah ditetapkan di setiap versi Server Hyper-V yang dirilis sejak itu.
Perbaikan umum yang dibuat sejak saat itu untuk mendukung fitur Windows To Go berarti Anda tidak harus menggunakan trik boot-to-VHD yang direkomendasikan untuk versi Hyper-V Server sebelumnya yang diinstal pada perangkat USB. Namun, mereka juga mengubah arti dari nilai BootDriverFlags. Perangkat USB 3 telah diberikan bit yang terpisah, dan kartu SD secara khusus telah diberikan bit yang lain.
Dalam versi 2016, ini berarti bahwa nilai 0x04 sekarang memungkinkan booting hanya dari disk USB2 yang bukan kartu SD. Semua versi Server 2016 kecuali Server Hyper-V dikirimkan dengan nilai default 0x1c, yang memungkinkan boot USB2, USB3, dan kartu SD; Namun, nilai 0x04 masih ditetapkan di Hyper-V Server, karena ditambahkan sebagai pengesampingan dalam proses pembuatan gambar untuk versi 2008R2. Alih-alih menambahkan fitur, nilai ini sekarang menghapusnya.
Ini menjelaskan mengapa beberapa solusi sebelumnya untuk masalah ini merekomendasikan penonaktifan USB3 dan boot dari USB stick daripada kartu SD: ini akan memaksa kategori perangkat boot menjadi sesuatu yang masih tercakup oleh definisi "USB" yang sekarang lebih terbatas. "bit dalam BootDriverFlags.