• Системное программирование
    • 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, пожалуйста.

    Массовый переход на UEFI (Unified Extensible Firmware Interface) уже начался. Microsoft требует использовать этот интерфейс на всех компьютерах, которые будут поставляться с Windows 8. Точнее говоря, речь идет об UEFI с функцией Secure Boot. При этом без проблем работать на подобных ПК может только «восьмерка»: ни Windows XP, ни «семерку» не удастся установить на UEFI-машину без дополнительных манипуляций. С флеш-накопителя Linux Live или Windows загрузиться тоже не получится. Что именно может произойти, если попытаться запуститься с установочной флешки на ноутбуке Sony VAIO, показано на картинке вверху. И на этом проблемы с UEFI не заканчиваются. Каждый производитель аппаратных компонентов по своему усмотрению конфигурирует UEFI, тем самым создавая для пользователя ненужные трудности. Лэптоп IdeaPad от Lenovo и вовсе не смог распознать тот же самый флеш-накопитель в качестве загрузочного носителя. При этом Lenovo не в чем упрекнуть: дело в том, что загрузочная флешка отформатирована в файловой системе NTFS, а UEFI не поддерживает загрузку с таких носителей. Если подключить этот же накопитель к ноутбуку EliteBook от HP, то он загрузится без проблем и позволит выполнить установку Windows. Проблема же заключается в том, что все данные, имевшиеся на диске EliteBook, после установки оказались бы удаленными.

    Каждый конфигурирует по-своему

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

    Как работает UEFI

    UEFI загружается строго в соответствии с установленными правилами. Если ОС не поддерживает UEFI, активируется режим эмуляции BIOS. Процесс загрузки ПК на основе BIOS достаточно прост: после нажатия кнопки включения запускается BIOS, которая проверяет состояние оборудования и загружает микропрограммное обеспечение - простые драйверы для отдельных аппаратных компонентов. После этого BIOS выполняет поиск загрузчика ОС и активирует его. Тот в свою очередь загружает операционную систему или выводит на экран список доступных ОС.

    Компьютеры на базе UEFI загружаются аналогичным образом лишь до момента поиска параметров загрузки. После этого все происходит иначе. UEFI имеет собственный загрузчик ОС с интегрированными менеджерами запуска установленных систем. Для него на диске создается небольшой раздел (100–250 Мбайт), отформатированный в файловой системе FAT32, который называется Extensible Firmware Interface System Partition (системный раздел расширяемого микропрограммного интерфейса, ESP). На нем находятся драйверы аппаратных компонентов, к которым может получать доступ запущенная операционная система. Общее правило таково: за исключением DVD, UEFI может загружаться только с носителя, отформатированного в файловой системе FAT32.

    UEFI - сложный механизм

    У ESP есть свои преимущества: благодаря драйверам UEFI и загрузчику ОС, Windows запускается быстрее и более адекватно реагирует на критические ошибки драйверов. Но интерфейс UEFI накладывает и ограничения: он позволяет устанавливать ОС только на жесткие диски, которые размечены по стандарту GPT. Последний не поддерживается ни одной версией BIOS, так как, в отличие от традиционной схемы разметки (MBR), использует адреса секторов длиной 64 бита. Помимо Windows 8 интерфейс UEFI поддерживают только 64-битные версии Windows Vista и 7, а также Linux с ядром 3.2 и выше. Более того, для ПК, сертифицированных для работы с «восьмеркой», компания Microsoft предписывает использование опции Secure Boot. В этом режиме UEFI запускает лишь подтвержденные загрузчики ОС, которые содержат драйверы с цифровой подписью Microsoft.

    Наряду с Windows 8 только загрузчик Shim (Linux) обладает драйверами с необходимыми для Secure Boot подписями. В других ОС они отсутствуют. Поэтому, если вы захотите установить на подобном компьютере помимо «восьмерки» еще и Windows 7 или Vista, необходимо открыть меню UEFI и отключить Secure Boot. Если в качестве второй ОС вы выберете несовместимую с UEFI, вам потребуется задействовать модуль поддержки совместимости (Compatibility Support Module, CSM), который можно включить в UEFI. К сожалению, производители используют различные версии UEFI, и иногда сложно понять, как отключить Secure Boot и перейти в режим эмуляции BIOS. Эти вопросы мы и рассмотрим далее.

    Процесс загрузки ПК на основе UEFI

    В зависимости от конфигурации, UEFI либо самостоятельно загружает компьютер, либо переходит в режим эмуляции стандартной BIOS. Только после этого запускается менеджер загрузки Windows.

    Установка Windows на ПК с UEFI и функцией Secure Boot

    На ПК с Windows 8 на базе UEFI Secure Boot другие версии ОС можно инсталлировать только при определенных условиях. Пользователь должен заранее выбрать правильный режим загрузки и соответствующим образом подготовить установочный флеш-накопитель.


    Включение режима эмуляции BIOS

    Полная неразбериха: способ перехода в режим эмуляции BIOS зависит от версии UEFI. На Sony VAIO (1) необходимо активировать опцию «Legasy», на ASUS Zenbook (2) - «Launch CSM».


    Настройка UEFI

    Каждый производитель использует в ноутбуках и ультрабуках свою версию UEFI. При этом он открывает доступ не ко всем нужным функциям. Зачастую при загрузке ПК или лэптопа на дисплей не выводится название кнопки, с помощью которой можно вызвать меню настроек UEFI. Мы предлагаем поступить следующим образом: в интерфейсе Metro перейдите в меню «Параметры | Изменение параметров компьютера» на боковой панели и активируйте пункт «Общие | Особые варианты загрузки». После перезапуска появится менеджер загрузки ОС, который позволит открыть меню UEFI. Исключением является UEFI от HP, где данная опция отсутствует. Здесь поможет следующее: во время загрузки удерживайте нажатой клавишу «Esc». В любом случае необходимо вначале осведомиться, какая кнопка позволяет войти в меню UEFI. Если вы измените режим загрузки на CSM или Legasy BIOS, чтобы загрузиться с аварийной флешки, после операции восстановления необходимо вновь переключиться с CSM на UEFI, иначе Windows 8 не запустится. Но и здесь есть исключения: Aptio Setup Utility на компьютерах ASUS активирует UEFI автоматически при отсутствии совместимого с BIOS загрузочного носителя, поэтому достаточно просто отсоединить флешку.

    Отключение Secure Boot потребуется в том случае, если помимо «восьмерки» вы захотите установить 64-битную версию Windows Vista или 7. Иногда поддерживается так называемый гибридный режим, как в устройствах от HP, при котором UEFI может загружаться со всех загрузочных носителей и при необходимости переключаться в режим BIOS. В широко распространенной версии UEFI InsydeH2O это зависит от того, предусмотрел ли производитель ноутбука возможность отключения Secure Boot или нет. В Acer Aspire S7 данная функция недоступна, и для ее деактивации нужно переключиться с UEFI в режим BIOS и обратно.

    Сложности с восстановлением

    С появлением UEFI производители изменили методы работы с системой восстановления ОС. Сочетание клавиш «Alt+F10», которое использовалось ранее, например, в моделях Acer, больше не работает или закреплено за другими функциями. А кнопка «F9» загружает на новом Zenbook не ASUS Preload Wizard, а программу восстановления Windows 8 с расширенным меню загрузки.

    Режим восстановления VAIO Care в ноутбуках Sony можно открыть в аналогичном меню, выбрав опцию «Панель управления | Устранение неполадок | Восстановление». Но если запустить менеджер загрузки ОС и выбрать «Диагностика | Восстановить» или «Вернуть в исходное состояние», устройство попросит вставить оригинальный диск Windows 8, которого нет в комплекте поставки. На Acer-моделях бэкап выполняется с помощью предустановленной Windows-программы, а восстановление из резервной копии осуществляется с внешнего USB-носителя. Однако предварительно необходимо зайти в меню UEFI и указать такой диск в качестве загрузочного.

    Переход в меню UEFI из Windows

    Если активирована функция запуска Windows 8 с расширенными настройками, то, выбрав пункт «Диагностика» (1) и «Дополнительные параметры» (2), можно получить доступ к меню «Параметры встроенного ПО UEFI» (3).


    Полезные функции UEFI

    Каждый производитель ноутбуков использует разные версии интерфейса UEFI и реализует его в системе в соответствии со своими представлениями. Из таблицы, разбитой по моделям, вы узнаете, где находятся основные функции UEFI.


    Решение проблемы: отключение Secure Boot

    В некоторых случаях Secure Boot невозможно деактивировать напрямую. В Acer Aspire S7, например, данная функция недоступна. Но если переключиться в «Legasy BIOS» (1) и снова назад (2), Secure Boot будет отключена.


    В гибридном режиме возможно все

    В версии интерфейса UEFI от HP есть поддержка гибридного режима, в котором, в зависимости от загрузочного носителя, запускается один из двух режимов - либо UEFI, либо CSM. При этом функция Secure Boot отключается автоматически.


    Запуск с флешки

    Старые флеш-носители для аварийной загрузки и восстановления работают только в режиме BIOS. Мы сделаем их совместимыми с UEFI.

    USB-флешки в последнее время все чаще используются в качестве загрузочных носителей для восстановления или установки Windows. Это связано с тем, что в современных ноутбуках очень редко устанавливаются оптические приводы. Если вы изучили настройки UEFI в своем компьютере, рекомендуется также выполнить и апгрейд флеш-накопителей. С появлением UEFI все имеющиеся загрузочные флешки уже не получится использовать привычным образом. Например, если вы создали загрузочный USB-носитель в программе UNetbootin, вам необходимо будет запустить ПК в режиме CSM. То же самое относится ко всем старым флешкам, так как разработчики дистрибутивов Linux Live (например, GParted) только в последних, наиболее свежих версиях своих приложений начали добавлять загрузчик с поддержкой UEFI и функции Secure Boot.

    Наиболее простым является способ, при котором Secure Boot отключается в UEFI, затем с помощью бесплатной программы Rufus создается совместимый с UEFI флеш-накопитель, после чего на него копируется последняя версия GParted.

    Программа от Microsoft устарела

    В отношении загрузочных USB-носителей с операционной системой Windows действуют несколько иные правила. Для совместимости с UEFI они должны быть отформатированы в файловой системе FAT32. Многие пользователи даже для Windows 8 создают загрузочные накопители на флешках, отформатированных с помощью программы от Microsoft, входящей в состав «семерки». Однако данное приложение по умолчанию форматирует накопитель в файловой системе NTFS, в результате чего имеющуюся на носителе систему впоследствии невозможно установить на компьютер с UEFI. Чтобы не дожидаться выхода обновленной программы от Microsoft, можно создать загрузочный накопитель вручную. Для этого вначале отформатируйте USB-флешку с помощью бесплатной утилиты. Затем откройте в Windows 8 образ ISO и скопируйте содержащиеся в нем файлы на носитель.

    А вот чтобы совместимый с UEFI флеш-накопитель с 64-битной Windows 7 загружался без каких-либо проблем, вам потребуется скопировать UEFI-загрузчик в нужный каталог на флешке. Для этого, используя бесплатный архиватор 7-Zip, найдите в образе ISO, который содержит установочные файлы Windows 7, в папке Sources файл архива Install.wim и откройте его. После этого из директории 1\Windows\Boot\EFI скопируйте файл bootmgfw.efi. Затем сохраните его на флеш-накопителе в каталоге efi\boot и переименуйте, присвоив ему имя bootx64.efi. После этого с USB-носителем можно будет работать в режиме UEFI, и вы сумеете без проблем установить с него Windows 7.

    Создание загрузочных флешек на основе Live-систем

    Для совместимости с UEFI флешки должны быть отформатированы в FAT32. Например, программа UNetbootin (1) создает загрузочные накопители на основе дистрибутивов Linux Live, форматируя их в FAT. Однако утилита Rufus (2) предлагает более правильную опцию.


    Флеш-накопитель для восстановления ОС на ПК с UEFI

    Флеш-накопители на основе свежих Live-систем, такие как GParted, способны без проблем получать доступ к ПК с UEFI, так как встроенные в них инструменты - например, GPart (1) и TestDisk (2) - могут работать с GPT-разделами.


    Форматирование загрузочной флешки с Windows

    64-битную версию Windows 7 можно установить и на ПК с UEFI. Если вы хотите выполнить данную операцию с USB-накопителя, необходимо отформатировать его с помощью Windows-программы DiskPart в файловой системе FAT32 и сделать его загрузочным.


    Извлечение UEFI-загрузчика

    Совместимый с UEFI флеш-накопитель с Windows 7 дополнительно нуждается в загрузчике UEFI - bootmgfw.efi. Его необходимо вручную скопировать из архива install.wim на флешку, используя программу 7-Zip или любой другой архиватор.


    Источник

    • 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 Добавить метки

    Интерфейс между операционной системой и микропрограммами, управляющими низкоуровневыми функциями оборудования, его основное предназначение: корректно инициализировать оборудование при включении системы и передать управление загрузчику операционной системы. 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, я вообще не смог установить (она не могла поставить загрузчик), потому вообще лучше его устанавливать через центр приложений ручками *