Редактирование uefi из windows 7. Как делать не надо. Полезные функции UEFI

  • Tutorial

Я обещал "самое краткое руководство". Вот оно:

  1. Создаём на диске таблицу разделов GPT
  2. Создаём FAT32-раздел на пару сотен мегабайт
  3. Скачиваем из интернета любой UEFI-загрузчик
    (нам нужен сам загрузчик, это один бинарный файл!)
  4. Переименовываем и кладем этот файл на созданный раздел по адресу /EFI/Boot/bootx64.efi
  5. Создаём текстовый конфиг, кладем его там, где загрузчик ожидает его увидеть
    (настройка и местоположение конфига зависят от конкретной реализации загрузчика, эта информация доступна в интернете)
  6. После перезагрузки видим меню загрузчика
    (Если на диске установлена Windows 8 или 10 - с большой вероятностью это руководство сокращается до пунктов 3 - 5.)

TL;DR не надо прописывать путь к загрузчику в новых загрузочных записях UEFI - надо файл загрузчика расположить по стандартному "пути по-умолчанию", где UEFI его найдет, и вместо загрузочного меню UEFI пользоваться меню загрузчика, которое гораздо проще и безопаснее настраивается

Как делать не надо

Есть, на самом-то деле, несколько способов настроить UEFI-загрузку. Я начну с описания других вариантов - чтобы было понятно, как (и почему) делать не надо . Если вы пришли за руководством - мотайте в самый низ.

Не надо лезть в NVRAM и трогать efivars

Наиболее "популярная" процедура установки загрузчика в систему такова: установщик ОС создаёт специальный раздел, на нём - структуру каталогов и размещает файлы загрузчика. После этого он с помощью особой утилиты (efibootmgr в linux, bcdedit в windows) взаимодействует с прошивкой UEFI-чипа, добавляя в неё загрузочную запись. В этой записи указывается путь к файлу загрузчика (начиная от корня файловой системы) и при необходимости - параметры. После этого в загрузочном меню компьютера появляется опция загрузки ОС. Для linux существует возможность вообще обойтись без загрузчика. В загрузочной записи указывается путь сразу к ядру вместе со всеми параметрами. Ядро должно быть скомпилировано с опцией EFISTUB (что давно является стандартом для большинства дистрибутивов), в этом случае оно содержит в себе заголовок "исполняемого файла EFI", позволяющий прошивке его запускать без внешнего загрузчика.


При старте системы, когда пользователь выбирает нужную ему загрузочную запись, прошивка UEFI сперва ищет на прописанном в этой записи диске особый EFI-раздел, обращается к файловой системе на этом разделе (обязательно FAT или FAT32), и запускает загрузчик. Загрузчик считывает из файла настроек свой конфиг, и либо грузит ОС, либо предоставляет загрузочное меню. Ничего не замечаете? Да, у нас два загрузочных меню - одно на уровне прошивки чипа UEFI, другое - на уровне загрузчика. В реальности о существовании второго пользователи могут даже не догадываться - если в меню всего один пункт, загрузчик Windows начинает его грузить без лишних вопросов. Увидеть экран с этим меню можно, если поставить вторую копию Windows или просто криво её переустановить.


Обычно для управления загрузочными записями руководства в интернете предлагают взаимодействовать с прошивкой UEFI. Есть аж пять основных вариантов, как это можно сделать: efibootmgr под linux, bcdedit в windows, какая-то софтина на "Маках", команда bcfg утилиты uefi shell (запускается из-под UEFI, "на голом железе" и без ОС, поскольку скомпилирована в том самом особом формате) и для особо качественных прошивок - графическими средствами UEFI (говоря популярным языком, "в настройках BIOS").


За всеми вышенаписанными "многобуков" вы могли легко упустить такую мысль: пользователь, чтобы изменить настройки программной части (например, добавить параметр запуска ОС), вынужден перезаписывать flash-память микросхемы на плате. Есть ли тут подводные камни? О да! Windows иногда способна сделать из ноутбука кирпич , linux тоже , причём разными способами . Качество прошивок часто оставляет желать лучшего - стандарты UEFI либо реализованы криво, либо не реализованы вообще. По логике, прошивка обязана переживать полное удаление всех переменных efivars без последствий, не хранить в них критичных для себя данных и самостоятельно восстанавливать значения по-умолчанию - просто потому что пользователь имеет к ним доступ, и вероятность их полного удаления далека от нуля. Я лично в процессе экспериментов неоднократно (к счастью, обратимо) "кирпичил" свой Lenovo - из загрузочного меню исчезали все пункты, включая опцию "зайти в настройки".


