Я использую компьютер Dell OptiPlex 9010, который поставляется с прошивкой UEFI, но не поддерживает загрузку с устройств PCI-Express NVMe.
Я обошел это, используя DUET для создания загрузочного раздела EFI на USB-накопителе, который имеет драйвер NVMe, который загружает, а затем выполняет загрузочную программу EFI моей операционной системы.
Команды для этого в настоящее время вводятся вручную. Вот процесс:
- Компьютер выключен.
- Вставьте USB-накопитель DUET в USB-порт (я всегда оставляю его подключенным)
- Включи компьютер
- (UEFI настроен так, чтобы всегда сначала загружаться с этой карты USB, и игнорировать загрузчики на других дисках, которые я подключил)
- USB-накопитель DUET загружает оболочку EFI (
EFI Shell version 2.31 [4.653]
) - (Команда
map
показывает, что USB-накопитель DUET автоматически устанавливается наfs0:
) - Я загружаю драйвер NVMe:
load fs0:\EFI\Drivers\NvmExpressDxe-64.efi
- Я запускаю обновление сопоставлений томов
map -r
, эта команда успешно завершается без каких-либо проблем. - (Мой том NVMe теперь указан, иногда как,
fs1:
а иногда и какfs0:
) - Я загружаюсь в Windows, запустив:
fs1:\EFI\Boot\Bootx64.efi
- Появится экран запуска Windows, и компьютер возобновит загрузку Windows
Я попытался автоматизировать это, поместив команды в startup.nsh
скрипт (EFI-эквивалент DOS ' autoexec.bat
).
Мой сценарий такой:
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
(Этот сценарий использует fs0:
вместо того, fs1:
потому что при запуске startup.nsh
мой диск NVMe переназначается fs0:
, но когда я вместо этого запускаю команды в интерактивном режиме, он сопоставляется fs1:
. Я не знаю, почему или как это происходит).
Когда я загружаюсь и запускаю оболочку, startup.nsh
я получаю такой вывод:
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> _
Поэтому, когда map -r
выполняется изнутри, startup.nsh
он запускается, но затем завершается неудачно с ошибкой «Не удается прочитать из файла - нет носителя», а затем прерывает выполнение остальной части сценария (так как нет echo Step 3
вывода), однако, если я вручную набираю fs0:\EFI\Boot\Bootx64.efi
Затем команда Windows загружается нормально.
Я посмотрел документацию по командам оболочки EFI и не вижу ни одной команды, такой как try
или on error resume next
или on error goto :label
- поэтому скрипт обречен на неудачу.
ИМХО, ваш подход слишком сложен. Вы используете встроенную в EFI CSM вашего компьютера для запуска второй реализации EFI с внешнего диска, а затем загружаете драйвер EFI во второй реализации EFI. Несколько альтернатив встречаются со мной:
Тем не менее, я не знаю ответа на ваш прямой вопрос. Это явно вызвано переназначением устройств при загрузке нового драйвера, который «вытаскивает коврик» из оболочки.
источник