ฉันพบปัญหานี้เมื่อเร็ว ๆ นี้และหลังจากการดีบักหลายวันฉันได้ค้นพบปัญหาและแก้ไขได้
กรุณา Drumroll:
หลังจากติดตั้งเซิร์ฟเวอร์ Hyper-V 2016 ให้ใช้เครื่องมือออฟไลน์ (เช่นพูด Windows PE) เพื่อติดตั้งไฮฟ์ระบบของการติดตั้งใหม่และเปลี่ยน DWORD ControlSet001 \ Control \ BootDriverFlags จาก 0x04 เป็น 0x1c (คุณควรเปลี่ยนรุ่น ControlSet002 เช่นกันเพื่อวัดผลที่ดีและคุณสามารถอบการเปลี่ยนแปลงลงใน install.wim ของคุณเพื่อหลีกเลี่ยงการทำเช่นนี้หลังจากการติดตั้งแต่ละครั้ง)
(เพราะแน่นอนว่ามันต้องใช้เวลาหนึ่งสัปดาห์และเคอร์เนลดีบักเกอร์จะต้องรู้ว่ามันต้องใช้การเปลี่ยนแปลงสองบิตใน bitfield ที่ไม่ชัดเจนและไม่มีเอกสารอย่างละเอียด)
นี่คือเหตุผล
ตัวบูตการบูตของ Windows ใช้รูทีน UEFI ในตัวเพื่อค้นหาการติดตั้ง Windows และโหลดเคอร์เนลและไดรเวอร์การบูตเป็น RAM ก่อนที่จะเรียก ExitBootServices เมื่อทำเช่นนั้นแล้วและผ่านการควบคุมไปยังเคอร์เนลเคอร์เนลไม่สามารถเข้าถึงโวลุ่มการบูตเว้นแต่ว่ามีไดรเวอร์ที่เหมาะสมอยู่ใน RAM แล้ว
แม้ว่านี่คือนักเตะ: 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 ทุกรุ่นตั้งแต่นั้นเป็นต้นมา
การปรับปรุงทั่วไปที่ทำตั้งแต่นั้นมาเพื่อรองรับคุณสมบัติ Windows To Go หมายความว่าคุณไม่จำเป็นต้องใช้เคล็ดลับ boot-to-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 stick แทนการ์ด SD: สิ่งนี้จะบังคับให้หมวดหมู่ของอุปกรณ์สำหรับบูตเป็นสิ่งที่ยังคงครอบคลุมอยู่ในคำจำกัดความ บิตใน BootDriverFlags