EFI не использует загрузочный сектор диска. Таким образом, я подозреваю, что вы неправильно понимаете, что происходит с вашей системой. Я предполагаю , что вы на самом деле повреждаете записи NVRAM, которые содержат порядок загрузки устройства. Самый простой способ решить эту проблему - не использовать эти записи, а вместо этого назвать свой загрузчик EFI/BOOT/bootx64.efi
(или, в более общем случае, boot{arch}.efi
, где {arch}
- это код архитектуры; x64
- это код архитектуры для x86-64). Если вы по какой-либо причине не хотите этого делать, и если ваша оболочка EFI является оболочкой версии 2 , вы можете использовать команду bcfg
в сценарии оболочки EFI для выполнения этой работы. Эта команда документирована в разной степени в разных местах, таких как Arch Linux wiki и сайт Intel. К сожалению, более старая EFI-оболочка версии 1 не поддерживает команду bcfg
, поэтому эта опция не будет работать с ней, хотя может быть возможно извлечь соответствующий код из исходного кода TianoCore и создать отдельную команду bcfg
которую вы могли бы использовать. использовать со старой оболочкой.
Если вам действительно необходимо записать в MBR, то написание приложения EFI на C может быть лучшим выбором, чем попытка сделать это в оболочке EFI. Существует много документации по программированию EFI, но в большинстве своем она похожа на справочные страницы по Unix - предполагается, что вы уже знаете тему и просто должны проверить детали. Я написал краткое введение в учебное пособие, но оно очень простое и не охватывает дисковый ввод-вывод. (Вы можете использовать это и исходный код для gptsync
, который включен в последние пару версий rEFInd , чтобы узнать, как читать и записывать MBR диска.)
Если я правильно понимаю, что бы вы ни делали (кроме случаев, когда достаточно использовать запасное имя файла), вам нужно будет вписать его в обычную последовательность загрузки. Это было бы возможно либо с помощью программы оболочки EFI, запущенной по умолчанию, либо в виде двоичной программы; но вы должны быть уверены, что ваша пользовательская программа завершает работу, запуская "настоящий" загрузчик, или что "настоящий" загрузчик запускается после новой программы.