О UEFI Сравнение версий

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
wiki:uefi [2019/03/14 01:53]
[Загрузка ядра из UEFI]
wiki:uefi [2020/07/31 18:17] (текущий)
[Что нужно для того что бы ОС грузилась через BIOS?]
Строка 15: Строка 15:
 Проблемой BIOS принято считать то, что много работы он делает зря (чем затягивает процесс загрузки системы). Практически всю его работу по инициализации и поддержке оборудования компьютера все современные ОС попросту игнорируют и повторно инициализируют и далее работают через свои драйвера. Все, что дает BIOS, было реально востребовано только в ранних версиях DOS... Проблемой BIOS принято считать то, что много работы он делает зря (чем затягивает процесс загрузки системы). Практически всю его работу по инициализации и поддержке оборудования компьютера все современные ОС попросту игнорируют и повторно инициализируют и далее работают через свои драйвера. Все, что дает BIOS, было реально востребовано только в ранних версиях DOS...
  
-Другой проблемой являются ограничения,​ которые установлены для поддержки BIOS: это 16-ти разрядный реальный режим работы процессора с набором команд i8086, 1Мб адресуемого пространства памяти и периферия (клавиатура,​ видео адаптер,​ контроллер прямого доступа в память) совместимая с IBM AT. На сегодняшний день, требовать от 64-х разрядного многоядерного,​ многопоточного процессора совместимости с одноядерным и однопоточным 16-разрядным i8086 - уже немного смешно,​ а требование совместимости по периферии с IBM PC-AT(компьютер 1984-го года выпуска) уже даже не смешно,​ а очень грустно.+Другой проблемой являются ограничения,​ которые установлены для поддержки BIOS: это 16-разрядный реальный режим работы процессора с набором команд i8086, 1Мб адресуемого пространства памяти и периферия (клавиатура,​ видео адаптер,​ контроллер прямого доступа в память) совместимая с IBM AT. На сегодняшний день, требовать от 64-х разрядного многоядерного,​ многопоточного процессора совместимости с одноядерным и однопоточным 16-разрядным i8086 - уже немного смешно,​ а требование совместимости по периферии с IBM PC-AT(компьютер 1984-го года выпуска) уже даже не смешно,​ а очень грустно.
 ==== (U)EFI ==== ==== (U)EFI ====
 Идеи отказаться от всего того ненужного,​ что делает BIOS, снять архаичные ограничения BIOS и сделать процесс инициализации и загрузки более гибким возникали уже очень давно, и различные попытки сделать это предпринимались,​ но IT-индустрия реально созрела к принятию нового общего стандарта загрузки персональных компьютеров только в начале этого века. В 2005 был создан консорциуму [[http://​www.uefi.org/​|UEFI Forum]], которому INTEL передал свою наработки по проекту Intel Boot Initiative (позже переименованному в EFI - Extensible Firmware Interface), начатому еще середине 90-х. Помимо Intel в консорциум вошли AMD, Apple, IBM, Microsoft и многие другие крупные IT-компании. Вместе с созданием консорциума спецификация EFI была переименована в UEFI (Unified Extensible Firmware Interface)((Не смущайтесь тем, что во многих местах UEFI упоминается как EFI - по сути это не совсем правильно,​ но по факту - речь об одном и том же.)). Идеи отказаться от всего того ненужного,​ что делает BIOS, снять архаичные ограничения BIOS и сделать процесс инициализации и загрузки более гибким возникали уже очень давно, и различные попытки сделать это предпринимались,​ но IT-индустрия реально созрела к принятию нового общего стандарта загрузки персональных компьютеров только в начале этого века. В 2005 был создан консорциуму [[http://​www.uefi.org/​|UEFI Forum]], которому INTEL передал свою наработки по проекту Intel Boot Initiative (позже переименованному в EFI - Extensible Firmware Interface), начатому еще середине 90-х. Помимо Intel в консорциум вошли AMD, Apple, IBM, Microsoft и многие другие крупные IT-компании. Вместе с созданием консорциума спецификация EFI была переименована в UEFI (Unified Extensible Firmware Interface)((Не смущайтесь тем, что во многих местах UEFI упоминается как EFI - по сути это не совсем правильно,​ но по факту - речь об одном и том же.)).
  
-Основные концепции положенные в основу UEFI - "​минималистичность",​ "​модульность"​ и поддержка разных процессоров. Прошивка UEFI может быть собрана под 32-битный или 64-битный процессоры Intel, 32-х или 64-х битный ​ARM процессор,​ а также для ​Intel Itanium ​процессоров. Кроме тогоUEFI имеет собственный менеджер загрузки и умеет работать с файловыми системами на диске (по умолчанию только FAT32), а также умеет загружать драйвера для поддержки различного оборудования и любых файловых систем.\\+Основные концепции положенные в основу UEFI - "​минималистичность",​ "​модульность"​ и поддержка разных процессоров. Прошивка UEFI может быть собрана под 32-битный или 64-битный процессоры Intel, 32- или 64-битный процессор ​ARM, а также для процессоров ​Intel Itanium. Кроме того UEFI имеет собственный менеджер загрузки и умеет работать с файловыми системами на диске (по умолчанию только FAT32), а также умеет загружать драйверы для поддержки различного оборудования и любых файловых систем.\\
 После включения компьютера и проведения первичного теста оборудования (на этом этапе разницы с BIOS нет) инициализируются только те подсистемы,​ которые необходимые для загрузки. После включения компьютера и проведения первичного теста оборудования (на этом этапе разницы с BIOS нет) инициализируются только те подсистемы,​ которые необходимые для загрузки.
  
-В некоторых режимах загрузки,​ которые обычно называют Fast-boot (или Fast-Startup) даже клавиатура может оставаться не инициализированной пока не загрузится ОС. Некоторые настройки Fast-boot могут отключать работу со всеми USB устройствами и не будет возможности даже выбрать с чего грузится компьютеру,​ ведь клавиатура не работает до тех пор, пока не загрузится ОС. +В некоторых режимах загрузки,​ которые обычно называют Fast-boot (или Fast-Startup)даже клавиатура может оставаться не инициализированнойпока не загрузится ОС. Некоторые настройки Fast-boot могут отключать работу со всеми USB устройствами и не будет возможности даже выбрать с чего грузиться компьютеру,​ ведь клавиатура не работает до тех пор, пока не загрузится ОС. 
  
-Причем,​ в отличии от BIOS, все компоненты которого записаны в постоянную(флеш) память,​ UEFI может хранить часть своего кода на диске - в специальном разделе ESP((на самом деле ESP раздел может быть и на флеш-памяти и даже на сетевом хранилище,​ но эта экзотика (предусмотренная стандартом) вряд ли будет востребована простыми пользователями)). Это позволяет легко расширять,​ менять и обновлять код поддерживающий различные устройства компьютера без необходимости перепрограммировать постоянное ЗУ компьютера. А кроме драйверов для поддержки устройств на ESP разделе может хранится и поддержка протоколов,​ утилиты и даже собственная EFI-оболочка (shell), из-под которой можно запускать собственные EFI-приложения. Т.е. UEFI по сути - маленькая ОС (или псевдо-ОС). При этом загрузчик операционной системы ​становится обычным приложением,​ которое исполняется в окружении,​ предоставляемом псевдо-ОС UEFI.+Причем,​ в отличии от BIOS, все компоненты которого записаны в постоянную (флеш) память,​ UEFI может хранить часть своего кода на диске - в специальном разделе ESP((на самом деле ESP раздел может быть и во флеш-памяти и даже на сетевом хранилище,​ но эта экзотика (предусмотренная стандартом) вряд ли будет востребована простыми пользователями)). Это позволяет легко расширять,​ менять и обновлять код поддерживающий различные устройства компьютера без необходимости перепрограммировать постоянное ЗУ компьютера. А кроме драйверов для поддержки устройств на ESP разделе может хранится и поддержка протоколов,​ утилиты и даже собственная EFI-оболочка (shell), из-под которой можно запускать собственные EFI-приложения. Т.е. UEFI по сути - маленькая ОС (или псевдо-ОС). При этом загрузчик операционной системы становится обычным приложением,​ которое исполняется в окружении,​ предоставляемом псевдо-ОС UEFI. Подробнее о EFS разделе мы поговорим в главе [[https://​help.ubuntu.ru/​wiki/​uefi#​esp_%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB|ESP раздел]].
  
 UEFI реализует свой менеджер загрузки,​ он поддерживает мульти-загрузку:​ позволяет выбирать загрузку из нескольких ОС и/или утилит. Загрузчик ОС - это просто efi-приложение,​ которое хранится на ESP разделе. В ESP может храниться много приложений,​ и пункты меню загрузки могут ссылаться каждый на свое приложение (или на одно, но с передачей разных параметров). Кроме того, UEFI поддерживает ассоциацию нажатия клавиш с пунктами загрузки (выбор пункта загрузки осуществляется в зависимости от того какая нажата клавиша в момент загрузки). Т.о. UEFI берет на себя большую часть задач, которые раньше могли решать только загрузчики ОС (типа GRUB). UEFI реализует свой менеджер загрузки,​ он поддерживает мульти-загрузку:​ позволяет выбирать загрузку из нескольких ОС и/или утилит. Загрузчик ОС - это просто efi-приложение,​ которое хранится на ESP разделе. В ESP может храниться много приложений,​ и пункты меню загрузки могут ссылаться каждый на свое приложение (или на одно, но с передачей разных параметров). Кроме того, UEFI поддерживает ассоциацию нажатия клавиш с пунктами загрузки (выбор пункта загрузки осуществляется в зависимости от того какая нажата клавиша в момент загрузки). Т.о. UEFI берет на себя большую часть задач, которые раньше могли решать только загрузчики ОС (типа GRUB).
 +Более подробно мы поговорим о менеджере загрузки UEFI в разделе [[https://​help.ubuntu.ru/​wiki/​uefi#​%D0%BC%D0%B5%D0%BD%D0%B5%D0%B4%D0%B6%D0%B5%D1%80_%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B8_uefi|Менеджер загрузки UEFI]]
  
-Архитектура UEFI позволяет также загрузить драйвера устройств (необходимые для работы ОС и для процедуры загрузки). Да и само ядро ОС можно загрузить (по крайней мере ядро Linux, собранное с опцией UEFISTUB) непосредственно из UEFI (т.е. устранить загрузчик из процесса загрузки). Такую возможность мы разберем более детально чуть позже.+Архитектура UEFI позволяет также загрузить драйвера устройств (необходимые для работы ОС и для процедуры загрузки). Да и само ядро ОС можно загрузить (по крайней мере ядро Linux, собранное с опцией UEFISTUB) непосредственно из UEFI (т.е. устранить загрузчик из процесса загрузки). Такую возможность мы разберем более детально чуть позже ​в разделе [[https://​help.ubuntu.ru/​wiki/​uefi#​%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0_%D1%8F%D0%B4%D1%80%D0%B0_linux_%D0%BD%D0%B5%D0%BF%D0%BE%D1%81%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE_%D0%B8%D0%B7_uefi|Загрузка ядра Linux непосредственно из UEFI]].
  
-Как и в случае с BIOS, UEFI - это стандарт,​ практической реализацией которого занимаются разные поставщики решений. Поэтому в реализации ​UEFI стандарта в прошивках разных поставщиков могут значительно отличаться (как визуально так и функциональным наполнением). Могут встречаться сильно урезанные по функционалу реализации (чаще в компьютерах выпущенных в 2000-х годах). Но базовые принципы работы UEFI в процессе загрузки различаться сильно не должны (он был определен и зафиксирован в самых ранних стандартах UEFI). Интерфейсы утилиты настройки могут сильно различаться,​ но значение имеет не способ оформления интерфейса,​ а те настройки,​ которые доступны для изменения через этот интерфейс.+Как и в случае с BIOS, UEFI - это стандарт,​ практической реализацией которого занимаются разные поставщики решений. Поэтому в реализации стандарта ​UEFI в прошивках разных поставщиков могут значительно отличаться (как визуально так и функциональным наполнением). Могут встречаться сильно урезанные по функционалу реализации (чаще в компьютерах выпущенных в 2000-х годах). Но базовые принципы работы UEFI в процессе загрузки различаться сильно не должны (он был определен и зафиксирован в самых ранних стандартах UEFI). Интерфейсы утилиты настройки могут сильно различаться,​ но значение имеет не способ оформления интерфейса,​ а те настройки,​ которые доступны для изменения через этот интерфейс.
 ==== Совместимость ==== ==== Совместимость ====
-Само собой, современные прошивки умеют эмулировать работу BIOS. Отвечает за совместимость с BIOS модуль CSM (Compatibility Support Module иногда он еще называется Legasy support). Когда CSM включен и при загрузке загрузиться в UEFI не удалось,​ то CSM пытается найти загрузчик ОС в первом секторе диска (MBR) или в специальном служебном разделе (при GPT разбивке диска). Если код загрузчика найден,​ то CSM считает,​ что установлена ОС требующая поддержки ​BIOS режима,​ и прежде чем загрузить и запустить код из MBR, CSM проделывает все те же шаги инициализации оборудования,​ что предусмотрены для BIOS.+Само собой, современные прошивки умеют эмулировать работу BIOS. Отвечает за совместимость с BIOS модуль CSM (Compatibility Support Module иногда он еще называется Legasy support). Когда CSM включен и при загрузке загрузиться в UEFI не удалось,​ то CSM пытается найти загрузчик ОС в первом секторе диска (MBR) или в специальном служебном разделе (при GPT разбивке диска). Если код загрузчика найден,​ то CSM считает,​ что установлена ОСтребующая поддержки режима ​BIOS, ипрежде чем загрузить и запустить код из MBR, CSM проделывает все те же шаги инициализации оборудования,​ что предусмотрены для BIOS.
  
 Если вы планируете использовать только загрузку в варианте UEFI, то работу этого модуля лучше запретить в системной утилите вашей материнской платы (Firmware setup utility). Кроме того, загрузка в режиме SecureBoot (о ней будет рассказано ниже) явно требует,​ что бы работа модуля CSM была запрещена. Если вы планируете использовать только загрузку в варианте UEFI, то работу этого модуля лучше запретить в системной утилите вашей материнской платы (Firmware setup utility). Кроме того, загрузка в режиме SecureBoot (о ней будет рассказано ниже) явно требует,​ что бы работа модуля CSM была запрещена.
Строка 41: Строка 42:
 По стандарту этот раздел должен иметь файловую систему FAT32 (в принципе стандарт допускает использование других ФС, но на практике это не распространено). По стандарту этот раздел должен иметь файловую систему FAT32 (в принципе стандарт допускает использование других ФС, но на практике это не распространено).
 Предусмотренная в стандарте структура каталогов довольно проста. Предусмотренная в стандарте структура каталогов довольно проста.
-  * В корне системного раздела могут располагаться системные утилиты (например тот же шелл-интерпретатор).+  * В корне системного раздела могут располагаться системные утилиты (например тот же [[https://​help.ubuntu.ru/​wiki/​uefi#​uefi_shell|шелл-интерпретатор]]).
   * В каталогах EFI\<​Поставщик>​((в UEFI используются обратные косые в качестве разделителей)) должны лежать загрузчики ОС указанного поставщика.   * В каталогах EFI\<​Поставщик>​((в UEFI используются обратные косые в качестве разделителей)) должны лежать загрузчики ОС указанного поставщика.
   * Если у UEFI нет явного указания какой загрузчик загружать,​ то он загружает файл EFI\BOOT\BOOTx64.EFI (...x32.EFI для 32-х битных платформ). ​   * Если у UEFI нет явного указания какой загрузчик загружать,​ то он загружает файл EFI\BOOT\BOOTx64.EFI (...x32.EFI для 32-х битных платформ). ​
-При установке UBUNTU (с загрузкой через UEFI) служебный раздел ESP монтируется в /boot/efi. И на ESP разделе создается каталог EFI\ubuntu в котором размещается загрузчик((Виндовый загрузчик размещается в EFI\Microsoft\Boot\Bootmgfw.efi)) GRUB и/или Shim (о них - чуть позже).+При установке UBUNTU (с загрузкой через UEFI) служебный раздел ESP монтируется в /boot/efi. И на ESP разделе создается каталог EFI\ubuntu в котором размещается загрузчик((Виндовый загрузчик размещается в EFI\Microsoft\Boot\Bootmgfw.efi)) GRUB и/или Shim (о них - чуть ​[[https://​help.ubuntu.ru/​wiki/​uefi#​%D0%BA%D0%B0%D0%BA_ubuntu_%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B6%D0%B0%D0%B5%D1%82%D1%81%D1%8F_%D0%B2_%D1%80%D0%B5%D0%B6%D0%B8%D0%BC%D0%B5_secure_boot|позже]]).
 <note important>​EFS раздел лучше создавать из установщика. Когда вы делаете его сами через gparted/​parted/​fdisk,​ то есть шанс сделать что-то не так (например выберете FAT16 вместо FAT32) и тогда UEFI не поймет,​ что это EFS раздел и не будет с него загружаться. Доверьте установщику выполнить работу,​ которую он умеет делать хорошо - делайте EFS раздел из установщика.</​note>​ <note important>​EFS раздел лучше создавать из установщика. Когда вы делаете его сами через gparted/​parted/​fdisk,​ то есть шанс сделать что-то не так (например выберете FAT16 вместо FAT32) и тогда UEFI не поймет,​ что это EFS раздел и не будет с него загружаться. Доверьте установщику выполнить работу,​ которую он умеет делать хорошо - делайте EFS раздел из установщика.</​note>​
  
Строка 59: Строка 60:
 <​note>​EFS раздел может быть также создан в таблице разделов формата ISO9660 (стандарт используемый для разметки CD/DVD оптических лисков). Это позволяет загружаться в режиме UEFI и с CD/​DVD.</​note>​ <​note>​EFS раздел может быть также создан в таблице разделов формата ISO9660 (стандарт используемый для разметки CD/DVD оптических лисков). Это позволяет загружаться в режиме UEFI и с CD/​DVD.</​note>​
  
-Получившаяся в результате "​солянка"​ (из 4-х допустимых вариантов:​ UEFI + MBR, UEFI + GPT, BIOS/SCM + MBR и BIOS/SCM + GPT) создает некоторую путаницу и недопонимание. Давайте попробуем во всем этом разобраться более детально.+Получившаяся в результате "​солянка"​ (из 4-х допустимых вариантов:​ UEFI + MBR, UEFI + GPT, BIOS/CSM + MBR и BIOS/CSM + GPT) создает некоторую путаницу и недопонимание. Давайте попробуем во всем этом разобраться более детально.
 ===== Что нужно для того что бы ОС грузилась через BIOS? ===== ===== Что нужно для того что бы ОС грузилась через BIOS? =====
 <​note>​Несмотря на то, что загрузка в режиме BIOS уже не современна,​ не модна :-), а главное - технологически устарела,​ но, уверен,​ будет еще много сторонников этого пути, на протяжении долгих лет... Однако я не могу найти ни одного разумного довода использовать этот вариант если и ОС и компьютер поддерживают загрузку через UEFI.</​note>​ <​note>​Несмотря на то, что загрузка в режиме BIOS уже не современна,​ не модна :-), а главное - технологически устарела,​ но, уверен,​ будет еще много сторонников этого пути, на протяжении долгих лет... Однако я не могу найти ни одного разумного довода использовать этот вариант если и ОС и компьютер поддерживают загрузку через UEFI.</​note>​
-В первую очередь,​ для загрузки через BIOS, в утилите настройки вашего компьютера должна быть разрешена работа модуля CSM. Само собой, ​SecureBoot ​режим (о нем рассказано чуть ниже) в таком варианте организовать невозможно в принципе.+В первую очередь,​ для загрузки через BIOS, в утилите настройки вашего компьютера должна быть разрешена работа модуля CSM. Само собой, режим ​SecureBoot ​(о нем рассказано чуть ниже) в таком варианте организовать невозможно в принципе.
  
-Если разбивка диска - c таблицей разделов в MBR (вариант "BIOS/SCM + MBR"), то ничего дополнительно не нужно (это сочетание собственно и есть оригинальная конфигурация для варианта загрузки через BIOS).+Если разбивка диска - c таблицей разделов в MBR (вариант "BIOS/CSM + MBR"), то ничего дополнительно не нужно (это сочетание собственно и есть оригинальная конфигурация для варианта загрузки через BIOS).
  
 А вот если у вас диск размечен через GPT (вариант "​BIOS/​SCM + GPT"), то возникают некоторые сложности. \\ А вот если у вас диск размечен через GPT (вариант "​BIOS/​SCM + GPT"), то возникают некоторые сложности. \\
 В первую очередь:​ не совсем ясно - куда разместить код, который ранее размещался в MBR. Да, в GPT первый блок размером в 512 байт зарезервирован и в нем даже есть защитная версия таблицы разделов (в формате принятом для MBR). В защитной таблице разделов записан единственный раздел размером на все адресуемое пространство диска((или на первые 2ТБ, если диск имеет объем более чем 2ТБ)) и с типом EE. Само собой, с единственной фейковой записью в таблице разделов никакой код в MBR не сможет корректно отработать процесс загрузки((Само собой, в таблицу разделов можно добавить еще 3 записи,​ это хоть и делает возможной загрузку кодом из MBR, но создает ситуацию,​ при которой на диске одновременно действуют две таблицы разделов разного формата. Такие гибридные системы удается реализовать энтузиастам,​ но массовому пользователю использовать такие схемы не рекомендуется в виду сложности настройки и поддержания работоспособности такой системы)).\\ В первую очередь:​ не совсем ясно - куда разместить код, который ранее размещался в MBR. Да, в GPT первый блок размером в 512 байт зарезервирован и в нем даже есть защитная версия таблицы разделов (в формате принятом для MBR). В защитной таблице разделов записан единственный раздел размером на все адресуемое пространство диска((или на первые 2ТБ, если диск имеет объем более чем 2ТБ)) и с типом EE. Само собой, с единственной фейковой записью в таблице разделов никакой код в MBR не сможет корректно отработать процесс загрузки((Само собой, в таблицу разделов можно добавить еще 3 записи,​ это хоть и делает возможной загрузку кодом из MBR, но создает ситуацию,​ при которой на диске одновременно действуют две таблицы разделов разного формата. Такие гибридные системы удается реализовать энтузиастам,​ но массовому пользователю использовать такие схемы не рекомендуется в виду сложности настройки и поддержания работоспособности такой системы)).\\
 Еще одно проблемное место возникает когда загрузчик использует для размещения своего кода сектора на первом треке диска за MBR (к примеру так поступает GRUB). В GPT на этом месте уже идут служебные записи (заголовок таблицы разделов и сами записи о разделах).\\ Еще одно проблемное место возникает когда загрузчик использует для размещения своего кода сектора на первом треке диска за MBR (к примеру так поступает GRUB). В GPT на этом месте уже идут служебные записи (заголовок таблицы разделов и сами записи о разделах).\\
-Для решения обоих этих проблем предусмотрен специальный бинарный (он не форматируется ни в какую ФС) раздел BIOS-Boot (Тип = EF02 или UUID = 21686148-6449-6E6F-744E-656564454649). Установщик ОС может прописать на этот раздел весь тот код, который ранее размещался в MBR и на незанятом пространстве за MBR. Этот раздел должен иметь установленный флаг boot. Размер этого раздела может быть совсем маленьким,​ ведь MBR - это всего 512 байт, а размер неиспользуемого пространства за MBR, составляет всего 31Кb. Однако,​ некоторые современные загрузчики требуют раздел BIOS-Boot размером в 10-30Мb.\\+Для решения обоих этих проблем предусмотрен специальный бинарный (он не форматируется ни в какую ФС) раздел BIOS-Boot (Тип = EF02 или UUID = 21686148-6449-6E6F-744E-656564454649). Установщик ОС может прописать на этот раздел весь тот код, который ранее размещался в MBR и на незанятом пространстве за MBR. Этот раздел должен иметь установленный флаг boot. Размер этого раздела может быть совсем маленьким,​ ведь MBR - это всего 512 байт, а размер неиспользуемого пространства за MBR, составляет всего 31Кb или 1023,​5Кb((в зависимости от того с какого сектора начинается первый раздел,​ обычно это либо 64 сектор либо 2047 секторов)). Однако,​ некоторые современные загрузчики требуют раздел BIOS-Boot размером в 10-30Мb.\\
 В процессе загрузки CSM модуль (эмулирующий работу BIOS) отвечает за то, что находит в GPT раздел BIOS-Boot, загружает первые 512 байт с этого раздела,​ и передает управление загруженному коду. За дальнейший процесс загрузки отвечает этот код, а CSM берет на себя задачу эмулировать обращение к секторам диска за MBR (вместо этих секторов производится подстановка секторов из раздела BIOS-Boot). В процессе загрузки CSM модуль (эмулирующий работу BIOS) отвечает за то, что находит в GPT раздел BIOS-Boot, загружает первые 512 байт с этого раздела,​ и передает управление загруженному коду. За дальнейший процесс загрузки отвечает этот код, а CSM берет на себя задачу эмулировать обращение к секторам диска за MBR (вместо этих секторов производится подстановка секторов из раздела BIOS-Boot).
  
-<​note>​Пожалуй вот на этом и закончим обсуждать CSM и BIOS, все дальнейшее будет относится только к UEFI.</​note>​+---- 
 + 
 +Пожалуй вот на этом и закончим обсуждать CSM и BIOS, все дальнейшее будет относится только к UEFI.
 ===== Что нужно для установки ОС, что бы она грузилась через UEFI? ===== ===== Что нужно для установки ОС, что бы она грузилась через UEFI? =====
 На самом деле все не так сложно как кажется. Как уже было сказано UEFI требует специального раздела ESP (с файловой системой FAT32 и флагами boot и esp). И, несмотря на то, что для этого раздела был предусмотрен специальный длинный идентификатор (UUID = C12A7328-F81F-11D2-BA4B-00A0C93EC93B) для GPT, который в таблицу разделов MBR ну никак не запихнешь,​ этому разделу дали еще и короткий идентификатор (EF), который можно "​впихнуть"​ в таблицу разделов в MBR. Т.е. ESP раздел можно создать и на диске с GPT и на диске с таблицей разделов в MBR (однако такой вариант поддерживает не любая ОС). На самом деле все не так сложно как кажется. Как уже было сказано UEFI требует специального раздела ESP (с файловой системой FAT32 и флагами boot и esp). И, несмотря на то, что для этого раздела был предусмотрен специальный длинный идентификатор (UUID = C12A7328-F81F-11D2-BA4B-00A0C93EC93B) для GPT, который в таблицу разделов MBR ну никак не запихнешь,​ этому разделу дали еще и короткий идентификатор (EF), который можно "​впихнуть"​ в таблицу разделов в MBR. Т.е. ESP раздел можно создать и на диске с GPT и на диске с таблицей разделов в MBR (однако такой вариант поддерживает не любая ОС).
Строка 91: Строка 94:
 <note important>​Некоторые дистрибутивы не умеют загружаться через UEFI, если у вас таблица разделов в MBR.</​note>​ <note important>​Некоторые дистрибутивы не умеют загружаться через UEFI, если у вас таблица разделов в MBR.</​note>​
 Для загрузки через UEFI модуль CSM не нужен, и, если все установленные на компьютере ОС грузятся через UEFI, то CSM лучше отключить. А вот если вы организуете загрузку в режиме SecureBoot, то CSM модуль отключить просто необходимо:​ без этого, обычно,​ просто не включить режим SecureBoot или включение SecureBoot автоматически запрещает работу CSM. Для загрузки через UEFI модуль CSM не нужен, и, если все установленные на компьютере ОС грузятся через UEFI, то CSM лучше отключить. А вот если вы организуете загрузку в режиме SecureBoot, то CSM модуль отключить просто необходимо:​ без этого, обычно,​ просто не включить режим SecureBoot или включение SecureBoot автоматически запрещает работу CSM.
 +===== Менеджер загрузки UEFI =====
 +
 +Кроме кода отвечающего за первичную инициализацию системы UEFI имеет свой менеджер загрузки. Работу менеджера загрузки задают переменные UEFI, хранящиеся в энергонезависимой памяти NVRAM((это та самая, для которой на материнской плате стоит батарейка,​ хотя в последнее время батарейка чаще ставится только для часов реального времени,​ а энергонезависимую память обеспечивает флеш-память)).
 +
 +Переменные,​ которые задают работу менеджера загрузки это:
 +  * **Driver####​**
 +  * **DriverOrder**
 +  * **SysPrep####​**
 +  * **SysPrepOrder**
 +  * **Boot####​**
 +  * **BootOrder**
 +  * **OsRecovery####​**
 +  * **PlatformRecovery####​**
 +  * **BootNext**
 +
 +, где #### - шестнадцатеричный номер записи.
 +
 +Переменные **Driver####​** инициализируют загрузку UEFI драйверов. Переменная **DriverOrder** определяет последовательность загрузки драйверов.
 +
 +Драйвера остаются в памяти после своей инициализации. Однако загруженные драйвера сразу не связываются с устройствами,​ которые они обслуживают. Процесс такого связывания необходимо инициализировать отдельно. Но нужно отметить,​ что происходит не просто связывание загруженных драйверов,​ а повторное связывание,​ т.к. некоторые драйвера уже были связаны со своими устройствами в процессе первичной инициализации системы. За запуск процесса инициализации отвечает флаг LOAD_OPTION_FORCE_RECONNECT,​ который можно установить в поле атрибутов загрузочной записи **Driver####​**. Если хоть у одного из загруженных драйверов этот флаг установлен,​ то после окончания загрузки всех драйверов менеджер загрузки UEFI инициализирует процедуру пере-связывания всех драйверов и устройств.
 +
 +Переменные **SysPrep####​** инициализируют загрузку системных утилит. Переменная **SysPrepOrder** определяет последовательность утилит. Системных утилита должна выполнить свои действия и вернуть управление менеджеру загрузки UEFI. Утилиты не остаются в памяти,​ если нужен резидентный код, то его нужно загружать как **Driver####​**.
 +
 +Переменные **Boot####​** отвечают за загрузку загрузчиков ОС. Переменная **BootOrder** определяет приоритет загрузки загрузчиков ОС. Загрузчик обязан определить возможность загрузки ОС и принять решение - будет он загружать ОС или нет. Если ОС не будет загружаться,​ то загрузчик должен просто вернуть управление менеджеру загрузки UEFI. Если же ОС будет загружаться,​ то загрузчик должен уведомить об этом менеджера загрузки UEFI специальным вызовом. Этот вызов имеет принципиальное значение,​ т.к. те услуги которые UEFI обеспечивает для ОС гораздо уже и более ограничены чем те, которые доступны в процессе инициализации системы. И Именно для переключения режима услуг необходимо такое уведомление от загрузчика.
 +
 +На работу менеджера загрузки влияют как переменные **DriverOrder**,​ **SysPrepOrder** и **BootOrder**,​ так и значение флага LOAD_OPTION_ACTIVE устанавливаемого в поле атрибутов загрузочной записи (Driver####,​ SysPrep#### или Boot####). Загрузочные записи с неактивным флагом LOAD_OPTION_ACTIVE игнорируются менеджером загрузки UEFI даже если эти записи указаны в переменной задающей порядок/​приоритет (**DriverOrder**,​ **SysPrepOrder** или **BootOrder**). Также игнорируются записи с активным флагом LOAD_OPTION_ACTIVE,​ но не включенные в переменную задающую порядок/​приоритет.
 +
 +Менеджер загрузки UEFI в нормальном режиме работы сначала загружает все активные **Driver####​** упомянутые в **DriverOrder** и в том порядке,​ в котором они записаны в **DriverOrder**,​ затем загружает все активные **SysPrep####​**,​ указанные в **SysPrepOrder**,​ в указанном там порядке,​ а после этого пытается загрузить активный загрузчик ОС (**Boot####​**) в порядке указанном в **BootOrder**. А вот если ни одна из активных записей упомянутых **BootOrder** не смогла загрузить ОС (все вернули управление менеджеру загрузки UEFI), то запускается процесс восстановления.
 +
 +Процесс восстановления настраивается переменными **OsRecovery####​** и **PlatformRecovery####​**. Если эти переменные не заданы,​ то менеджер загрузки UEFI пытается произвести загрузку по умолчанию:​ загружается загрузчик хранящийся по пути \EFI\BOOT\BOOT{machine type short-name}.EFI,​ где {machine type short-name} - одно из:
 +
 +  * IA32 - для 32-х битной платформы c INTEL-подобным процессором
 +  * x64  - для 64-х битной платформы c INTEL-подобным процессором
 +  * IA64 - для 64-х битной платформы с INTEL Itanium процессором
 +  * ARM  - для 32-х битной платформы c ARM процессором
 +  * AA64 - для 64-х битной платформы c ARM процессором
 +
 +Если загрузка по умолчанию не прошла,​ то менеджер загрузки UEFI сдается и выводит сообщение о невозможности дальнейшей загрузки системы.
 +
 +Если заданы **OsRecovery####​** и/или **PlatformRecovery####​**,​ то сначала выполняются **OsRecovery####​** и после этого менеджер загрузки UEFI пробует снова загрузить одну из **Boot####​** указанных в **BootOrder** и пробует загрузку по умолчанию. ​
 +
 +Если и после этого ни один загрузчик не начал загрузку ОС, то выполняются **PlatformRecovery####​**,​ но после выполнения записей **PlatformRecovery####​** загрузка начинается сначала:​ с **Driver####​**,​ затем **SysPrep####​**,​ а только после этого пробует снова загрузить одну из **Boot####​** указанных в **BootOrder** и загрузку по умолчанию. И вот если уже и после этого не удалось запустить загрузку ОС, то менеджер загрузки UEFI сдается и выводит сообщение о невозможности дальнейшей загрузки системы.
 +
 +Отдельно нужно упомянуть возможность манипуляции приоритетом загрузки ОС заданным в **BootOrder**. Если задана переменная **BootNext** (в ней указывается номер одной из записей **Boot####​**,​ которая должна быть активной),​ то менеджер загрузки пробует сначала загрузить запись **Boot####​** указанную в **BootNext**,​ и только если загрузить ОС по этой записи не удалось,​ то менеджер загрузки переходит к загрузке в соответствии с **BootOrder**. При этом **BootNext** удаляется в любом случае.
 +
 +Еще один способ изменения приоритета загрузки ОС - выбор записи **Boot####​** по нажатию кнопки на клавиатуре в процессе загрузки. Для реализации такого механизма нужно привязать кнопку к записи **Boot####​**. И если кнопка будет нажата,​ то менеджер загрузки пробует сначала загрузить запись **Boot####​** привязанную к кнопке,​ и только если загрузить ОС по этой записи не удалось,​ то менеджер загрузки переходит к загрузке в соответствии с **BootOrder**.
 +
 +Практически все функции и настройки менеджера загрузки UEFI позволяет настроить утилита **efibootmgr** (смотрите man efibootmgr что бы узнать как).
 +
 +----
 +
 +Вот такие серьезные возможности обеспечивает менеджер загрузки UEFI. Фактически в нем реализован весь функционал классических менеджеров загрузки ОС поддерживающих мультизагрузку (загрузку нескольких ос или нескольких версий одной ОС). Причем в вопросах восстановления функционал менеджера загрузки UEFI даже шире за счет того, что он реализуется в процессе инициализации системы. ​
 +
 +Таким образом UEFI делает такие загрузчики (например GRUB) фактически ненужными. И ниже мы поговорим о том, [[https://​help.ubuntu.ru/​wiki/​uefi#​%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0_%D1%8F%D0%B4%D1%80%D0%B0_linux_%D0%BD%D0%B5%D0%BF%D0%BE%D1%81%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE_%D0%B8%D0%B7_uefi|как можно организовать загрузку ОС Linux из UEFI без дополнительных загрузчиков]].
 ===== Secure Boot ===== ===== Secure Boot =====
 Особого упоминания требует такая особенность UEFI как Secure Boot. Особого упоминания требует такая особенность UEFI как Secure Boot.
Строка 113: Строка 170:
 <note warning>​Обратите внимание:​ режим SecureBoot включается для всего компьютера,​ а это означает,​ что правильно подписанными должны быть все загрузчики (всех установленных ОС), утилиты и драйвера,​ которые загружаются с ESP раздела.</​note>​ <note warning>​Обратите внимание:​ режим SecureBoot включается для всего компьютера,​ а это означает,​ что правильно подписанными должны быть все загрузчики (всех установленных ОС), утилиты и драйвера,​ которые загружаются с ESP раздела.</​note>​
  
-===== Ключи системы Secure Boot =====+==== Ключи системы Secure Boot ====
 На самом деле в энергонезависимой памяти компьютера (NVRAM) рассчитанного на работу с UEFI предусмотрено место не на один сертификат,​ более того, сертификаты хранятся в специально организованной,​ иерархической системе. Давайте рассмотри этот вопрос более детально,​ но начнем с того, что определим - что такое сами ключи, о которых мы тут говорим. На самом деле в энергонезависимой памяти компьютера (NVRAM) рассчитанного на работу с UEFI предусмотрено место не на один сертификат,​ более того, сертификаты хранятся в специально организованной,​ иерархической системе. Давайте рассмотри этот вопрос более детально,​ но начнем с того, что определим - что такое сами ключи, о которых мы тут говорим.
  
Строка 153: Строка 210:
  
 Причем в ключи в db (dbt) могут добавляться и автоматически (если это предусмотрено конкретной реализацией UEFI): когда подпись загружаемого модуля не может быть проверена,​ то могут быть предусмотрены механизмы (поиск в массиве на диске или интерактивное подтверждение от авторизованного пользователя),​ которые разрешат добавить публичный ключ от подписи (подпись содержит публичный ключ для своей проверки) в db (или dbt). Причем в ключи в db (dbt) могут добавляться и автоматически (если это предусмотрено конкретной реализацией UEFI): когда подпись загружаемого модуля не может быть проверена,​ то могут быть предусмотрены механизмы (поиск в массиве на диске или интерактивное подтверждение от авторизованного пользователя),​ которые разрешат добавить публичный ключ от подписи (подпись содержит публичный ключ для своей проверки) в db (или dbt).
-===== Собственные ключи ​===== +==== Собственные ключи ====
 Так как все ключи/​сертификаты UEFI (PK, KEK, db) построены на основе открытых стандартов,​ то и весь набор этих ключей можно сформировать самостоятельно. Далее рассмотрим как это можно сделать,​ а вот [[https://​habrahabr.ru/​post/​273497/​|тут]] описано все тоже другим толковым автором. Так как все ключи/​сертификаты UEFI (PK, KEK, db) построены на основе открытых стандартов,​ то и весь набор этих ключей можно сформировать самостоятельно. Далее рассмотрим как это можно сделать,​ а вот [[https://​habrahabr.ru/​post/​273497/​|тут]] описано все тоже другим толковым автором.
  
Строка 159: Строка 216:
  
 Для работы нам потребуются утилита openssh (практически во всех дистрибутивах Linux эта утилита уже установлена) и утилиты из пакета efitools (доступна в репозиориях ubuntu((для установки выполните:​ sudo apt-get install efitools))). Для работы нам потребуются утилита openssh (практически во всех дистрибутивах Linux эта утилита уже установлена) и утилиты из пакета efitools (доступна в репозиориях ubuntu((для установки выполните:​ sudo apt-get install efitools))).
-==== Создание ключей ​=====+=== Создание ключей ====
 Для начала создадим наш тестовый ключ и само-подписанный сертификат:​ Для начала создадим наш тестовый ключ и само-подписанный сертификат:​
  
Строка 175: Строка 232:
 c752155d-093f-4441-87c3-20e2352205ac</​code>​ c752155d-093f-4441-87c3-20e2352205ac</​code>​
  
-==== Создание UEFI ключей ​=====+=== Создание UEFI ключей ====
 Для того что бы установить наш ключ в базу ключей UEFI, нам потребуется специальны контейнер EFI_SIGNATURE_LIST,​ в котором будет задана переменная EFI_VARIABLE_AUTHENTICATION_2. Для упрощения,​ ключи в контейнере будут само-подписанными. Для того что бы установить наш ключ в базу ключей UEFI, нам потребуется специальны контейнер EFI_SIGNATURE_LIST,​ в котором будет задана переменная EFI_VARIABLE_AUTHENTICATION_2. Для упрощения,​ ключи в контейнере будут само-подписанными.
  
Строка 194: Строка 251:
  
 Кроме того, все известные сертификаты от разработчиков linux (Canonical, Fedora, AltLinux, openSUSE и др.) - тоже само-подписанные,​ их вы можете найти в на сайте проекта [[http://​www.rodsbooks.com/​refind/​|rEFInd]] или в проекте [[https://​github.com/​slytomcat/​UEFI-Boot/​tree/​master/​keys|UEFI-Boot на github]]</​note>​ Кроме того, все известные сертификаты от разработчиков linux (Canonical, Fedora, AltLinux, openSUSE и др.) - тоже само-подписанные,​ их вы можете найти в на сайте проекта [[http://​www.rodsbooks.com/​refind/​|rEFInd]] или в проекте [[https://​github.com/​slytomcat/​UEFI-Boot/​tree/​master/​keys|UEFI-Boot на github]]</​note>​
-==== Создание хранилища ключей ​=====+=== Создание хранилища ключей ===
 Далее нам потребуется создать хранилище ключей в стандартном месте, где утилита sbkeysync будет их искать. Далее нам потребуется создать хранилище ключей в стандартном месте, где утилита sbkeysync будет их искать.
  
Строка 204: Строка 261:
 На самом деле вы можете создать хранилище где угодно и указать утилите sbkeysync где оно находится в значении ключа --keystore. На самом деле вы можете создать хранилище где угодно и указать утилите sbkeysync где оно находится в значении ключа --keystore.
  
-==== Загрузка ключей ​==== +=== Загрузка ключей === 
-=== Через утилиту прошивки ​=== +== Через утилиту прошивки == 
 Загрузка ключей в UEFI может быть выполнена из утилиты настройки вашей материнской платы. Там нужно будет найти раздел (обычно Security) где задаются параметры SecureBoot. Возможно потребуется явно разрешить работу с ключами - выбрать режим управления ключами custom или как либо еще. Загрузка ключей в UEFI может быть выполнена из утилиты настройки вашей материнской платы. Там нужно будет найти раздел (обычно Security) где задаются параметры SecureBoot. Возможно потребуется явно разрешить работу с ключами - выбрать режим управления ключами custom или как либо еще.
 Попав в окно утилиты по управлению ключами,​ первым делом сохраните (на всякий случай) фабричные ключи((Если ваша прошивка предоставляет опцию установки/​восстановления фабричных ключей,​ то свою резервную копию фабричных ключей вам создавать не обязательно.)). После этого удалите все фабричные ключи, и по одному добавляйте ключи из вашего хранилища ключей (скорее всего, его придется перенести на ESP раздел,​ т.к. только этот раздел доступен для UEFI).\\ Попав в окно утилиты по управлению ключами,​ первым делом сохраните (на всякий случай) фабричные ключи((Если ваша прошивка предоставляет опцию установки/​восстановления фабричных ключей,​ то свою резервную копию фабричных ключей вам создавать не обязательно.)). После этого удалите все фабричные ключи, и по одному добавляйте ключи из вашего хранилища ключей (скорее всего, его придется перенести на ESP раздел,​ т.к. только этот раздел доступен для UEFI).\\
Строка 212: Строка 269:
  
 Следует также отметить,​ что формат,​ в котором прошивка умеет загружать ключи может разниться в разных прошивках UEFI. Например прошивка AMI из недавно купленного мини-PC может взять сертификат и из подготовленного контейнера,​ и непосредственно из файла .pem. Т.о. вся эта возня со специальными контейнерами,​ в этом случае,​ вовсе не нужна: один и тот же само-подписанный сертификат можно загрузить и в PK, и в KEK, и в db.    ​ Следует также отметить,​ что формат,​ в котором прошивка умеет загружать ключи может разниться в разных прошивках UEFI. Например прошивка AMI из недавно купленного мини-PC может взять сертификат и из подготовленного контейнера,​ и непосредственно из файла .pem. Т.о. вся эта возня со специальными контейнерами,​ в этом случае,​ вовсе не нужна: один и тот же само-подписанный сертификат можно загрузить и в PK, и в KEK, и в db.    ​
-=== Используя sbkeysync ​=== +== Используя sbkeysync ==
 Если UEFI находится в Setup режиме,​ то ключи можно загрузить и из ОС, используя утилиту sbkeysync. Но для начала воспользуйтесь опцией --dry-run, что бы убедится,​ что у вас все верно настроено и готово к этому важному процессу:​ Если UEFI находится в Setup режиме,​ то ключи можно загрузить и из ОС, используя утилиту sbkeysync. Но для начала воспользуйтесь опцией --dry-run, что бы убедится,​ что у вас все верно настроено и готово к этому важному процессу:​
  
Строка 246: Строка 303:
 <note important>​Будьте предельно осторожны выполняя загрузку ключей,​ т.к. как только PK будет записан прошивка UEFI перейдет в режим User, а в некоторых прошивках это еще автоматом включит SecureBoot режим. Вы должны быть уверены,​ что прошивка UEFI позволит вам вернутся в Setup режим и/или удалить PK.</​note>​ <note important>​Будьте предельно осторожны выполняя загрузку ключей,​ т.к. как только PK будет записан прошивка UEFI перейдет в режим User, а в некоторых прошивках это еще автоматом включит SecureBoot режим. Вы должны быть уверены,​ что прошивка UEFI позволит вам вернутся в Setup режим и/или удалить PK.</​note>​
 <​note>​Некоторые прошивки требуют перезагрузки для применения этих изменений в переменных UEFI. Прежде чем вы выполните перезагрузку,​ обязательно подпишите ваш загрузчик,​ иначе просто ничего не загрузится,​ ведь SecureBoot активирован и в db прописан ключ, которым будет проверяться подпись любого кода, который будет загружаться UEFI.</​note>​ <​note>​Некоторые прошивки требуют перезагрузки для применения этих изменений в переменных UEFI. Прежде чем вы выполните перезагрузку,​ обязательно подпишите ваш загрузчик,​ иначе просто ничего не загрузится,​ ведь SecureBoot активирован и в db прописан ключ, которым будет проверяться подпись любого кода, который будет загружаться UEFI.</​note>​
-==== Подписывание загрузчика ​====+=== Подписывание загрузчика ===
 Т.к. мы активировали SecureBoot, то теперь нам нужно подписать наш загрузчик что бы он мог быть загружен UEFI в этом режиме. ​ Т.к. мы активировали SecureBoot, то теперь нам нужно подписать наш загрузчик что бы он мог быть загружен UEFI в этом режиме. ​
 В нашем примере мы подпишем код загрузчика GRUB2. В нашем примере мы подпишем код загрузчика GRUB2.
Строка 257: Строка 314:
 Теперь,​ можно скрестить пальцы,​ плюнуть три раза через левое плечо ;-) и попробовать перегрузиться :-o Теперь,​ можно скрестить пальцы,​ плюнуть три раза через левое плечо ;-) и попробовать перегрузиться :-o
  
-==== Возврат в режим Setup ====+=== Возврат в режим Setup ===
 Переключаться обратно в режим Setup лучше всего из прошивки UEFI, однако теоретически это возможно и внутри OS. Т.к. мы имеем секретный ключ от нашего PK, мы можем попробовать вернуть UEFI из режима User в режим Setup. Для этого потребуется подготовить пустой ключ и записать его в переменную PK: Переключаться обратно в режим Setup лучше всего из прошивки UEFI, однако теоретически это возможно и внутри OS. Т.к. мы имеем секретный ключ от нашего PK, мы можем попробовать вернуть UEFI из режима User в режим Setup. Для этого потребуется подготовить пустой ключ и записать его в переменную PK:
  
Строка 336: Строка 393:
  
 EFI shell имеет довольно обширный набор команд,​ все их тут описывать смысла нет - если не достаточно встроенной подсказки,​ то есть ​ краткие руководства в Internet. Наиболее полное писание UEFI Shell и его команд я нашел только в [[http://​www.uefi.org/​sites/​default/​files/​resources/​UEFI_Shell_Spec_2_0.pdf|спецификации UEFI Shell 2.0 на сайте UEFI.org]]. ​ EFI shell имеет довольно обширный набор команд,​ все их тут описывать смысла нет - если не достаточно встроенной подсказки,​ то есть ​ краткие руководства в Internet. Наиболее полное писание UEFI Shell и его команд я нашел только в [[http://​www.uefi.org/​sites/​default/​files/​resources/​UEFI_Shell_Spec_2_0.pdf|спецификации UEFI Shell 2.0 на сайте UEFI.org]]. ​
-==== Загрузка ядра из UEFI ====+==== Загрузка ядра ​Linux непосредственно ​из UEFI ====
 Если вы взгляните в файловом менеджере на ядро (/​boot/​vmlinuz*) то вы можете немало удивиться,​ заметив что тип будет указан как "​DOS/​Windows executable"​ - не удивляйтесь. Все последние ядра в Ubuntu собираются с опцией UEFISTUB (поддержка загрузки в режиме UEFI). А это добавляет заголовок аналогичный ДОСовскому .exe (именно так должны собираться все UEFI приложения). Т.е. само ядро можно загрузить как UEFI приложение. Для этого нужно разобраться с двумя основными вопросами:​ Если вы взгляните в файловом менеджере на ядро (/​boot/​vmlinuz*) то вы можете немало удивиться,​ заметив что тип будет указан как "​DOS/​Windows executable"​ - не удивляйтесь. Все последние ядра в Ubuntu собираются с опцией UEFISTUB (поддержка загрузки в режиме UEFI). А это добавляет заголовок аналогичный ДОСовскому .exe (именно так должны собираться все UEFI приложения). Т.е. само ядро можно загрузить как UEFI приложение. Для этого нужно разобраться с двумя основными вопросами:​
  
Строка 389: Строка 446:
 <​code>​bcfg driver add 0 EFI\drivers\ext2_x64.efi "​EXT2-4 Driver"</​code>​ <​code>​bcfg driver add 0 EFI\drivers\ext2_x64.efi "​EXT2-4 Driver"</​code>​
  
-Все замечательно и этот драйвер,​ при каждом запуске системы,​ будет загружаться во время инициализации UEFI автоматически,​ но ремапинга не будет. Для того, что бы после загрузки драйвера инициировать ремапинг нужно в опции загрузки драйвера указать специальный атрибут LOAD_OPTION_FORCE_RECONNECT,​ однако ни одной командой UEFI-Shell или опцией efibootmgr этот атрибут не установить (по крайней мере мне не удалось найти такой команды). Перелопатив спецификацию UEFI можно понять,​ что нужно то всего прописать значение 3 вместо 1 в первом 32-битном слове UEFI переменной отвечающей за загрузку драйвера (той самой Driver0000, что мы создали командой bcfg или efibootmgr). Сделать это изменение можно любым HEX редактором (из загруженной системы),​ запущенным с правами рута, в котором на редактирование открывается файл /​sys/​firmware/​efi/​efivars/​Driver0000-8be4df61-93ca-11d2-aa0d-00e098032b8c (это маппинг в файловую систему sys переменной UEFI). В редакторе нужно байт ​с адресом 04 поменять с значения 01 на 03 и сохранить файл. +Все замечательно и этот драйвер,​ при каждом запуске системы,​ будет загружаться во время инициализации UEFI автоматически,​ но ремапинга не будет. Для того, чтобы после загрузки драйвера инициировать ремапинг нужно в опции загрузки драйвера указать специальный атрибут LOAD_OPTION_FORCE_RECONNECT,​ однако ни одной командой UEFI-Shell или опцией efibootmgr этот атрибут не установить (по крайней мере мне не удалось найти такой команды). Перелопатив спецификацию UEFI можно понять,​ что нужно то всего прописать значение 3 вместо 1 в первом 32-битном слове UEFI переменной отвечающей за загрузку драйвера (той самой Driver0000, что мы создали командой bcfg или efibootmgr). Сделать это изменение можно любым HEX редактором (из загруженной системы),​ запущенным с правами рута, в котором на редактирование открывается файл /​sys/​firmware/​efi/​efivars/​Driver0000-8be4df61-93ca-11d2-aa0d-00e098032b8c (это маппинг в файловую систему sys переменной UEFI). В редакторе нужно ​5-й байт от начала ​поменять с значения 01 на 03 и сохранить файл. 
-<note important>​Я конечно понимаю,​ что такой хакерский метод - это уже просто за гранью разумного для большинства пользователей UBUNTU, но пока мне не удалось найти другого пути задать атрибут LOAD_OPTION_FORCE_RECONNECT в опции загрузки драйвера. ​</​note>​ +<note important>​После серии окирпиченных патчем Бармина машин (см. ниже эту замечательную историю) все UEFI переменные теперь защищены от изменений специальным атрибутом. Снять его перед редактированием можно командой chattr -i от рута. 
-<note important>​После серии окирпиченных патчем Бармина машин (см. ниже ​эту замечательную историювсе UEFI переменные теперь ​защищены от изменений ​специальным атрибутом. Снять его перед редактированием можно командой chattr -i</​note>​+ 
 +Хорошим тоном будет вернуть защиту после редактирования командой chattr +i </​note>​ 
 + 
 +<note important>​Я конечно понимаю,​ что такой хакерский метод - это уже просто за гранью разумного для большинства пользователей UBUNTU, но пока мне не удалось найти другого пути задать атрибут LOAD_OPTION_FORCE_RECONNECT в опции загрузки драйвера. Поэтому я завел [[https://​github.com/​rhboot/​efibootmgr/​issues/​108|ишью ​на гитхабе]] с просьбой ​авторам ​efibootmgr реализовать ​эту ​возможность. Позднее я даже оформил [[https://​github.com/​rhboot/​efibootmgr/​pull/​109|PR]] (Pull Request) с реализацией этой возможности. Однако этот PR добавили в мастер ветку только 7 месяцев спустя. И, видимо, эта ​новая возможность efibootmgr появится в версии 17. 
 +</​note>​
    
 После нашей хакерской атаки на UEFI 8-) можно перегрузиться в UEFI-Shell и там прямо при запуске увидеть,​ что все EXT4 разделы уже отмаплены в FS<n> "​диски",​ а значит на них можно сослаться при задании команды загрузки для опции загрузки ОС. После нашей хакерской атаки на UEFI 8-) можно перегрузиться в UEFI-Shell и там прямо при запуске увидеть,​ что все EXT4 разделы уже отмаплены в FS<n> "​диски",​ а значит на них можно сослаться при задании команды загрузки для опции загрузки ОС.
Строка 398: Строка 459:
 Если вы все сделали правильно и не забыли подписать драйвер (если у вас включен SecureBoot),​ то поле перезагрузки система успешно должна загрузится прямо с вашего корневого раздела. Если вы все сделали правильно и не забыли подписать драйвер (если у вас включен SecureBoot),​ то поле перезагрузки система успешно должна загрузится прямо с вашего корневого раздела.
  
-Несмотря на сложность этого метода в реализации ​- прелесть его в том, что можно организовать загрузку самого свежего и предыдущего ядер используя только линки в корневой ​файловой системе (они создаются и обновляются автоматически) и один ​дополнительный файл на ESP разделе (драйвер). Одновременно, это решение максимально использует возможности ​заложенные в стандарт UEFI.+В принципе,​ несмотря на некоторую ​сложность этого метода в реализации, это **САМЫЙ ПРАВИЛЬНЫЙ ​вариант загрузки ядра Linux из UEFI**. 
 +Дополнительные ​удобства создают постоянно обновляемые ссылки на последнее ​и предыдущее ядра и их initrd ​в корне файловой системы Linux. На них можно однократно ​создать пункты загрузки UEFI и не нужно никаких ​обновлений после установки/удаления ядер и обновления initrd. Также однократно ​надо скопировать в EFS раздел драйвер для ФС корня и однократно настроить его загрузку.
  
 === Вариант 2: Скопировать ядро и intrd в ESP раздел === === Вариант 2: Скопировать ядро и intrd в ESP раздел ===
Строка 419: Строка 481:
 <note important>​Загрузка,​ организованная одним из вышеописанных способов,​ не требует наличия загрузчика (GRUB и Shim можно и нужно удалить из системы),​ ведь мы передаем UEFI все функции загрузчика ОС.  <note important>​Загрузка,​ организованная одним из вышеописанных способов,​ не требует наличия загрузчика (GRUB и Shim можно и нужно удалить из системы),​ ведь мы передаем UEFI все функции загрузчика ОС. 
  
-Устранение из процесса загрузки загрузчиков (оригинально это цепочка из двух: shim + GRUB) заметно (но не так что бы очень значительно) сокращает время загрузки ОС. Вот как это выглядит в цифрах на примере ​моего свежего mini-pc (I5 5257U, 8Gb RAM, SSD): утилита systemd-analyze сообщает,​ что на стадию работы загрузчиков в случае цепочки UEFI-Shim-GRUB-Kernel требуется чуть меньше секунды - 967ms, а на прямую загрузку UEFI-Kernel - 153ms. При полной (холодной) загрузке системы за ~14 секунд выигрыш составляет порядка 6%.</​note>​+Устранение из процесса загрузки загрузчиков (оригинально это цепочка из двух: shim + GRUB) заметно (но не так что бы очень значительно) сокращает время загрузки ОС. Вот как это выглядит в цифрах на примере одного mini-pc (I5 5257U, 8Gb RAM, SSD): утилита systemd-analyze сообщает,​ что на стадию работы загрузчиков в случае цепочки UEFI-Shim-GRUB-Kernel требуется чуть меньше секунды - 967ms, а на прямую загрузку UEFI-Kernel - 153ms. При полной (холодной) загрузке системы за ~14 секунд выигрыш составляет порядка 6%.</​note>​
  
 ===== Полезные утилиты для UEFI ===== ===== Полезные утилиты для UEFI =====
 В стандартных репозиториях Ubuntu есть несколько полезных пакетов с утилитами для работы с настройками UEFI. В стандартных репозиториях Ubuntu есть несколько полезных пакетов с утилитами для работы с настройками UEFI.
-  * efibootmgr - утилита,​ которой можно менять настройки загрузки UEFI, в частности:​ настраивать приоритет загрузки,​ создавать/​изменять/​удалять загрузочные записи UEFI. +  ​* **efibootmgr** - утилита,​ которой можно менять настройки загрузки UEFI, в частности:​ настраивать приоритет загрузки,​ создавать/​изменять/​удалять загрузочные записи UEFI. 
-  * efivar - простая утилита для работы с переменными UEFI. +  ​* **efivar** - простая утилита для работы с переменными UEFI. 
-  * efitool - набор утилит и efi-приложений для работы с ключами/​сертификатами,​ используемыми при загрузке в режиме Secure Boot. +  ​* **efitool** - набор утилит и efi-приложений для работы с ключами/​сертификатами,​ используемыми при загрузке в режиме Secure Boot. 
-  * sbsigntool - утилиты для подписывания и проверки подписей UEFI-приложений,​ для организации загрузки в Secure Boot режиме.+  ​* **sbsigntool** - утилиты для подписывания и проверки подписей UEFI-приложений,​ для организации загрузки в Secure Boot режиме.
 У всех этих утилит есть вполне толковые man-руководства и есть примеры использованию в Интернете,​ поэтому я не стану останавливаться на деталях использования этих утилит. У всех этих утилит есть вполне толковые man-руководства и есть примеры использованию в Интернете,​ поэтому я не стану останавливаться на деталях использования этих утилит.
  
Строка 440: Строка 502:
  
 После этой новости состоялся [[https://​github.com/​systemd/​systemd/​issues/​2402|наезд]] на разработчиков SystemD (ну на них многие любят наезжать и ругаться,​ а те собственно сами довольно часто дают повод для вполне обоснованной и справедливой ругани в свой адрес):​ мол какого лешего,​ SystemD монтирует эти переменные с возможностью записи!?​ Давайте типа быстро переделайте на монтирование в режиме только-чтение. На что был дан резонный ответ - доступ на запись нужен утилитам,​ и разрешена запись только руту, который при желании премонтирует эти переменные в режиме записи. Так что, это не защитит от <​del>​идиотов</​del>​ <​del>​дураков</​del>​ "​умников",​ которые экспериментируют с патчем Бармина. После этой новости состоялся [[https://​github.com/​systemd/​systemd/​issues/​2402|наезд]] на разработчиков SystemD (ну на них многие любят наезжать и ругаться,​ а те собственно сами довольно часто дают повод для вполне обоснованной и справедливой ругани в свой адрес):​ мол какого лешего,​ SystemD монтирует эти переменные с возможностью записи!?​ Давайте типа быстро переделайте на монтирование в режиме только-чтение. На что был дан резонный ответ - доступ на запись нужен утилитам,​ и разрешена запись только руту, который при желании премонтирует эти переменные в режиме записи. Так что, это не защитит от <​del>​идиотов</​del>​ <​del>​дураков</​del>​ "​умников",​ которые экспериментируют с патчем Бармина.
 +
 +Правда позже некоторые контрмеры все-таки были предприняты:​ теперь все UEFI переменные монтируются со специальным атрибутом,​ который запрещает запись и удаление этих файлов даже руту. Однако root в состоянии снять эти флаги (сhattr -i <имя файла>​). Так что теперь для повторения судьбы арчевода с ноутбуком MCI нужно не только специальный ключ в команде rm -rf задавать,​ но еще и предварительно снять защиту с перемнных UEFI.
  
 Самое же примечательное в этой ситуации ИМХО в том, что 20 лет назад отпущенная шутка, до сих пор стреляет,​ да еще с невиданной доселе мощью. 8-) Самое же примечательное в этой ситуации ИМХО в том, что 20 лет назад отпущенная шутка, до сих пор стреляет,​ да еще с невиданной доселе мощью. 8-)
 +<​note>​Т.е. если раньше патч успешно уничтожал ОС на компьютере,​ то теперь стало возможным еще и вывести из строя компьютер (при кривой реализации UEFI).</​note>​
  
    
Строка 448: Строка 513:
 [[https://​ru.wikipedia.org/​wiki/​Extensible_Firmware_Interface|Википедия о UEFI]] \\ [[https://​ru.wikipedia.org/​wiki/​Extensible_Firmware_Interface|Википедия о UEFI]] \\
 [[https://​ru.wikipedia.org/​wiki/​%D0%A2%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0_%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%BE%D0%B2_GUID|Википедия о GPT]]\\ [[https://​ru.wikipedia.org/​wiki/​%D0%A2%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0_%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%BE%D0%B2_GUID|Википедия о GPT]]\\
-[[https://​wiki.archlinux.org/​index.php/​Unified_Extensible_Firmware_Interface_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)|Очень подробная Wiki по UEFI (к сожалению не полностью переведенная на русский язык)]]  +[[https://​wiki.archlinux.org/​index.php/​Unified_Extensible_Firmware_Interface_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)|Очень подробная Wiki по UEFI]] (к сожалению не полностью переведенная на русский язык)\\ 
-[[https://​habrahabr.ru/​post/​267953/​|Очень толковая статья о SecureBoot и методах борьбы с ним.+[[https://​habrahabr.ru/​post/​267953/​|Очень толковая статья о SecureBoot и методах борьбы с ним.]]
  
 {{tag>​uefi boot}} {{tag>​uefi boot}}