openSUSE:UEFI

Перейти к: навигация, поиск

UEFI

Определение стандарта

UEFI (Unified Extensible Firmware Interface) — это новый индустриальный стандарт, описывающий различные интерфейсы, которые система должна предоставлять до загрузки операционной системы. UEFI управляет системой с момента включения питания до окончания загрузки операционной системы. Кроме того, UEFI отвечает за интерфейс между аппаратными ресурсами и операционной системой.

Другими словами, UEFI является заменой и расширением традиционной BIOS.

UEFI не так молод. Intel начала разработку EFI / UEFI в середине 1990г., а крупные вендоры, такие как HP или Apple, уже довольно давно выпускают машины с EFI. Ситуация изменилась кардинально с анонсом Microsoft Windows 8, для которой UEFI стал необходим для загрузки на новых сертифицированных компьютерах.

Спецификация UEFI (http://www.uefi.org/specs/) это объёмный документ, который описывает все интерфейсы, переменные и структуры которые производители прошивок должны реализовать, и которые должны быть доступны операционной системе. Хорошая новость в том, что Linux может использовать EFI во время загрузки с 2000 года через GRUB или elilo. Фактически, openSUSE 12.2 уже поддерживает UEFI, а с версии openSUSE 12.3 появилась экспериментальная поддержка расширения Secure Boot.

Да, расширение. Secure boot является расширением UEFI. Одной из ключевых особенностей UEFI является её расширяемость. В UEFI есть внутренняя виртуальная машина, которая независима от используемой архитектуры процессора. Стандарт поддерживает специальные бинарные файлы, скомпилированные под эту виртуальную машину (EFI binaries), которые могут быть выполнены в этой среде. Эти двоичные файлы могут быть драйверами устройств, приложениями или расширениями стандарта UEFI. UEFI, в некотором смысле похожа на маленькую операционную систему, которая запускается когда включается питание компьютера и имеет главной задачей найти и загрузить другую операционную систему.

Как можно определить, поддерживает ли конкретный компьютер UEFI? Можно проверить конфигурационное меню прошивки материнской платы нажав DEL (или ESC, F1, ... в зависимости от модели) сразу после включения питания, во время POST. Обычно в меню можно найти пункты, включающие режим совместимости (egacy mode - для загрузки в режиме BIOS), режим EFI и гибридный режим. Выбор режима загрузки зависит от операционной системы, установленной на компьютере.

Если компьютер не имеет поддержки UEFI, но хочется протестировать эту технологию с openSUSE, можно воспользоваться QEMU и базовую реализацию UEFI от Intel:UEFI and Secure Boot with QEMU

GPT

UEFI меняет гораздо больше чем прошивку, системные вызовы и интерфейс. Одной из целей внедрения UEFI является новый стандарт разметки жестких дисков. GUID Partitioning Table (GPT) призван заменить старую Master Boot Record (MBR).

MBR имеет ряд существенных ограничений, накладываемых на количество основных и логических разделов и их размер. GPT снимает эти ограничения и теперь мы можем иметь желаемое количество разделов (до 128) и адресуемое дисковое пространство до 2^64 байт (это более 18 Эксабайт), по этому для больших дисков этот метод разметки является предпочтительным. Другое ключевое отличие заключается в том, что GPT определяет каждый раздел уникальным номером UUID, что предотвращает конфликты и ошибки при идентификации разделов.

Если YaST2 определит, что он запущен в режиме EFI, то при чистой установке он попытается создать разметить диск в GPT. Нужно помнить, что с разделами GPT старый fdisk работать не будет, вместо него нужно использовать gdisk из паета gptfdisk. Интерфейс у этой программы схож с интерфейсом классического fdisk.

Иногда для разного рода тестов и экспериментов с разными режимами бывает нужно полностью удалить разметку GPT с жёсткого диска. Это можно сделать при помощи YaST2. Нужно открыть модуль Экспертная разметка, выбрать нудный жёсткий диск и по кнопке "Эксперт..." выбрать пункт "Создать новую таблицу разделов".

Это заменит таблицу раздело в соответствии с запущенной системой.

Системный раздел EFI

Системный раздел EFI (EFI System Partition - ESP) это раздел, на котором UEFI ищет EFI загрузчики, которые могут быть использованы для загрузки любых операционных систем, установленных на устройстве, драйверы устройств, используемых во время загрузки и другие программы, которые необходимо выполнить перез загрузкой операционной системы.

Этот раздел использует файловую систему FAT и может быть создан с помощью YaST2 во время чистой установки, или использован имеющийся раздел на системах с двойной загрузкой. Если YaST2 во время установки обнаружит установленную Windows, будет производиться поиск раздела EFI, и если он будет найден, то YaST2 разместит на нём новый EFI загрузчик для openSUSE, и смонтирует его в /boot/efi.

По умолчанию, UEFI прошивка ищет файл расширения /EFI/BOOT/bootx64.efi, который будет загружен и выполнен перед загрузкой операционной системы. На Windows машинах корректный путь будет /EFI/Microsoft/Boot/BCD.efi,, а на openSUSE - /EFI/opensuse/grubx64.efi (или shim.efi если включен secure boot).

Менеджер загрузки

Для выбора правильного расширения, которое загрузит операционную систему, EFI предоставляет пользователю внутреннее меню загрузки. Операционная система может создавать новые пункты в этом меню для своей загрузки. После включения питания можно вызвать менеджер загрузки (обычно с помощью клавиш F9 или F12) и просмотреть все варианты загрузки. Для просмотра редактирования пунктов меню загрузки можно использовать инструмент efibootmgr. Например команда efibootmgr -v выведет список существующих пунктов меню загрузки.

На предыдущей иллюстрации видно, что для openSUSE существует два разных варианта загрузки. Один из них используется для запуски в режиме secure boot, а другой в обычном режиме.

Если по каким-то причинам мы лишимся какого-то из этих пунктов, можно его пересоздать, при помощи efibootmgr. Например для пересоздания варианта загрузки opensuse нужно выполнить следующую команду:

$ efibootmgr -c -L “openSUSE-alt” -l '\EFI\opensuse\grubx64.efi'

Переменные EFI

Стандарт UEFI определяет набор переменных, которые хранятся в постоянной памяти прошивки. Эти переменные используются для хранения информации и управления поведением UEFI системы. Когда создаётся новый вариант в менеджере загрузки, или например когда мы включаем/выключаем режим 'secure boot', мы получаем доступ и изменяем значения этих переменных.

Можно получит доступ к этим переменным напрямую из openSUSE через Sysfs. Sysfs это виртуальная файловая система, предоставляемая ядром для вывода некоторой системной информации в пользовательское пространство. Переменные связанные с EFI находятся в '/sys/firmware/efi/vars/'. Так, например, последний вариант загрузки может быть получен следующей командой:

$ hexdump -C /sys/firmware/efi/vars/Boot0007-*/data

Secure Boot

Обзор

UEFI Secure Boot это метод, позволяющий ограничить выполнение EFI программ во время загрузки системы. UEFI прошивка в этом режиме выполняет только те загрузчики, которые имеют проверенную цифровую подпись. Для идентификации загрузчиков используются сертификаты X.509.

На сегодняшний день большая часть потребительской устройств поставляются с Microsoft Windows 8. Прошивка этих устройств опознаёт только Windows. Для того, что бы загрузить на этих устройствах openSUSE без изменения известных прошивке подписей и без отключения режима Secure Boot, загрузчик openSUSE подписан цифровой подписью Microsoft.

Реализация в openSUSE 12.3

По умолчанию openSUSE 12.3 на системах UEFI использует загрузчик grub2. Когда включен режим Secure Boot, в дополнение к нему используется ещё один загрузчик - 'shim'. Вместо непосредственного вызова grub2 в этом режиме прошивка сначала запускает 'shim'. 'shim' подписан Microsoft и корректно распознаётся прошивкой. 'shim' в свою очередь распознаёт и поверяет сертификат openSUSE, которым подписан grub2 и передаёт управление ему. grub2 загружает ядро Linux которое также подписано сертификатом openSUSE. После загрузки ядра Linux зона ответственности Secure Boot заканчивается.

Ядро Linux, используемое в openSUSE не подвергается никаким дополнительным ограничениям.

Чтобы использовать произвольные загрузчики и ядра, 'shim' имеет возможность импорта сертификатов. Ля этих целей используется программа 'MokManager'. Когда 'shim' получает команду запустить программу которая подписана неизвестной подписью, он отправляет запрос к 'MokManager', который позволяет импортировать сертификаты в базу известных цифровых подписей.

Как включить или отключить поддержку Secure Boot

Поддержка Secure Boot в openSUSE 12.3 всё ещё на экспериментальной стадии. Программа установки YaST не может автоматически определить, включен режим Secure Boot или нет. Во время установки предоставляется возможность вручную включить режим Secure Boot. Включение этой опции требуется для того чтобы был установлен shim. Для включения или отключения режима Secure Boot в уже установленной системе используется модуль YaST 'Загрузчик'.

Как определить, включен ли режим Secure Boot

Для того, чтобы определить, включен ли в прошивке системы режим Secure Boot выполните следующую команду в консоли Linux с правами суперпользователя:

 od -An -t u1 /sys/firmware/efi/vars/SecureBoot-8be4df61-93ca-11d2-aa0d-00e098032b8c/data

Если Secure Boot включен, результатом будет '1'. Но существуют версии прошивок, в которых есть ошибка, и они покажут '0' даже если Secure Boot включен.

Загрузка произвольного ядра

Secure boot не мешает использовать самостоятельно скомпилированное ядро, но его обязательно нужно подписать собственным сертификатом и сделать этот сертификат известным прошивке или MOK.

создание своего X.509 ключа и сертификата, используемого для подписи:

 openssl req -new -x509 -newkey rsa:2048 -keyout key.asc -out cert.pem -nodes -days 666 -subj "/CN=$USER/"

упаковка ключа и сертификата в структуру PKCS#12

 openssl pkcs12 -export -inkey key.asc -in cert.pem -name kernel_cert -out cert.p12

генерация базы данных NSS для использования pesign

 certutil -d . -N

импорт ключа и сертификата из PKCS#12 в базу NSS

 pk12util -d . -i cert.p12

подписывание ядра созданной подписью

 pesign -n . -c kernel_cert -i arch/x86/boot/bzImage -o vmlinuz.signed -s

список подписей, которыми подписан образ ядра

 pesign -n . -S -i vmlinuz.signed

После этого можно устанавливать ядро в /boot. Теперь ядро имеет подпись, и сертификат для этой подписи нужно импортировать в прошивку или MOK.

конвертировать сертификат в формат DER для импорта в UEFI прошивку или MOK

 openssl x509 -in cert.pem -outform der -out cert.cer

скопировать сертификат в ESP для простого доступа

 sudo cp cert.cer /boot/efi/

К сожалению mokutil всё ещё не работает в openSUSE 12.3, поэтому нет удобного способа для его автоматического запуска. Следующая последовательность описывает как запустить MOK вручную.

  • перезагрузка
  • в меню grub нажать клавишу 'c'
  • набрать
 chainloader (hd0,gpt1)/EFI/opensuse/MokManager.efi
 boot
  • выбрать "Enroll key from disk"
  • переместить курсор на файл cert.cer и нажать enter
  • следовать инструкциям регистрации ключа. Обычно это нажатие клавиши '0' и потом 'y' для подтверждения

Кроме того, некоторые прошивки имеют возможность добавлять новые сертификаты в базу (db) через свои меню.

Загрузка машины без ключей производителя

Если в меню прошивки есть опция для сброса ключей, используемых для Secure Boot, то можно установить новые PK, KEK и db без ключей Microsoft. Импорт /usr/lib64/efi/shim-opensuse.der в db даст возможность загружать ядра openSUSE. shim по умолчанию подписан и Microsoft и openSUSE. Некоторые версии прошивок не поддерживают двойную подпись. В этом случае нужно использовать /usr/lib64/efi/shim-opensuse.efi, который подписан только подписью openSUSE, так же как и /boot/efi/EFI/opensuse/shim.efi.

Глоссарий

PK
"Platform Key" обычно это сертификат, установленный производителем оборудования. Требуется для возможности изменить KEK.
KEK
Проверенная подпись "Key Exchange Key" - требуется для обновления базы подписей.
db
База подписей - содержит все известные сертификаты, подписи или хэши двоичных файлов. Только файлы, которые можно проверить, используя эту базу могут быть выполнены прошивкой. Корректная подпись KEK требуется для обновления этой базы.
dbx
База запрещённых подписей в отличие от 'db', содержит 'чёрный список' сертификатов, подписей и хэшей. Если исполняемый файл соответствует любой записи из этой базы, то он не может быть выполнен. Проверенная подпись KEK требуется для обновления этой базы.
MOK
Machine Owner Keys. Дополнительная база сертификатов или хэшей, используемая MokManager. Можно интерактивно использовать MokManager во время загрузки для обновления этой базы.

Смотрите также