Работа с загрузочными записями UEFI - тоже не сахар. К примеру, утилита efibootmgr не имеет опции "редактировать существующую запись". Если ты хочешь немного изменить параметр ядра - ты удаляешь запись целиком и добавляешь её снова, уже измененную. При этом строка содержит в себе двойные и одинарные кавычки, а также прямые и обратные слеши в не особо очевидном порядке. Когда я наконец заставил эту магию работать - я сохранил её в виде bash-скриптов, которые до сих пор валяются у меня в корневой ФС:


efibootmgr -c -L "Archlinux (debug)" -l "\EFI\archlinux\vmlinuz-linux" -u "root=/dev/mapper/vg1-lvroot rw initrd=\EFI\archlinux\initramfs-linux.img systemd.log_level=debug systemd.log_target=kmsg log_buf_len=1M enforcing=0"

Не надо использовать GRUB

Это чёртов мастодонт, 90% функциональности которого предназначено для дисков с MBR. Для настройки необходимо отредактировать ряд файлов, после чего выполнить команду генерации конфига. На выходе получается огромная малопонятная нормальному человеку простыня. В составе - гора исполняемых файлов. Ставится командой, которую просто так из головы не возьмешь - надо обязательно лезть в документацию


grub-install --target=x86_64-efi --efi-directory=esp_mount --bootloader-id=grub

Для сравнения - самый простенький UEFI-bootloader, который есть в составе пакета systemd, ставится командой


bootctl install --path=/boot

Эта команда делает ровно две вещи: копирует исполняемый файл загрузчика на EFI-раздел и добавляет свою загрузочную запись в прошивку. А конфиг для неё занимает ровно СЕМЬ строчек.

"Самое краткое руководство" - чуть более подробно

Загрузочное меню надо реализовывать на уровне загрузчика - править текстовые конфиги гораздо проще и безопасней.


Загрузочная запись нам не нужна - дело в том, что при выставлении в настройках BIOS загрузки с диска прошивка UEFI сначала ищет на нём EFI-раздел, а затем пытается исполнить файл по строго фиксированному адресу на этом разделе: /EFI/Boot/BOOTX64.EFI


Что такое "EFI-раздел"? В теории, он должен иметь особый тип "EFI System" (ef00). На практике, годится первый раздел на GPT-диске, отформатированный в FAT32 и имеющий достаточно места , чтобы разместить загрузчик и вспомогательные файлы (если есть).


Пункт 3: "Скачиваем из интернета любой UEFI-загрузчик" . Что это значит? Загрузчик - это просто исполняемый файл определенного формата, к которому в комплекте идет конфиг. К примеру, если у вас есть под рукой установленный пакет с systemd - файл загрузчика можно найти по адресу /usr/lib/systemd/boot/efi/systemd-bootx64.efi, переименовать его в bootx64.efi и скопировать в /EFI/Boot/ на EFI-разделе. Нет под рукой systemd? Скачайте архив с сайта Archlinux. Или с репозитария Ubuntu. Или Debian. Есть под рукой система с Windows? Возьмите виндовый загрузчик оттуда, тоже сгодится)) Если сумеете настроить, я честно говоря не пробовал.


Пункт 4: "Настроить конфиг" . Как и обычная программа, когда загрузчик запускается - он ожидает найти по определенным путям файлы конфигурации. Обычно эту информацию легко найти в интернете. Для загрузчика systemd-boot нам необходимо в корне EFI-раздела создать каталог "loader", а в нём файл "loader.conf" с тремя строчками (привожу свои):


default archlinux timeout 10 editor 1

Параметр editor отвечает за возможность отредактировать пункт загрузочного меню перед запуском.


Рядом с loader.conf необходимо создать каталог entries - один файл в нём будет отвечать за одну загрузочную запись в boot-меню. У меня там один файл arch.conf с таким содержанием:


title Arch Linux linux /efi/archlinux/vmlinuz-linux initrd /efi/archlinux/initramfs-linux.img options root=/dev/mapper/vg1-lvroot rw initrd=\EFI\archlinux\intel-ucode.img

Я не упомянул, но довольно очевидно - ядро и initramfs должны лежать в одной файловой системе с загрузчиком, то есть на EFI-разделе. Пути к ним в конфигах отсчитываются от корня этой ФС.

Другие загрузчики

systemd-boot очень простой и предоставляет спартанского вида чёрно-белое меню. Есть варианты красивей, если душа просит красоты.


rEFind - очень красивый загрузчик. можно тут в виде deb-пакета. Использую на своём ноуте. Умеет создавать загрузочное меню автоматически, без конфига - просто сканируя файлы.

