Налаштування UEFI-завантажувача. Саме коротке керівництво у світі

Як влаштована завантаження сучасних ОС? Як при установці системи налаштувати завантаження допомогою UEFI, не потонувши в посібниках і нічого не зламавши?
Я обіцяв "саме короткий посібник". Ось воно:
  1. Створюємо на диску, таблицю розділів GPT
  2. Створюємо FAT32-розділ на пару сотень мегабайт
  3. Викачуємо з інтернету будь-UEFI-завантажувач і кладемо його на цей розділ
  4. Налаштовуємо конфіг завантажувача
    (Якщо на диску встановлена Windows 8 або 10 — з великою ймовірністю це керівництво скорочується до пунктів 3 і 4.)

Як робити не треба
Є, насправді, кілька способів 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-завантажувач, який є в складі пакету 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-пакет. Використовую на своєму ноут. Вміє створювати завантажувальний меню автоматично, без конфига — просто скануючи файли.
Clover. Дозволяє виставляти нативне дозвіл екрана, має підтримку миші на екрані, різні теми оформлення. Дефолтна тема жахлива, конфіг у вигляді xml його не можна прочитати, налаштувати не зміг.
Різні неочевидні наслідки
Ви можете легко спробувати цю схему в роботі.
Берете USB-флешку, форматуєте в таблицю розділів GPT, створюєте FAT розділ і скопіювати туди завантажувач. Комп зможе з неї стартувати.
Якщо просто скопіювати на таку флешку boot-розділ встановленого linux — система буде спокійно завантажитися з флешки, не бачачи різниці.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.