Обработка ошибок в сценариях оболочки запуска EFI

1

Я использую компьютер Dell OptiPlex 9010, который поставляется с прошивкой UEFI, но не поддерживает загрузку с устройств PCI-Express NVMe.

Я обошел это, используя DUET для создания загрузочного раздела EFI на USB-накопителе, который имеет драйвер NVMe, который загружает, а затем выполняет загрузочную программу EFI моей операционной системы.

Команды для этого в настоящее время вводятся вручную. Вот процесс:

  1. Компьютер выключен.
  2. Вставьте USB-накопитель DUET в USB-порт (я всегда оставляю его подключенным)
  3. Включи компьютер
  4. (UEFI настроен так, чтобы всегда сначала загружаться с этой карты USB, и игнорировать загрузчики на других дисках, которые я подключил)
  5. USB-накопитель DUET загружает оболочку EFI ( EFI Shell version 2.31 [4.653])
  6. (Команда mapпоказывает, что USB-накопитель DUET автоматически устанавливается на fs0:)
  7. Я загружаю драйвер NVMe: load fs0:\EFI\Drivers\NvmExpressDxe-64.efi
  8. Я запускаю обновление сопоставлений томов map -r, эта команда успешно завершается без каких-либо проблем.
  9. (Мой том NVMe теперь указан, иногда как, fs1:а иногда и как fs0:)
  10. Я загружаюсь в Windows, запустив: fs1:\EFI\Boot\Bootx64.efi
  11. Появится экран запуска 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- поэтому скрипт обречен на неудачу.

Dai
источник

Ответы:

1

Я могу подтвердить, что map -rломает скрипт запуска.

Это происходит потому, что переназначение изменяет местоположение скрипта, а оболочка не может прочитать следующую команду для выполнения. Вы можете исправить это, изменив режим оболочки EFI, а затем используйте метод обновления отображения.

Короче, вместо того map -r, чтобы попробовать это:

connect -r
set -v efishellmode 1.1.2
map -u
Filip
источник
Спасибо - это сработало! (Извините, что
Дай
0

ИМХО, ваш подход слишком сложен. Вы используете встроенную в EFI CSM вашего компьютера для запуска второй реализации EFI с внешнего диска, а затем загружаете драйвер EFI во второй реализации EFI. Несколько альтернатив встречаются со мной:

  • Вы можете запустить оболочку EFI в собственном EFI вашего компьютера и запустить скрипт оттуда, чтобы загрузить драйвер EFI. Это исключает CSM и вторую реализацию EFI, что должно сократить время загрузки и повысить надежность. Тем не менее, этот вариант, скорее всего, вызовет ту же проблему, что и вы.
  • Вы можете запустить мой rEFInd в собственном EFI компьютера и настроить свой драйвер как тот, который автоматически загружает rEFInd. Большое предостережение заключается в том, что код загрузки драйверов rEFInd был хорошо протестирован для файловых систем, но не для других типов драйверов, поэтому я не могу обещать, что он загрузит ваш драйвер. Кроме того, даже если он загрузил ваш драйвер, вы можете столкнуться с проблемой, аналогичной той, с которой вы уже столкнулись.
  • Вы можете поместить свой загрузчик (-и) и, если необходимо, ядро ​​(-и) ОС на носитель, который может прочитать ваш собственный EFI, таким образом, обходя необходимость в драйвере NVMe. Поскольку вы уже используете USB-накопитель для DUET, вы можете использовать это; или, возможно, ваш компьютер поддерживает другие типы жестких дисков, поэтому вы можете использовать один из них, даже если это не ваш основной тип хранения. Поскольку я не эксперт по Windows, я не могу конкретно предложить, как выложить Windows для этого.

Тем не менее, я не знаю ответа на ваш прямой вопрос. Это явно вызвано переназначением устройств при загрузке нового драйвера, который «вытаскивает коврик» из оболочки.

Род Смит
источник