bootloader Добавить метки

  • Системное программирование
    • Tutorial

    Прикрываясь полумифическими «безопасностью» и «защитой простого пользователя от буткитов» производители UEFI все сильнее закручивают гайки с каждым новым поколением своих продуктов. При этом поддержка предыдущих поколений быстро сходит на нет, и их пользователям ничего не остается, кроме как брать эту самую поддержку в свои руки. Конечно, при отсутствии исходного кода вносить какие-то изменения довольно сложно, но и без него можно сделать многое.
    В об UEFI я планировал описать различные полезные модификации, которые помогают преодолеть некоторые заложенные производителями ограничения, но тогда до них руки не дошли, зато теперь - самое время.
    В первой части этой статьи я опишу работу с написанным мной инструментом для модификации образов UEFI, а вторая будет посвящена самим модификациям.

    Вступление, отказ от ответственности

    Прошивка UEFI BIOS на современных платах, несмотря на наличие различных технологий вроде USB BIOS Flashback, Dual BIOS, Flash Recovery и т.п. - все равно лотерея. Прошивка же модифицированных образов - лотерея вдвойне.
    Именно поэтому я прошу до начала любых экспериментов с прошивкой сделать при помощи аппаратного SPI-программатора полный дамп содержимого микросхемы, иначе восстановление после неудачной прошивки (а она рано или поздно случится) будет долгим, дорогим и болезненным.
    SPI-программатор в данный момент может быть собран в домашних условиях из чего угодно, от пары резисторов и конденсаторов (SPIPGM) до Arduino или Raspberry Pi . Мой вариант дешевого и быстрого SPI-программатора описан . Любителям вытравить пару-тройку плат советую обратить внимание на этот проект , а почитателям устройств «все-в-одном» - на этот .
    Далее по тексту я полагаю, что у вас есть программатор, возможность восстановления после сбоя прошивки и готовность к экспериментам. Безумству храбрых, конечно, тоже можно петь песни, но не говорите потом, что я не предупреждал.
    Традиционно, все, что вы тут сейчас прочитаете, написано в образовательных целях, автор не несет ответственности за возможную порчу вашего оборудования, недополученную прибыль, потерю времени и веры в человечество, вы пользуетесь предоставленным софтом на свой страх и риск и так далее.

    UEFITool

    Устав от ограничений существующих утилит для работы с образами UEFI (ну и пораженный синдромом NIH в самое сердце), я написал кроссплатформенную утилиту с открытым исходным кодом - UEFITool .
    Это редактор образов UEFI, написан на C++\Qt, распространяется под лицензией BSD, готовые сборки выкладываются сюда .
    Проект находится в активной разработке, поэтому код не блещет красотой и баги нет-нет, да попадаются. Если вдруг наткнетесь - буду рад репортам.
    Для нормальной работы с утилитой стоит прочитать предыдущие статьи о структуре образа UEFI, иначе непонятно будет, что вообще происходит, но я постараюсь все же пояснить некоторые моменты. Будем считать, что это заготовка для будущей документации.
    В качестве примеров в обеих частях статьи я буду использовать полные дампы с Zotac Z77-ITX WiFi (AMI Aptio4) и Dell Vostro 3360 (Phoenix SCT 2.3). К сожалению, у меня нет тестового стенда на платформе Insyde H2O, поэтому рассказать о ней мне нечего. Возможно, Falseclock знает о них немного больше.
    С точки зрения UEFITool"а разницы между образами UEFI разных производителей практически нет, поэтому я остановлюсь на ней при описании патчей.
    Итак, запускаем UEFITool, открываем образ (Ctrl+O) и видим примерно такое:

    В левой части окна отображается структура открытого образа в виде дерева, справа - информация о выбранном элементе дерева, снизу - сообщения, указывающие на ошибки в формате файла, в данном случае - использование разработчиками Phoenix секций с типом 0xF0, назначение которых не описано в спецификации UEFI PI . Двойной щелчок по сообщению раскроет дерево так, чтобы был виден либо на сам элемент, который это сообщение вызвал, либо его родительский элемент. В это же окно выводятся результаты поиска, который можно вызвать нажатием Ctrl+F (оба варианта одной картинкой):


    Здесь следует немного пояснить терминологию. Практически все структурные элементы в образе UEFI имеют заголовок, в котором хранятся служебные данные вроде GUID, атрибутов, контрольных сумм и т.п., и тело - в нем хранятся собственно данные. Текст же в заголовках не хранится, поэтому для него такой выбор не нужен.
    На первом уровне дерева находятся Flash-регионы, в данном случае это Descriptor, ME и BIOS:


    При выборе региона Descriptor можно узнать настройки доступа к регионам, в данном случае доступ полный, но такие настройки встречаются очень редко. Intel рекомендует производителям оборудования закрывать доступ к региону МЕ на чтение/запись и региону Descriptor на запись, именно поэтому на большинстве плат встроенными средствами полный дамп снять без «танцев с бубном» практически невозможно. При выборе региона ME можно узнать версию ME firmware, если же она не отображается - это не к добру и такой образ лучше не шить.
    Перейдем еще на уровень ниже, к содержимому региона BIOS:


    На этом уровне могут встречаться два типа элементов: тома и свободное место. Свободное в данном случае - не обязательно пустое, к примеру, в этом образе в самом начале Padding"а хранится прошивка EC .
    Тома делятся на обыкновенные (формат файловой системы известен), загрузочные (формат ФС известен, содержат Security Core, изменять стоит с особой осторожностью) и неизвестные (либо неизвестен формат ФС, либо разбор еще не реализован). В нашем случае первый том после свободного пространства в начале - обычный, затем два неизвестных (на самом деле, в первом хранится NVRAM, а во втором - ключи и БД для SecureBoot, но программе я это пока еще не объяснил), последний том является загрузочным.
    Откроем теперь обычный том, в данном случае в нем хранятся файлы, загружаемые в фазе DXE.


    Такая структура (основной том внутри сжатой секции) используется довольно часто, она позволяет сэкономить приличное количество места в микросхеме. Есть еще вариант сжимать не весь том целиком, а каждый файл по отдельности - это несколько менее экономно в плане места, зато стартует такой UEFI BIOS быстрее, т.к. нет смысла распаковывать файлы, к которым не было обращений.
    Теперь заглянем внутрь файла:


    Все данные в нем хранятся внутри GUID-defined-секции (в заголовке таких секций обычно хранится ЭЦП или контрольная сумма, в данном случае - 4 байта, похожие на КС, которую, однако, никто не проверяет), и делятся на 4 секции: образ PE32 - собственно исполняемый файл в формате PE/COFF, секция зависимостей DXE - определяет порядок загрузки DXE-драйверов, секция UI - в ней хранится текст «SystemCapsuleRt.efi» в формате Unicode и неизвестная секция типа 0xF0 (скорее всего, её содержимое каким-то образом связано с вышеупомянутой КС).
    Все это хорошо, конечно, но редактирования пока не видно. Не беда, вызываем для любого элемента контекстное меню, в котором видно, что с этим элементом можно сделать.


    А сделать можно следующее:

    • сохранить элемент в файл либо целиком (Extract as is), либо только данные, без заголовков (Extract body)
    • пересобрать элемент (Rebuild), в этом случае при сохранении измененного образа для него (и всех его родительских элементов) будут пересчитаны размеры, контрольные суммы, исправлено выравнивание, т.е. структура образа будет приведена в соответствие со спецификацией UEFI PI
    • вставить элемент из файла, либо перед выбранным (Insert before), либо после (Insert after), либо внутрь него (Insert into, в данном случае внутрь PE32-секции ничего вставить не получится)
    • заменить элемент на другой элемент из файла, либо целиком (Replace as is), либо только его тело (Replace body)
    Последнее действие является наиболее полезным, т.к. позволяет произвести модификацию какой-либо части UEFI, не затрагивая при этом структуры всего образа.

    Пример использования

    Рассмотрим в качестве примера полезную для пользователей MacOS X на ПК модификацию: обход установки бита LOCK (0x0F) в регистре MSR_PMG_CST_CONFIG_CONTROL (0xE2). Бит этот устанавливается DXE-драйвером PowerManagement, чтобы ОС не могла управлять множителем CPU путем записи в этот регистр. Для Windows и Linux это не большая проблема, а вот MacOS X не может стерпеть от UEFI такой наглости. Можно, конечно, пропатчить драйвер AICPM.kext (в 10.8) или ядро (в 10.9), но лучше пропатчить DXE-драйвер и не бояться, что очередное автоматическое обновление сломает загрузку. Патч этот нужен только системам на базе процессоров Intel SandyBridge, IvyBridge и Haswell и их *-E вариантов и делается так:


    Прошиваем полученный образ тем же SPI-программатором, которым он был сделан, и получаем отсутствие паники ядра при загрузке MacOS X.

    Подробности, другие модификации, заключение

    Если вам интересно, откуда взялся магический паттерн «75080FBAE80F» и на какие еще патчи стоит обратить внимание - читайте вторую часть этой статьи, которая будет опубликована немного позже. В ней я постараюсь подготовить побольше примеров в формате «что за модификация, зачем нужна, как сделать, кем и как была найдена», не углубляясь каждый раз в то, как именно вынуть подлежащий модификации элемент и как вставить его обратно.
    Надеюсь, что статья не показалась слишком скучной и нудной. Если у вас есть вопросы и предложения - буду рад выслушать и ответить по мере сил. Баг-репортам буду рад еще больше. Спасибо заранее и удачных прошивок.

    P.S. Уважаемая администрация и лично НЛО, сделайте для таких вот постов хаб UEFI, пожалуйста.

    • Tutorial

    Прикрываясь полумифическими «безопасностью» и «защитой простого пользователя от буткитов» производители UEFI все сильнее закручивают гайки с каждым новым поколением своих продуктов. При этом поддержка предыдущих поколений быстро сходит на нет, и их пользователям ничего не остается, кроме как брать эту самую поддержку в свои руки. Конечно, при отсутствии исходного кода вносить какие-то изменения довольно сложно, но и без него можно сделать многое.
    В своих предыдущих об UEFI я планировал описать различные полезные модификации, которые помогают преодолеть некоторые заложенные производителями ограничения, но тогда до них руки не дошли, зато теперь - самое время.
    В первой части этой статьи я опишу работу с написанным мной инструментом для модификации образов UEFI, а вторая будет посвящена самим модификациям.

    Вступление, отказ от ответственности

    Прошивка UEFI BIOS на современных платах, несмотря на наличие различных технологий вроде USB BIOS Flashback, Dual BIOS, Flash Recovery и т.п. - все равно лотерея. Прошивка же модифицированных образов - лотерея вдвойне.
    Именно поэтому я прошу до начала любых экспериментов с прошивкой сделать при помощи аппаратного SPI-программатора полный дамп содержимого микросхемы, иначе восстановление после неудачной прошивки (а она рано или поздно случится) будет долгим, дорогим и болезненным.
    SPI-программатор в данный момент может быть собран в домашних условиях из чего угодно, от пары резисторов и конденсаторов (SPIPGM) до Arduino или Raspberry Pi . Мой вариант дешевого и быстрого SPI-программатора описан . Любителям вытравить пару-тройку плат советую обратить внимание на этот проект , а почитателям устройств «все-в-одном» - на этот .
    Далее по тексту я полагаю, что у вас есть программатор, возможность восстановления после сбоя прошивки и готовность к экспериментам. Безумству храбрых, конечно, тоже можно петь песни, но не говорите потом, что я не предупреждал.
    Традиционно, все, что вы тут сейчас прочитаете, написано в образовательных целях, автор не несет ответственности за возможную порчу вашего оборудования, недополученную прибыль, потерю времени и веры в человечество, вы пользуетесь предоставленным софтом на свой страх и риск и так далее.

    UEFITool

    Устав от ограничений существующих утилит для работы с образами UEFI (ну и пораженный синдромом NIH в самое сердце), я написал кроссплатформенную утилиту с открытым исходным кодом - UEFITool .
    Это редактор образов UEFI, написан на C++\Qt, распространяется под лицензией BSD, готовые сборки выкладываются сюда .
    Проект находится в активной разработке, поэтому код не блещет красотой и баги нет-нет, да попадаются. Если вдруг наткнетесь - буду рад репортам.
    Для нормальной работы с утилитой стоит прочитать предыдущие статьи о структуре образа UEFI, иначе непонятно будет, что вообще происходит, но я постараюсь все же пояснить некоторые моменты. Будем считать, что это заготовка для будущей документации.
    В качестве примеров в обеих частях статьи я буду использовать полные дампы с Zotac Z77-ITX WiFi (AMI Aptio4) и Dell Vostro 3360 (Phoenix SCT 2.3). К сожалению, у меня нет тестового стенда на платформе Insyde H2O, поэтому рассказать о ней мне нечего. Возможно, знает о них немного больше.
    С точки зрения UEFITool"а разницы между образами UEFI разных производителей практически нет, поэтому я остановлюсь на ней при описании патчей.
    Итак, запускаем UEFITool, открываем образ (Ctrl+O) и видим примерно такое:

    В левой части окна отображается структура открытого образа в виде дерева, справа - информация о выбранном элементе дерева, снизу - сообщения, указывающие на ошибки в формате файла, в данном случае - использование разработчиками Phoenix секций с типом 0xF0, назначение которых не описано в спецификации UEFI PI . Двойной щелчок по сообщению раскроет дерево так, чтобы был виден либо на сам элемент, который это сообщение вызвал, либо его родительский элемент. В это же окно выводятся результаты поиска, который можно вызвать нажатием Ctrl+F (оба варианта одной картинкой):


    Здесь следует немного пояснить терминологию. Практически все структурные элементы в образе UEFI имеют заголовок, в котором хранятся служебные данные вроде GUID, атрибутов, контрольных сумм и т.п., и тело - в нем хранятся собственно данные. Текст же в заголовках не хранится, поэтому для него такой выбор не нужен.
    На первом уровне дерева находятся Flash-регионы, в данном случае это Descriptor, ME и BIOS:


    При выборе региона Descriptor можно узнать настройки доступа к регионам, в данном случае доступ полный, но такие настройки встречаются очень редко. Intel рекомендует производителям оборудования закрывать доступ к региону МЕ на чтение/запись и региону Descriptor на запись, именно поэтому на большинстве плат встроенными средствами полный дамп снять без «танцев с бубном» практически невозможно. При выборе региона ME можно узнать версию ME firmware, если же она не отображается - это не к добру и такой образ лучше не шить.
    Перейдем еще на уровень ниже, к содержимому региона BIOS:


    На этом уровне могут встречаться два типа элементов: тома и свободное место. Свободное в данном случае - не обязательно пустое, к примеру, в этом образе в самом начале Padding"а хранится прошивка EC .
    Тома делятся на обыкновенные (формат файловой системы известен), загрузочные (формат ФС известен, содержат Security Core, изменять стоит с особой осторожностью) и неизвестные (либо неизвестен формат ФС, либо разбор еще не реализован). В нашем случае первый том после свободного пространства в начале - обычный, затем два неизвестных (на самом деле, в первом хранится NVRAM, а во втором - ключи и БД для SecureBoot, но программе я это пока еще не объяснил), последний том является загрузочным.
    Откроем теперь обычный том, в данном случае в нем хранятся файлы, загружаемые в фазе DXE.


    Такая структура (основной том внутри сжатой секции) используется довольно часто, она позволяет сэкономить приличное количество места в микросхеме. Есть еще вариант сжимать не весь том целиком, а каждый файл по отдельности - это несколько менее экономно в плане места, зато стартует такой UEFI BIOS быстрее, т.к. нет смысла распаковывать файлы, к которым не было обращений.
    Теперь заглянем внутрь файла:


    Все данные в нем хранятся внутри GUID-defined-секции (в заголовке таких секций обычно хранится ЭЦП или контрольная сумма, в данном случае - 4 байта, похожие на КС, которую, однако, никто не проверяет), и делятся на 4 секции: образ PE32 - собственно исполняемый файл в формате PE/COFF, секция зависимостей DXE - определяет порядок загрузки DXE-драйверов, секция UI - в ней хранится текст «SystemCapsuleRt.efi» в формате Unicode и неизвестная секция типа 0xF0 (скорее всего, её содержимое каким-то образом связано с вышеупомянутой КС).
    Все это хорошо, конечно, но редактирования пока не видно. Не беда, вызываем для любого элемента контекстное меню, в котором видно, что с этим элементом можно сделать.


    А сделать можно следующее:

    • сохранить элемент в файл либо целиком (Extract as is), либо только данные, без заголовков (Extract body)
    • пересобрать элемент (Rebuild), в этом случае при сохранении измененного образа для него (и всех его родительских элементов) будут пересчитаны размеры, контрольные суммы, исправлено выравнивание, т.е. структура образа будет приведена в соответствие со спецификацией UEFI PI
    • вставить элемент из файла, либо перед выбранным (Insert before), либо после (Insert after), либо внутрь него (Insert into, в данном случае внутрь PE32-секции ничего вставить не получится)
    • заменить элемент на другой элемент из файла, либо целиком (Replace as is), либо только его тело (Replace body)
    Последнее действие является наиболее полезным, т.к. позволяет произвести модификацию какой-либо части UEFI, не затрагивая при этом структуры всего образа.

    Пример использования

    Рассмотрим в качестве примера полезную для пользователей MacOS X на ПК модификацию: обход установки бита LOCK (0x0F) в регистре MSR_PMG_CST_CONFIG_CONTROL (0xE2). Бит этот устанавливается DXE-драйвером PowerManagement, чтобы ОС не могла управлять множителем CPU путем записи в этот регистр. Для Windows и Linux это не большая проблема, а вот MacOS X не может стерпеть от UEFI такой наглости. Можно, конечно, пропатчить драйвер AICPM.kext (в 10.8) или ядро (в 10.9), но лучше пропатчить DXE-драйвер и не бояться, что очередное автоматическое обновление сломает загрузку. Патч этот нужен только системам на базе процессоров Intel SandyBridge, IvyBridge и Haswell и их *-E вариантов и делается так:


    Прошиваем полученный образ тем же SPI-программатором, которым он был сделан, и получаем отсутствие паники ядра при загрузке MacOS X.

    Подробности, другие модификации, заключение

    Если вам интересно, откуда взялся магический паттерн «75080FBAE80F» и на какие еще патчи стоит обратить внимание - читайте вторую часть этой статьи, которая будет опубликована немного позже. В ней я постараюсь подготовить побольше примеров в формате «что за модификация, зачем нужна, как сделать, кем и как была найдена», не углубляясь каждый раз в то, как именно вынуть подлежащий модификации элемент и как вставить его обратно.
    Надеюсь, что статья не показалась слишком скучной и нудной. Если у вас есть вопросы и предложения - буду рад выслушать и ответить по мере сил. Баг-репортам буду рад еще больше. Спасибо заранее и удачных прошивок.

    P.S. Уважаемая администрация и лично НЛО, сделайте для таких вот постов хаб UEFI, пожалуйста.

    Интерфейс между операционной системой и микропрограммами, управляющими низкоуровневыми функциями оборудования, его основное предназначение: корректно инициализировать оборудование при включении системы и передать управление загрузчику операционной системы. EFI предназначен для замены BIOS - интерфейса, который традиционно используется всеми IBM PC-совместимыми персональными компьютерами

    Что это значит? Значит что способ описанный в Установка Ubuntu может не сработать. Кроме того, большие диски требуют использования GPT (вместо старой версии таблицы разделов в MBR, которая имеет ограничение адресуемого на диске пространства в 2,2 ТБ = 2,2 × 10¹² байт)

    Не возможно гарантировать универсальность приведенной ниже инструкции, но автор этой статьи прочитал несколько русско- и англоязычных тем форумов и на вторые сутки смог установить ubuntu 12.04.1 на Lenovo B570. Есть надежда, что эта статья поможет и вам.

    Поскольку EFI представляет собой специфический загрузчик, то он должен где то храниться, в нашем случае для него выделено отдельное место на жёстком диске с GPT таблицей разделов. Когда компьютер проходит процедуру POST, BIOS обнаруживает на подключённом носителе EFI раздел с установленным загрузчиком. Как следствие в самом BIOS в меню BOOT(У вас может называться по другому, там находиться порядок загрузки устройств) на ровне с устройствами появятся и дистрибутивы.

    how to install

    A. В начале нам понадобиться LiveCD(почему именно LiveCD? Смотри ниже) установочный образ, how to написано тут получение_ubuntu . Если у вас уже есть установочный диск/флешка, вам ниже.

    B. Загружаемся, всё как при обычной установке → загрузка_с_livecd . Затем, если у кого то всё нормально и графический режим с выбором языка работает, то хорошо, у некоторых может появиться незнамо что (экран в пикселях, видно как ленточка выбора перемещается для выбора варианта загрузки)

    P.S. //Лично у меня при загрузке с текстового alternative образа, всё время было такое, даже во время попытки установки//

    Порядок надписей следующий:

    Попробовать без установки Установить Проверить диск на наличие ошибок

    Как следствие выбираем первую и загружаемся в графическом режиме.

    C. Открываем центр приложений, ищем grub-pc удаляем, ищем grub-efi под нужную разрядность (64 или 32) ставим его.
    UPD. можно оставить только grub-common остальные грабы он сам во время установки догрузит (у меня на всех работало (12.04-12.10 альфа 3),12.10 бета 1 «невозможно установить загрузчик….»)\\ Вариант не нужен и может даже навредить установке на 12.04.1 и 12.10 бета 2 и старше.

    E. запускаем саму установку , выбираем «другой вариант» и вручную размечаем диск «разметка_диска ». Так всё по плану:

    Первый раздел "тык" - загрузочный раздел efi - если у вас всёго одна система 100 МиБ достаточно. Второй ext4, форматировать, точка монтирования "/". -Системный создаём угодных нам размеров. Третий linux-swap (раздел подкачки) ~ RAM + несколько МиБ Четвёртый, ФС какую пожелаете (у меня ext4), точка монтирования "/home"

    Отлично, фарс почти закончился, в самом низу выбирается путь установки загрузчика (там должно быть что то вроде /dev/sda/

    выбрать первый раздел с efi, т.е. в моём случае /dev/sda1/

    Устанавливаем, по окончанию перезагружаем, заходим в BIOS, там boot menu. Должны были появиться новые пункты «Linux» «Ubuntu», первым можно поставить Ubuntu

    Управление списком загрузки

    Способ подходит как для редактирования из установленной системы, так и с LiveCD Нам понадобиться следующая консольная утилита bootmgr.

    Sudo apt-get install efibootmgr

    bootmgr - это пользовательское приложение для редактирования Intel Extensible Firmware Interface (EFI) Boot Manager. Оно позволяет добавлять, изменять и удалять опции загрузки.
    После установки открываем терминал и вбиваем туда:

    Sudo efibootmgr

    Вот что оно вам выдаст.(С моими комментариями)

    BootCurrent: 000A #текущая загруженная запись Timeout: 1 seconds #пауза для показа меню выбора, прежде чем будет произведена загрузка по порядку BootOrder: 000A,0002,0009,000B,0003,0004,0005,0006,0007,0008 #текущая очередь загрузки Boot0000 Setup #вкладка перехода в BIOS не трогаем Boot0001 Boot Menu #Меню выбора, тоже не трогаем. BootXXXX это разделы Boot0002* USB FDD: #нас интересуют именно цифры т.е. 0003 и т.д. Boot0003* ATA SSD: Boot0004* ATA HDD: WDC WD5000BPVT-24HXZT3 Boot0005* ATAPI CD: TSSTcorp CDDVDW TS-L633F Boot0006* USB HDD: Kingston DT 101 G2 Boot0007* USB CD: Boot0008* PCI LAN: Realtek PXE B03 D00 Boot0009* Windows Boot Manager Boot000A* Ubuntu Boot000B* Linux

    Как видно из этого у меня 2 ненужных записи(Windows, Linux), заглянем в официальную инструкцию .
    хм.. я ничего не понял, но поковырявшись ещё немного вот что получилось: Чтобы удалить какую-либо запись нужно ввести команду вида:

    Sudo efibootmgr --bootnum xxxx --delete-bootnum

    Удаляем запись Windows Boot Manager

    Где xxxx Это hex номер загрузочной записи, его можно сокращать, вот например в моём случае для удаления Windows нужно ввести:

    Sudo efibootmgr --bootnum 9 --delete-bootnum

    Сразу после этого консоль отрапортует результат:

    BootNext: 0009 BootCurrent: 000A Timeout: 1 seconds BootOrder: 000A,0002,000B,0003,0004,0005,0006,0007,0008 Boot0000 Setup Boot0001 Boot Menu Boot0002* USB FDD: Boot0003* ATA SSD: Boot0004* ATA HDD: WDC WD5000BPVT-24HXZT3 Boot0005* ATAPI CD: TSSTcorp CDDVDW TS-L633F Boot0006* USB HDD: Kingston DT 101 G2 Boot0007* USB CD: Boot0008* PCI LAN: Realtek PXE B03 D00 Boot000A* Ubuntu Boot000B* Linux

    Удаляем запись Linux

    Теперь удаляем запись Linux

    Sudo efibootmgr --bootnum B --delete-bootnum

    После перезагрузки получим вот такую красоту:

    BootCurrent: 0009 Timeout: 1 seconds BootOrder: 0009,0004,0005,0008,0002,0003,0006,0007 Boot0000 Setup Boot0001 Boot Menu Boot0002* USB FDD: Boot0003* ATA SSD: Boot0004* ATA HDD: WDC WD5000BPVT-24HXZT3 Boot0005* ATAPI CD: TSSTcorp CDDVDW TS-L633F Boot0006* USB HDD: Boot0007* USB CD: Boot0008* PCI LAN: Realtek PXE B03 D00 Boot0009* ubuntu

    Редактируем паузу

    Если необходимо отредактировать паузу то делаем следующее:

    Sudo efibootmgr -t 5

    в выводе:

    BootNext: 0009 BootCurrent: 000A Timeout: 5 seconds #как видно значение изменилось BootOrder: 000A,0002,000B,0003,0004,0005,0006,0007,0008 Boot0000 Setup Boot0001 Boot Menu Boot0002* USB FDD: Boot0003* ATA SSD: Boot0004* ATA HDD: WDC WD5000BPVT-24HXZT3 Boot0005* ATAPI CD: TSSTcorp CDDVDW TS-L633F Boot0006* USB HDD: Kingston DT 101 G2 Boot0007* USB CD: Boot0008* PCI LAN: Realtek PXE B03 D00 Boot0009* ubuntu

    Эта статья не окончена. Пожалуйста, если вы располагаете соответствующими знаниями и небольшим количеством свободного времени, попробуйте улучшить эту статью. * grub-efi должен инсталлироваться автоматически но с ним могут быть глюки и 12.10 бету 1, я вообще не смог установить (она не могла поставить загрузчик), потому вообще лучше его устанавливать через центр приложений ручками *