UEFI - установка модуля NVMe

Mar 13, 2020 16:48

UEFI таки крутая штука, как выяснилось. Умеет подгружать модули со своего специального раздела (если использовать GPT как таблицу разделов, то это будет FAT32 раздел с GUID "EFI System Partition") и использовать их в дальнейшем. Причем модули есть самые разнообразные - начиная с командной оболочки (UEFI Shell) и заканчивая драйверами файловых систем.
Ядра Linux, с некоторых пор, компилируются так что тоже считаются EFI-приложением, и их можно запускать напрямую, без загрузчика. А если добавить драйвер Ext4, чтобы UEFI видела такие разделы, то обновление ядра не потребует никаких дополнительных телодвижений (по крайней мере в debian, где в корне файловой системы есть ссылки на акутальные initrd и vmlinuz)

Собственно, про драйверы тут и пойдет речь.
Чтобы загрузить UEFI-драйвер нам понадобятся:
1. UEFI Shell. На некоторых компьютерах она есть прям как часть BIOS, на некоторых - увы-увы. Если ее у вас нет, а хочется - то взять можно здесь:
проект TianoCore или проект Clover. Так же есть UEFI Shell, в котором утилита bcfg скомпилирована для версий UEFI ниже чем 2.3, можно взять здесь (ссылку я позаимствовал с вики Arch Linux, если протухнет - искать там).
2. Собственно, драйверы. Для файловых систем их можно скачать здесь и выбор там огромный, вплоть до поддержки всякой экзотики. Ссылка на GitHub разработчика тоже где-то там есть.
Драйвер для NVMe лежит в архиве с Clover, оттуда его и можно выцепить.

Далее, берем нужные элементы (в случае с Clover это \CloverV2\EFI\CLOVER\tools\ShellXX.efi, где разрядность выбираете в соответствии со своей необходимостью и CloverV2\EFI\CLOVER\drivers\off\UEFI\Other\NvmExpressDxe.efi для поддержи NVMe) и кладем их в папку EFI на разделе EFS.
В BIOS создаем загрузочную запись для UEFI Shell (как это выглядит зависит от конкретной версии UEFI BIOS) и загружаемся в нее.
После этого пытаемся загрузить драйвер:
load FS0:\EFI\NvmExpressDxe.efi
Тут есть два варианта.
Первый (нормальный): строчка в духе Module Load at %offset% Success.
Второй (я вот влетел в него): черный экран. В этом случае перезагружаемся и пишем load -nc FS0:\NvmExpressDxe.efi а затем connect . После этого команда map -r должна показать доступные диски, включая NVMe. Если показала - все отлично, добавляем драйвер в автозапуск.
Делается это командой bcfg driver add 0 FS0:\EFI\NvmExpressDxe.efi "NVMe External Driver"
Проверить можно командой bcfg driver dump, удалить - bcfg driver rm 0
Перезагружаемся, выполняем команду drivers и тут тоже возможно два случая.
Первый: в конце списка есть строка "NVMe External Driver", и все хорошо.
Второй (и я влетел в него): этой строки нет, и драйвер загружается только вручную, хоть что ты с ним делай. Я пытался и через efibootmgr это делать, и через разные версии bcfg (с разными версиями UEFI Shell) - пофиг.
Предполагаю что это какое-то ограничение в BIOS моего ноутбука, поскольку поиск по сети ничего релевантного не дал. Пришлось делать в стиле MS-DOS: у UEFI Shell есть замена autoexec.bat, называется startup.nsh. Создаем его там же, в папке EFI, и пишем все необходимые команды. Chainload в UEFI Shell реализован простым вызовом EFI-программы, в моем виндовом случае это FS0:\EFI\Boot\Bootefi64.efi
Вроде как в статье про автозагрузку драйверов UEFI есть небольшое дополнение про то что нужно HEX-едитором поменять один байт в настройке драйвера, чтоб тот загружался полностью автоматически, но я до этого так и не дошел - у меня он вообще никак не загружается. Подробности можете глянуть здесь, если заинтересовались.

IT-сфера, Шаманство

Previous post Next post
Up