Tôi đã gặp vấn đề này gần đây và sau vài ngày gỡ lỗi, tôi đã phát hiện ra sự cố và khắc phục nó.
Trống cuộn xin vui lòng:
Sau khi cài đặt Hyper-V Server 2016, hãy sử dụng một công cụ ngoại tuyến (như Windows PE) để gắn tổ ong HỆ THỐNG của bản cài đặt mới và thay đổi DWORD ControlSet001 \ Control \ BootDriverFlags từ 0x04 thành 0x1c. (Có lẽ bạn cũng nên thay đổi phiên bản ControlSet002 để có biện pháp tốt và bạn có thể nướng các thay đổi vào install.wim của mình để tránh phải thực hiện việc này sau mỗi lần cài đặt.)
(Bởi vì tất nhiên phải mất một tuần và trình gỡ lỗi kernel để tìm ra rằng nó chỉ yêu cầu thay đổi hai bit trong một bitfield tối nghĩa và hoàn toàn không có giấy tờ.)
Đây là lý do tại sao.
Trình tải khởi động Windows sử dụng các thường trình UEFI tích hợp để tìm cài đặt Windows và tải kernel và trình điều khiển khởi động vào RAM trước khi gọi ExitBootService. Một khi nó đã thực hiện điều đó và chuyển điều khiển cho kernel, kernel không thể truy cập vào khối lượng khởi động trừ khi các trình điều khiển thích hợp đã có trong RAM.
Mặc dù đây là kicker: winload.efi không đủ phức tạp để liệt kê phần cứng và xác định trình điều khiển nào thực sự cần thiết. Trong các phiên bản cũ hơn, nó sẽ chỉ tải những thứ được đặt thành Khởi động. Tuy nhiên, tải trình điều khiển bên ngoài phải chịu một hình phạt hiệu suất và khi Windows bắt đầu hỗ trợ nhiều lớp thiết bị khởi động hơn, cần có một hệ thống tốt hơn.
Nhập giá trị BootFlags trên các trình điều khiển riêng lẻ và giá trị BootDriverFlags trên toàn hệ thống. Nếu (BootFlags & BootDriverFlags)! = 0, trình điều khiển sẽ được tải ngay cả khi nó không được đặt thành Khởi động khởi động. Mỗi bit trong giá trị được cho là tương ứng với một loại phần cứng khác nhau, do đó, giá trị BootDriverFlags đặt loại phần cứng nào có thể được khởi động từ đó.
Khi cơ chế này được giới thiệu, Bit 3 được chỉ định cho các thiết bị khởi động USB, nhưng việc khởi động từ các thiết bị USB không được hỗ trợ trong Windows tiêu chuẩn. Phiên bản Hyper-V Server 2008 R2 đã thêm hỗ trợ cụ thể để khởi động từ USB bằng cách đặt giá trị này thành 0x04 và giá trị này đã được đặt trong mọi phiên bản của Hyper-V Server được phát hành kể từ đó.
Những cải tiến chung được thực hiện kể từ đó để hỗ trợ tính năng Windows To Go có nghĩa là bạn không phải sử dụng thủ thuật boot-to-VHD được khuyến nghị cho các phiên bản trước của Hyper-V Server được cài đặt trên thiết bị USB. Tuy nhiên, chúng cũng thay đổi ý nghĩa của giá trị BootDriverFlags. Các thiết bị USB 3 đã được cung cấp một bit riêng biệt và đặc biệt thẻ SD đã được cung cấp thêm một bit nữa.
Trong phiên bản 2016, điều này có nghĩa là giá trị 0x04 hiện chỉ cho phép khởi động từ các đĩa USB2 không phải là thẻ SD. Tất cả các phiên bản của Server 2016 ngoại trừ Hyper-V Server đều có giá trị mặc định là 0x1c, cho phép khởi động thẻ USB2, USB3 và SD; tuy nhiên, giá trị 0x04 vẫn được đặt trong Máy chủ Hyper-V, vì nó đã được thêm dưới dạng ghi đè trong quy trình xây dựng hình ảnh cho phiên bản 2008R2. Tuy nhiên, thay vì thêm một tính năng, giá trị này sẽ loại bỏ nó.
Điều này giải thích tại sao một số giải pháp trước đây cho vấn đề này khuyến nghị vô hiệu hóa USB3 và khởi động từ thẻ nhớ USB thay vì thẻ SD: điều này sẽ buộc danh mục thiết bị khởi động phải là một định nghĩa được giới hạn bởi "USB" "Bit trong BootDriverFlags.