Xử lý lỗi trong tập lệnh shell khởi động EFI


1

Tôi đang sử dụng máy tính, Dell OptiPlex 9010, đi kèm với phần mềm UEFI, nhưng không hỗ trợ khởi động từ các thiết bị NVMe PCI-Express.

Tôi đã giải quyết vấn đề này bằng cách sử dụng DUET để tạo phân vùng khởi động EFI trên thanh USB, có trình điều khiển NVMe mà nó tải, sau đó thực hiện chương trình khởi động EFI của hệ điều hành của tôi.

Các lệnh để làm điều này hiện đang được nhập bằng tay. Đây là quá trình:

  1. Máy tính bị tắt.
  2. Lắp thanh USB DUET của tôi vào cổng USB (tôi luôn luôn cắm nó vào)
  3. Bật máy tính
  4. (UEFI được cấu hình để luôn khởi động từ thanh USB đó trước và bỏ qua các bộ tải khởi động trong các ổ đĩa khác mà tôi đã cắm)
  5. Thanh USB DUET tải vỏ EFI ( EFI Shell version 2.31 [4.653] )
  6. (Các map lệnh hiển thị thanh USB DUET được tự động gắn tại fs0: )
  7. Tôi tải trình điều khiển NVMe: load fs0:\EFI\Drivers\NvmExpressDxe-64.efi
  8. Tôi kích hoạt làm mới ánh xạ âm lượng với map -r, lệnh này hoàn thành thành công mà không có bất kỳ vấn đề.
  9. (Khối lượng NVMe của tôi hiện được liệt kê, đôi khi là fs1: nhưng đôi khi cũng như fs0: )
  10. Tôi khởi động vào Windows bằng cách chạy: fs1:\EFI\Boot\Bootx64.efi
  11. Màn hình khởi động của Windows xuất hiện và máy tính tiếp tục khởi động Windows

Tôi đã cố gắng tự động hóa điều này bằng cách đặt các lệnh bên trong một startup.nsh tập lệnh (tương đương EFI của DOS ' autoexec.bat ).

Kịch bản của tôi là thế này:

echo Step 1
load fs0:\EFI\Drivers\NvmExpressDxe-64.efi
echo Step 2
map -r
echo Step 3
fs0:
echo Step 4
fs0:\EFI\Boot\Bootx64.efi
echo Step 5

(Kịch bản này sử dụng fs0: thay vì fs1: bởi vì khi startup.nsh chạy, ổ NVMe của tôi được ánh xạ lại fs0:, nhưng khi tôi chạy các lệnh tương tác thay vì nó được ánh xạ tới fs1:. Tôi không biết tại sao hoặc làm thế nào điều này xảy ra).

Khi tôi khởi động và để shell thực thi startup.nsh Tôi nhận được kết quả này:

startup.nsh> Step 1
startup.nsh> load fs0:\EFI\Drivers\NvmExpressDxe-64.efi
load: Image fs0:\EFI\Drivers\NvmExpressDxe-64.efi loaded at D7C3F000 - Success
startup.nsh> Step 2
startup.nsh> map -r
Device mapping table
  fs0  :PciRoot(0x0)/Pci(0x1c,0x4)/...
  fs1  :PciRoot(0x0)/Pci(0x1c,0x4)/...
  blk0 :PciRoot(0x0)/Pci(0x1c,0x4)/...
  ...
Shell: Cannot read from file - No Media
Shell> _

Vậy khi nào map -r được thực hiện từ bên trong startup.nsh nó chạy, nhưng sau đó không thành công với lỗi "Không thể đọc từ tệp - Không có phương tiện" và sau đó nó hủy bỏ việc thực thi phần còn lại của tập lệnh (vì không có echo Step 3 đầu ra), tuy nhiên nếu tôi nhập bằng tay vào fs0:\EFI\Boot\Bootx64.efi lệnh sau đó Windows tải tốt.

Tôi đã xem tài liệu của EFI Shell Commands và tôi không thấy bất kỳ lệnh nào như try hoặc là on error resume next hoặc là on error goto :label - vì vậy kịch bản cam chịu thất bại.

Câu trả lời:


1

Tôi có thể xác nhận rằng map -r phá vỡ kịch bản khởi động.

Điều này xảy ra vì ánh xạ lại thay đổi vị trí của tập lệnh và trình bao không thể đọc lệnh tiếp theo để thực thi. Bạn có thể khắc phục điều này bằng cách thay đổi chế độ vỏ EFI và sử dụng phương pháp cập nhật của ánh xạ.

Tóm lại, thay vì map -r, thử đi:

connect -r
set -v efishellmode 1.1.2
map -u

Cảm ơn bạn - điều này đã làm việc! (Xin lỗi vì đã mất 2 tháng để kiểm tra!)
Dai

0

IMHO, cách tiếp cận của bạn quá phức tạp. Bạn đang sử dụng CSM tích hợp EFI của máy tính để chạy triển khai EFI thứ hai từ đĩa bên ngoài và sau đó tải trình điều khiển EFI trong triển khai EFI thứ hai. Một số lựa chọn thay thế xảy ra với tôi:

  • Bạn có thể chạy trình bao EFI trong EFI gốc của máy tính và chạy tập lệnh từ đó để tải trình điều khiển EFI. Điều này cắt bỏ CSM và triển khai EFI thứ hai, giúp giảm thời gian khởi động và cải thiện độ tin cậy. Điều đó nói rằng, tùy chọn này rất có thể sẽ tạo ra cùng một vấn đề mà bạn đang gặp.
  • Bạn có thể chạy của tôi rEFI trong EFI gốc của máy tính và định cấu hình trình điều khiển của bạn làm trình điều khiển rEFInd tự động tải. Một cảnh báo lớn với điều này là mã tải trình điều khiển của rEFInd đã được kiểm tra tốt cho các hệ thống tệp nhưng không phải với các loại trình điều khiển khác, vì vậy tôi không thể hứa nó sẽ tải trình điều khiển của bạn. Ngoài ra, ngay cả khi nó đã tải trình điều khiển của bạn, bạn có thể gặp phải một vấn đề tương tự như sự cố mà bạn đã gặp phải.
  • Bạn có thể đặt (các) bộ tải khởi động và nếu cần (các) nhân hệ điều hành của bạn, trên phương tiện mà EFI bản địa của bạn có thể đọc, do đó không cần đến trình điều khiển NVMe. Vì bạn đã sử dụng ổ flash USB cho DUET, bạn có thể sử dụng nó; hoặc có lẽ máy tính của bạn hỗ trợ các loại đĩa cứng khác, vì vậy bạn có thể sử dụng một trong số chúng, ngay cả khi đó không phải là loại lưu trữ chính của bạn. Vì tôi không phải là chuyên gia về Windows, tôi không thể đề xuất cụ thể cách đặt Windows ra để làm điều này.

Điều đó nói rằng, tôi không biết câu trả lời cho câu hỏi trực tiếp của bạn. Nguyên nhân rõ ràng là do ánh xạ lại các thiết bị khi bạn tải trình điều khiển mới, "kéo tấm thảm ra khỏi vỏ".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.