Как устроена загрузка современных ОС? Как при установке системы настроить загрузку посредством UEFI, не утонув в руководствах и ничего не сломав?
Я обещал "самое краткое руководство". Вот оно:
- Создаём на диске таблицу разделов GPT
- Создаём FAT32-раздел на пару сотен мегабайт
- Скачиваем из интернета любой UEFI-загрузчик
(нам нужен сам загрузчик, это один бинарный файл!) - Переименовываем и кладем этот файл на созданный раздел по адресу /EFI/Boot/bootx64.efi
- Создаём текстовый конфиг, кладем его там, где загрузчик ожидает его увидеть
(настройка и местоположение конфига зависят от конкретной реализации загрузчика, эта информация доступна в интернете) - После перезагрузки видим меню загрузчика
(Если на диске установлена 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-пакета. Использую на своём ноуте. Умеет создавать загрузочное меню автоматически, без конфига — просто сканируя файлы.
Clover. Позволяет выставлять нативное разрешение экрана, имеет поддержку мыши на экране загрузки, разные темы оформления. Дефолтная тема ужасна, конфиг в виде xml нечитаем, настроить не смог.
Различные неочевидные последствия
Вы можете легко попробовать эту схему в работе. Берёте USB-флешку, форматируете в таблицу разделов GPT, создаете FAT-раздел и копируете туда загрузчик. Комп сможет с неё стартовать.
Если просто скопировать на такую флешку boot-раздел установленного linux — система будет спокойно загружаться с флешки, не видя разницы.
Комментарии (83)
arhangelsoft
04.11.2016 15:22На сколько понимаю, если кривыми руками полезу в загрузчик, у меня большая вероятность превратить винт в кирпич. Собственно как сделать дамп оригинального загрузчика, а в случае кирпича вернуть его на место?
Если это возможно, это должно быть первым шагом перед любыми манипуляциями над загрузчиком)
Если просто скопировать на такую флешку boot-раздел установленного linux — система будет спокойно загружаться с флешки, не видя разницы.
Я правильно понимаю, что можно клонировать загрузчик на флешку, удалить оригинал с винчестера, и в итоге у меня получается что-то вроде HASP-а для запуска системы?
P.S.
Очень интересно будет почитать исполнение на тему: как поставить любой linux параллельно с windows 8+ при наличии лицензии на оную и UEFI-загрузчика, без виртуалок, ничего не сломав.
Narical
04.11.2016 16:20+2Кирпичится не винт, а материнка, точнее микросхема UEFI. После этого решается только одним способом — выпаиванием чипа, перепрошивкой на программаторе и припаиванием обратно. Опасность возникает при добавлении пунктов в меню загрузки, потому что они хранятся в NVRAM чипа. Если очень не повезло, то окирпичить комп может операционка, причем в худших случаях — просто при старте с live-cd (без какой-либо записи на диск). Так было с Ubuntu и ноутами Samsung. Если ничего не путаю, производитель менял пострадавшим мать по гарантии, но не факт что всем.
Манипуляции над загрузчиком, если иметь в виду манипуляции с файлами на EFI-разделе, абсолютно безопасны. Опасность возникает, когда ты вдруг понимаешь, что только что написал команду efibootmgr и собираешься её запустить. К слову, если ты набрал её на маке — то с высокой степенью вероятности получишь кирпич )) потому что формат прошивки UEFI у них свой, линуксовая прога там всё порушит. Моя статья как раз о том, что НЕ НАДО использовать команды, изменяющие NVRAM.
> Я правильно понимаю, что можно клонировать загрузчик на флешку, удалить оригинал с винчестера, и в итоге у меня получается что-то вроде HASP-а для запуска системы?
Да. Перед тем, как писать статью, я вдоволь поигрался с флешкой. Удалять вот файлы на системном диске не пробовал, но должно сработать.
> Очень интересно будет почитать исполнение на тему: как поставить любой linux параллельно с windows 8+ при наличии лицензии на оную и UEFI-загрузчика, без виртуалок, ничего не сломав.
Я могу тебе тут в паре предложений рассказать. Ставишь обе системы в произвольном порядке, в линуксе если инсталлер предложит поставить загрузчик — отказываешься. Винда создаст EFI-раздел (при разбитии диска она его сама создаёт), на него пихает свой загрузчик в папку /EFI/Microsoft/ и прописывает в NVRAM микросхемы UEFI загрузочную запись «Windows Boot Manager» с путём к загрузчику. Заходишь в биос, в списке порядка загрузки помимо дисковых устройств появится эта запись. Ты меняешь загрузку обратно на диск. В этом случае при старте UEFI будет искать загрузчик в «пути по умолчанию», то есть попытается запустить файл /EFI/Boot/bootx64.efi
Скорее всего это сработает, потому что винда туда копию своего загрузчика наверняка делает. Ну если юзер выставит загрузку с диска вместо Windows Boot Manager, чтоб у него винда грузилась. Так вот, дальше по моей статье — находишь бинарник с загрузчиком, заменяешь им виндовый в «пути по умолчанию» (в папке Microsoft не трогаешь), кидаешь куда надо текстовый конфиг, прописываешь пути для запуска линукса и винды, и после ребута новый загрузчик покажет уже свое загрузочное меню, которые ты сам настроил.
При этом «ничего не сломав» гарантируется тем фактом, что в любой момент ты можешь в биосе выставить загрузку в Windows Boot Manager, который находится /EFI/Microsoft и который ты не трогаешь совсем. То есть, винда гарантированно не пострадает.Itachi261092
08.11.2016 16:54Я правильно понял, когда винда ставится, она патчит микросхему UEFI своей записью на Windows Boot Manager и этого никак не избежать без бубна?
И ещё — выше были комментарии по поводу livecd и других операций, которые лезут в NVRAM и могут кирпичнуть мать. Можно поподробнее как/когда и при каких условиях? То есть, я при каких то действиях, могу даже не подозревать, что софт в процессе своей обычной работы лезет в NVRAM UEFI и что то там меняет? Как так жить то?AlexLysenko
16.02.2017 14:01Мы решили в игровое применение не лезть — там решений и так множество, тем более что для нас в приоритете портретная ориентация телефона, а большинство игр — это про ландшафтную ориентацию.
Narical
08.11.2016 20:20То есть, я при каких то действиях, могу даже не подозревать, что софт в процессе своей обычной работы лезет в NVRAM UEFI и что то там меняет? Как так жить то?
Окирпичивание без действий со стороны может произойти в исключительных случаях, когда в конретной модели конкретного производителя есть ошибка.
mtt
04.11.2016 15:22«Берёте USB-флешку, форматируете в таблицу разделов GPT» — Как это сделать?
Tihon_V
04.11.2016 16:26+4В Linux#: fdisk /dev/sdX
fdisk> g
fdisk> wwin32asm
05.11.2016 10:49в линухе лучше пользоваться не fdisk-ом а parted-ом — fdisk только «недавно» GPT научили.
parted mktable gpt
Narical
04.11.2016 16:39У меня просто винды под рукой нет, чтобы посмотреть.
Когда 10 винда устанавливается на новый диск, она его как раз в GPT конвертирует — то есть она это гарантированно умеет.
pfactum
04.11.2016 15:23> Не надо использовать GRUB
Может, конечно, и так, но вдруг вам захотелось сделать нормальное полнодисковое шифрование?Narical
04.11.2016 16:25Нет, когда нужны возможности конкретного загрузчика — то его конечно и надо использовать. Просто у меня уже крик души, я постоянно наблюдаю что люди ставят себе Grub, нередко с большим трудом, когда можно обойтись куда меньшей кровью.
Tihon_V
04.11.2016 16:35Обычно /boot — не шифруют. А LUKS — работает точно также (ручками передаем параметры ядру).
pfactum
04.11.2016 17:16Я потому и говорю «нормальное полнодисковое», включая /boot.
Garrett
05.11.2016 14:29Возможно это описание прольёт свет: https://wiki.archlinux.org/index.php/systemd-boot#Encrypted_Root_Installations
xtala
04.11.2016 15:47+1>>Не надо использовать GRUB
Да, только при мультибуте юниксов с виндой возникает знатный пердолинг с этими вашими GPT и UEFI. А вот старый добрый MBR и GRUB честно тянет тележку без танцев с бубнами. Может для каких-то мега объемных дата-систем и актуально это дело, но для большинства домашних систем нужно как козе баян.Narical
04.11.2016 16:27Вот я и статью задумал, чтобы рассказать что есть прямая и короткая дорога без пердолинга.
Реализация подкачала )
Laney1
04.11.2016 17:11+3Жесткое ограничение на число разделов, постоянное «какого хрена эта флешка не определяется как загрузочная, я же сделал все по инструкции», если не дай бог выбрал не то место для установки линуксового загрузчика — не увидишь либо линукс, либо винду. До сих пор помню команды fixboot и fixmbr.
Так что лично я очень рад, что этот отход жизнедеятельности мамонта под названием MBR наконец закопали. Единственная проблема, с которой я сталкивался на компьютерах с UEFI — это выбор темы покрасивее для refind.xtala
04.11.2016 21:15>>какого хрена эта флешка не определяется как загрузочная, я же сделал все по инструкции
Используете самурайский метод — dd в консоли как диды завещали?:) Не знаю таких проблем. Делаю загрузочные флешки с Unetbootin в линуксе или в UltraISO под окнами. Ни разу факапов не было. Все грузится спокойно, что установочная винды, что лайв флешка с Убунтой.
>> если не дай бог выбрал не то место для установки линуксового загрузчика — не увидишь либо линукс, либо винду
Откуда вы такие проблемы себе роете? Подозреваю, что стараетесь реализовывать нетривиальные решения, ну тогда могу посоветовать перестать выбирать шашечки, а заняться реальной работой. Проверенно — когда не хватает времени на работу, про выбор шашечек забываешь. Как в общем и про системы где постоянно требуется знание тантрического секса на бубне типа Генту или Арч.
Prototik
04.11.2016 19:12Да не, не оченьxtala
04.11.2016 20:14Ну с Arch линукс может все и безоблачно, но у меня с Убунтой, Win7 и GPT вышли какие то проблемы, сейчас уж и не вспомню, что там было. Вроде Убунта говорила, что жесткий диск не видит, на который предварительно была установлена винда с GPT. Переустановил винду с MBR и сразу все завелось без всякого выпендрежа. С разделами тоже проблем у меня нет. У меня три жестких диска: 1TB, 500ГБ, 320ГБ. Линукс установлен на диск 1TB, диск разбит на несколько разделов в разных форматах естественно. Не пойму зачем мне этот ваш GPT и UEFI, если у меня и так все работает?
Prototik
04.11.2016 22:28+3Это проблемы исключительных дистров. Убунту — совсем уже исключительный.
Не пойму зачем мне этот ваш GPT и UEFI, если у меня и так все работает?
Так-то можно и на ms-dos до сих пор сидеть — а чё, там тоже всё работает.xtala
04.11.2016 22:42Деаа?? И чем отличается работа в системе загруженной через GRUB + MBR от системы загруженной Gpt + НЕХ. Чем? Расскажите — посмешите.
Prototik
04.11.2016 22:48+5Ну, например, фреймбуфер на всех этапах загрузки, а не жалкий VGA.
Ну, например, упирание в два терабайта для MBR.
Ну, например, нормальные драйверы на этапе инициализации, а не 16-битные огрызки.
Ну, например, secure boot.
Ну, например, отсутствие проблем «да где этот чертов загрузочный сектор».
Ну, например, создание несколько больше, чем 4 (7) разделов.
Ну как, ржёте там небось, да?sumanai
04.11.2016 23:30Ну, например, упирание в два терабайта для MBR.
Актуально только для загрузочного диска. У меня два 3ТБ диска и режим BIOS, так как XP x64 ничего не знает про UEFI, а GPT для дисков с данными умеет.
xtala
04.11.2016 23:44-4Я просил указать чем отличается работа в загруженной системе, а не ваши прохладные истории пердолинга с шашечками на стадии загрузки. Или пердолинг с шашечками на стадии загрузки это ваша основная деятельность? Тада пардоньте. Единственный явный плюс который для реальных дел это поддержка жестких дисков 2тб + ну и хочу сказать, что я имею ввиду домашние машины, а не серверные монстры.
Prototik
04.11.2016 23:49Я тоже много чего просил. Только вот какое отношение загрузка имеет к процессу работы? Перефразирую более понятно для пердолящих всё и вся: как процесс доставка товара может изменить свойства самого товара? Совершенно неважно, привезёте ли вы мебель на самолёте из другой страны или его джамшуты за бутылку принесут из соседнего магазина — мебель то одна.
xtala
05.11.2016 07:59Ну да. Перефразирую старый анекдот про бананы и пальмы на новый лад.
Загружается юзер на своем писюке, а за спиной кулхацкер ходит и под нос бубнит: «ну как так можно… Загружаешься… Загружаешься через граб и на жестком диске мбр, а не гпт… Посмотри на меня! Я закончил MIT, прочел статью на хабре, просидел ночь, укокошил один жесткий диск ковыряясь в его прошивке, но зато я теперь гружусь в гпт! Вот тебе ссылочка на статью на хабре приступай к экспериментам! „
Юзер: “И что же я получу в итоге?»
Кулхацкер удивленно: «Как что? Ты будешь грузить систему! „polifill
06.11.2016 09:00Да разные могут быть причины.
И использование 2+ гиговых дисков, и загрузка ОС на ZFS и пр. и пр.
Narical
05.11.2016 10:14Интересно, с чего вы решили, что речь идет об установленных и работающих системах?
Мне казалось очевидным, что настройка загрузчика это неотъемлемый шаг именно установки.
А про выбор MS-DOS+MBR против GPT+EFI — большинство возражений, которые я встречал, сводятся к «Я не понимаю как это работает, и не хочу разбираться». Конечно, за исключением редких случаев, когда есть какая-то необходимость именно в первом варианте. Просто те, кто разобрался, перестают видеть хоть какой-то смысл в ставить систему «по старому».
helg1978
04.11.2016 15:50подскажите, а как без GRUBа всякие quiet splash, nomodeset и прочие параметры ядру передать?
Tihon_V
04.11.2016 16:29Например так?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 quiet splash nomodeset»Narical
04.11.2016 16:31Это относится к пункту «как не надо делать»)
Tihon_V
04.11.2016 16:37Почему? Пожалуй именно этого описания не хватает.
Narical
04.11.2016 16:44Последствиям от необходимости юзеру писать в NVRAM посвящено полстатьи. И про кирпичи, и про то что неудобно, что параметры на лету не поменяешь, и что строка длинная и сложная получается, с высоким шансом ошибиться/опечататься
Tihon_V
04.11.2016 16:57Тогда тогда изменить параметры «на лету»? Поставить GRUB? Дописать параметры в /etc/modprobe.d/? Использовать efishell для загрузки nsh-скрипта? Вопрос ведь не в записи в nvram — в случае изменения одного параметра (AHCI/IDE) мы и ранее окирпичивали Windows, здесь же мы удалим пути к EFI программам установленными производителем.
Narical
04.11.2016 17:11> здесь же мы удалим пути к EFI программам установленными производителем.
Вот этого не понял. А параметры на лету умеет менять не только Grub.Tihon_V
04.11.2016 17:28efibootmgr --helpefibootmgr # получили список всех возможных загрузчиков для efi
efibootmgr -B -b XXXX # удалили ненужную запись
efibootmgr -c -L "..." -l "..." # добавили новую
efibootmgr --bootorder XXXX,YYYY,ZZZZ # изменили порядок загрузки
rm -rf /sys/firmware/efi/efivars/* # выстрелить себе в ногу и биться головой об столNarical
04.11.2016 17:58Ясно, я считал что efivars это просто переменные.
Tihon_V
04.11.2016 21:31efivars — это и есть переменные. Думаю что стоит почитать статьи CodeRush, или дождаться когда он расскажет о efivars и зачем они нужны сам :)
CodeRush
04.11.2016 22:28+1efivars — это такая псевдо-ФС в Linux, абстракция над UEFI runtime-сервисами для работы с переменными — GetVariable, SetVariable, GetNextVariableName и QueryVariableInfo.
Зачем эту псевдо-ФС по умолчанию монтируют на запись — мне не ведомо, скорее всего для efibootmgr вышеупомянутого. Вследствие того, что конкретные реализации прошивок не всегда следуют последним стандартам, а efibootmgr — не самая всезнающая утилита, то на некоторых машинах её использование действительно приводит к «кирпичу», поэтому в этом смысле я согласен с автором — положи загрузчик на ESP в \EFI\BOOT\boot{архитектура}.efi и пусть диспетчер BDS прошивки сам его найдет и добавит в BootOrder/BootXXXX заведомо правильным образом.
Что же до использования GRUB/shim/bootmgr/черта-лысого — это вкусовщина и у делу не относится.
Если вам интересно, как устроены переменные BootXXXX и BootOrder, первая устроена вот так, а вторая — просто список из UINT16, этих самых XXXX.
Проблема же efibootmgr в том, что она пытается угадать формат DevicePath, который в различных версиях стандарта периодически обновляется, а у некоторых вендоров имеет и свои собственные расширения, поэтому если вы можете ей не пользоваться — лучше и не пользуйтесь, во избежание.
Narical
04.11.2016 16:30Grub — это один из многих загрузчиков, очень навороченный.
Во всех остальных загрузчиках параметры ядру передаются абсолютно так же — прописываются в текстовом конфиге либо меняются «на лету» прям перед загрузкой (зависит уже от конкретной реализации).
Идея в том, что 7 строчек конфига и 3 файла у systemd-boot гораздо легче настраиваются, чем Grub, при одинаковом в принципе результате — на выходе меню со списком загрузки.
7313
04.11.2016 15:59А зачем для загрузки винды отдельный диск и почему именно Fat32? :) Папка EFI вполне замечательно видится загрузчиком даже если она лежит на большом NTFS разделе рядом с папкой Windows. Главное чтобы в файле EFI\Microsoft\Boot\BCD все правильно было прописано.
sumanai
04.11.2016 16:04+2Папка EFI вполне замечательно видится загрузчиком даже если она лежит на большом NTFS разделе
Это если в UEFI есть драйверы на эту ФС. Стандарт предписывает обязательную поддержку только FAT, поэтому форматирование в FAT32 является наиболее совместимой конфигурацией.
Forked
04.11.2016 16:29Говоря о копировании в /boot, или приводя такие команды, как
, неплохо было бы заметить, что в /boot должен быть примонтирован этот EFI-раздел с FAT32.bootctl install --path=/boot
Кстати, EFI-раздел на диске в формате GPT имеет тип EF00. А как будет себя вести система, если тип EF00 не будет найден на дисках?Narical
04.11.2016 16:35Я проверил на флешке и трех разных загрузчиках. Комп подхватывает fat-раздел в качестве ефишного, хотя тип у него 0700 Microsoft basic data.
Forked
04.11.2016 17:05Думаю, Вами верно замечено, что производители реализуют UEFI, как им заблагорассудится. И тот рецепт, что подошел для одного комплекта оборудования, вполне может не подойти для другого. У меня после смены матери (на ASUS-B150) стал игнорироваться загрузчик EFI\Boot\Bootx64.efi (который systemd-boot), а загружался EFI\ubuntu\grubx64.efi Пока не нашел в BIOS-firmware переключатель Boot-mode: Windows/OtherOS и не переключил его в OtherOS.
sanja1989
04.11.2016 16:31Интересует, как правильно настроить загрузчик, расположенный на разделе одного из дисков, для загрузки нескольких ОС (Windows, OS X и Linux) с разных дисков. Сейчас использую Clover с USB флэшки, что бы загружать OS X, установленный на отдельный жёсткий диск. Без флешки просто запускается Windows.
LinuxComp
04.11.2016 17:47Я понял проблему так: вы пользуетесь хакинтошем, и вы намеренно установили его на внешний жёсткий диск. Вам неудобно, что если хотите загрузиться в хакинтош, вам кроме внешнего жёсткого диска приходится вставлять ещё и флешку с кловером.
Я бы сделал так.
1) Установил бы первым загрузчиком rEFInd. По-моему самый удобный и красивый загрузчик.
2) Установил бы clover вторым загрузчиком. Вроде как он заточен именно под загрузку яблок.
3) REFInd имеет возможность обнаруживать установленные ОС даже без конфигурации конфига. Вы можете настроить, чтобы наряду с Linux и Windows в его меню отображался clover. В rEFInd есть возможность сразу добавить в меню мак, но я думаю это будет работать только на настоящих маках.
4) Когда нужен win или lin, выбираете их из меню rEFInd при включении. Если нужен хакинтош — выбираете кловер, затем, попав в него, уже выбираете мак с подключенного жёсткого диска.
Проблема решена — загрузочная флешка с кловером больше не нужна.sanja1989
07.11.2016 13:28Спасибо, обязательно попробую так сделать.
И попробую добавить OS X в rEFInd, так как железо у меня всё совместимо с маками — мои процессор, материнка и видеокарта ставятся в маки и OS X с ними работает как с родным железом. Если получится, постараюсь описать процесс с ньюансами :)
Установил не на внешний, а на внутренний, но разницы нет, я так думаю.sumanai
07.11.2016 17:13И попробую добавить OS X в rEFInd, так как железо у меня всё совместимо с маками
Там не только железо, но и свои приколы с UEFI, на обход которых и рассчитан clover. Так что экспериментировать вам никто не запрещает, но считаю, что это ничем не закончится, макось не запустится.
dotter
04.11.2016 18:41На компьютере установлены Windows 10 + Linux Mint, загрузчик — rEFInd.
Проблема в том, что если загрузить компьютер в Windows, то в биосе сбрасывается загрузчик на Windows Boot Manager, и компьютер после этого будет загружаться в Windows, вместо rEFInd.
Как это можно исправить?Narical
04.11.2016 18:42https://ubuntuforums.org/showthread.php?t=2294337&p=13383524#post13383524
то что нашёл навскидкуdotter
04.11.2016 22:40Спасибо за попытку, но не помогло. Как сбрасывалось на Windows Boot Manager, так и продолжает сбрасываться.
Fullmoon
06.11.2016 09:31Попробуйте армейский способ — подменить Windows Boot Manager, bootmgr.efi, переименованным refind_x64.efi, а оригинал положить рядом, под именем, скажем, bootmgr_orig.efi. С клевером у меня это работает прекрасно.
Только проверьте, что rEFInd работает с прямыми путями, а не относительными.
Cyber100
04.11.2016 19:30мой коммент будет откровением, но для uefi достаточно 48МB
Narical
04.11.2016 20:00И хотел бы я посмеяться над этими словами, да не получается. Когда-то я считал так-же, и себе сделал раздел 100 Мб, чтоб «с запасом». А теперь живу и мучаюсь — появилась необходимость держать две системы, и внезапно выяснилось — чуть больше 50 Мб ядро занимает. Если перед обновлением забуду fallback-ядро удалить, то обновление обламывается, а вот модули новые поставиться успевают. После ребута система мертва. А чтобы места добавить — это надо весь стек ресайзить: фс, потом логический том LVM, потом группу томов, и потом физический смещать. Называется пожалел 200 метров. Да, про вторую систему и предполагать не мог, а вот поди ж ты.
NeonMercury
04.11.2016 19:46+1Ещё один важный момент, если я не ошибаюсь. Если у вас x86 железо и UEFI, то вместо этого:
Переименовываем и кладем этот файл на созданный раздел по адресу /EFI/Boot/bootx64.efi
Надо файл назвать /EFI/Boot/bootia32.efi
Такого уже осталось очень мало, но мне пока попадается, особенно дешёвые китайские планшеты (Intel, x86, x64)
dmitryrublev
04.11.2016 20:56+1Asus VivoTab Smart (ME400) как раз 32-разрядный, буду сегодня пробовать.
Спасибо за наводку.
h31
04.11.2016 20:14А кто-нибудь пробовал мигрировать установленную Windows 7 с MBR/BIOS на GPT/UEFI? Если просто сменить разметку диска с помощью gdisk, венда перестает загружаться. Раздел на месте (другая венда отлично его видит), линукс тоже без проблем работает. Обидно, поменял разметку диска по сути от скуки, и потерял установленную и обжитую систему.
surefire
04.11.2016 23:46Вполне удачно мигрировал.
Нужно на ESP положить загрузчик со всеми потрохами, настроить BCD и всё.
Fullmoon
05.11.2016 09:49Clover.… конфиг в виде xml нечитаем, настроить не смог.
Должен отметить, что это следствие его узкого назначения. Да, его можно использовать как универсальный загрузчик — примерно с тем же успехом, что и виндовый. Если сумеете настроить, ага.
Кстати, может кто-нибудь подсказать, как можно победить винду, при каждой загрузке выставляющую в NVRAM свой загрузчик первым и по умолчанию? Я это решил только армейским способом, переименовав cloverx64.efi в bootmgr.efi, но может, это просто как-то отключается?NeonMercury
05.11.2016 11:38К сожалению, подсказать не смогу, но могу обратить ещё внимание на то, что при некоторых обновлениях винды (редких, но такое было на моей памяти несколько раз) она обновляет и свой загрузчик тоже, тем самым перезаписывая ваш переименованный файл.
PS: В некоторых UEFI можно в настройках активировать "boot order lock", что не позволит винде менять порядок загрузчиков. Но я видел это только на lenovo.
Fullmoon
06.11.2016 09:24Да, я с этим сталкивался, почему и хочу сменить армейский способ на что-то встроенное. Впрочем, заменить файл всё равно проще, чем перебивать команды bcfg.
syavadee
05.11.2016 09:49Объясните зачем это нужно и что раньше было не так?
Narical
06.11.2016 09:14В первых двух предложениях я написал, зачем статья:
1. Рассказать, что происходит «под капотом» при загрузке ОС в UEFI-режиме
2. Рассказать, как при установке системы установить и настроить загрузчик
Основной причиной написания статьи является тот факт, что мой способ настройки проще и безопасней, чем в подавляющем большинстве руководств по установке системы в режиме UEFI
Вернёмся к вашему вопросу, который я не понимаю и от которого у меня болит голова)
Что именно «зачем нужно»? Когда «раньше»?
Если вопрос означает «У меня всё и так работает, зачем мне это перенастраивать» — ответ будет «Вам это не нужно, но знания могут пригодиться при переустановке системы или при возникновении проблем»
Если вопрос означает «Я предпочитаю старый способ загрузки с использованием таблицы разделов MS-DOS и MBR, зачем мне UEFI» — ответ будет «Загрузка в UEFI-режиме гораздо проще для понимания, настройки и исправления проблем. И установка нескольких ОС на один диск гораздо проще.»
bigfatbrowncat
06.11.2016 01:50А вы не могли бы рассказать, как Clover на Хакинтоше заставить нормально грузить с диска Ubuntu? Мне не удалось настроить.
pashuk
06.11.2016 21:02А что конкретно у вас не заработало?
У меня Clover видит и Windows и Ubuntu и MacOS.
Причём знаний у меня на уровне — скачал iso, записал в rufus на флешку, выбрал GPT при записи, поставил с флешки.
Там единственная хитрость — я запускал efi shell из clover и путь до инсталлятора ubuntu набивал руками.
что-то типа
cd FS0:
\EFI\BOOT\BOOTX64.efi
этот путь на флешке с ubuntu должен быть — запускаешь его и загружается инсталлятор ubuntu, исталлятор прописывает запись об ubuntu в EFI раздел.
Clover потом подхватывает эту запись из EFI раздела — всё работает.
bigfatbrowncat
10.11.2016 22:02Я пытаюсь стартануть Ubuntu Live с флешки и получаю пустой черный экран. Если выбрать в Bios загрузку с флешки напрямую, всё грузится нормально. Как это победить?
ATauenis
08.11.2016 22:47Скачиваем из интернета любой UEFI-загрузчик
(нам нужен сам загрузчик, это один бинарный файл!)
Переименовываем и кладем этот файл на созданный раздел по адресу /EFI/Boot/bootx64.efi
NTLDR.EXE от Win2000 SP4 пойдёт? А копия boot-сектора с винта с RHEL 3? (шутка)
Лучше напишите, как отличить гуашевые загрузчики отнормальныхстарорежимых.Narical
09.11.2016 06:11Поиском отличать. Первая же ссылка по поиску «UEFI bootloader» даёт довольно исчерпывающую информацию.
Другое дело, что я действительно неправ, предлагая искать «любой загрузчик», по-хорошему нужна конкретика. Про «любой» я написал, чтобы дать понять что тут нет особой загрузочной магии, т.е. для более понятного объяснения самого процесса. Не хотелось бы превращать статью в руководство по настройке одного конкретного загрузчика, когда она призвана быть как можно более общей.
samodum
Это руководство в стиле «как нарисовать сову»
Narical
Напишите с какого места непонятно. Можно в личку. Я допишу если нужно.
andrzzc
Мне тоже непонятно.
1. Прошивка UEFI (чип) ищет GPT-диск и запускает файл (загрузчик) по фиксированному пути
2. Загрузчик читает /loader/loader.conf со списком пунктов меню — в примере по умолчанию выбирается archlinux
3. Загрузчик для выбранного пункта меню читает конфиг пункта меню — в файле /entries/arch.conf, раздел 'Arch Linux'.
Каким образом archlinux сочетается с /entries/arch.conf и текстом Arch Linux? Как загрузчик нашел файл из которого читать конфиг пункта меню?
4. Загрузчик запускает Linux с нужными опциями
В опциях указана обычная опция initrd /efi/archlinux/initramfs-linux.img, а также дополнительный параметр ядра initrd=\EFI\archlinux\intel-ucode.img.
Что такое \EFI\archlinux\intel-ucode.img, откуда он взялся и нужен ли он для загрузки?
Narical
Я изменил default arch на default archlinux в тексте, чтобы убрать возможность прочитать слово в значении «архитектура». Имя файла подправить забыл.
Специально указываю, что все настройки — мои собственные, все равно настраивать надо по аналогии, копировать тут смысла нет. intel-ucode это микрокод процессора, для работы не обязателен.
andrzzc
Чтоб настраивать по аналогии, надо чтоб хоть что-то работало :)
Итого, ещё раз повторим инструкцию по рисованию совы:
1. Удалить все имеющиеся загрузочные записи в чипе UEFI
2. После этого чип UEFI запускает загрузчик по фиксированному пути /EFI/Boot/BOOTX64.EFI
3. Загрузчик из systemd-boot читает свой конфиг из /loader/loader.conf
4. Загрузчик из systemd-boot читает свой конфиг из /entries/XXX.conf
5. Загружаемся
Все правильно?
Narical
1. Незачем что-то удалять. Незачем вообще лишний раз трогать. Просто выставить загрузку с диска.
2. Да. И он уже должен работать, даже если не настроен — запускаться, получать управление, отображать меню. Вопрос дальнейшей настройки — чисто механический: открыть в инете документацию, и согласно ей настроить. И необязательно это должен быть systemd-boot, можно и grub зафигачить, и rEFInd, настройки у всех разные — но сам загрузчик должен заработать сразу, как только его положили по нужному пути.
3,4. /loader/entries/xxx.conf (папка entries должна лежать рядом с loader.conf)