Как устроена загрузка современных ОС? Как при установке системы настроить загрузку посредством UEFI, не утонув в руководствах и ничего не сломав?


Я обещал "самое краткое руководство". Вот оно:


  1. Создаём на диске таблицу разделов GPT
  2. Создаём FAT32-раздел на пару сотен мегабайт
  3. Скачиваем из интернета любой UEFI-загрузчик
    (нам нужен сам загрузчик, это один бинарный файл!)
  4. Переименовываем и кладем этот файл на созданный раздел по адресу /EFI/Boot/bootx64.efi
  5. Создаём текстовый конфиг, кладем его там, где загрузчик ожидает его увидеть
    (настройка и местоположение конфига зависят от конкретной реализации загрузчика, эта информация доступна в интернете)
  6. После перезагрузки видим меню загрузчика
    (Если на диске установлена Windows 8 или 10 — с большой вероятностью это руководство сокращается до пунктов 3 — 5.)

TL;DR не надо прописывать путь к загрузчику в новых загрузочных записях UEFI — надо файл загрузчика расположить по стандартному "пути по-умолчанию", где UEFI его найдет, и вместо загрузочного меню UEFI пользоваться меню загрузчика, которое гораздо проще и безопаснее настраивается


Как делать не надо


Есть, на самом-то деле, несколько способов настроить UEFI-загрузку. Я начну с описания других вариантов — чтобы было понятно, как (и почему) делать не надо. Если вы пришли за руководством — мотайте в самый низ.


Не надо лезть в NVRAM и трогать efivars


Наиболее "популярная" процедура установки загрузчика в систему такова: установщик ОС создаёт специальный раздел, на нём — структуру каталогов и размещает файлы загрузчика. После этого он с помощью особой утилиты (efibootmgr в linux, bcdedit в windows) взаимодействует с прошивкой UEFI-чипа, добавляя в неё загрузочную запись. В этой записи указывается путь к файлу загрузчика (начиная от корня файловой системы) и при необходимости — параметры. После этого в загрузочном меню компьютера появляется опция загрузки ОС. Для linux существует возможность вообще обойтись без загрузчика. В загрузочной записи указывается путь сразу к ядру вместе со всеми параметрами. Ядро должно быть скомпилировано с опцией EFISTUB (что давно является стандартом для большинства дистрибутивов), в этом случае оно содержит в себе заголовок "исполняемого файла EFI", позволяющий прошивке его запускать без внешнего загрузчика.


При старте системы, когда пользователь выбирает нужную ему загрузочную запись, прошивка UEFI сперва ищет на прописанном в этой записи диске особый EFI-раздел, обращается к файловой системе на этом разделе (обязательно FAT или FAT32), и запускает загрузчик. Загрузчик считывает из файла настроек свой конфиг, и либо грузит ОС, либо предоставляет загрузочное меню. Ничего не замечаете? Да, у нас два загрузочных меню — одно на уровне прошивки чипа UEFI, другое — на уровне загрузчика. В реальности о существовании второго пользователи могут даже не догадываться — если в меню всего один пункт, загрузчик Windows начинает его грузить без лишних вопросов. Увидеть экран с этим меню можно, если поставить вторую копию Windows или просто криво её переустановить.


Обычно для управления загрузочными записями руководства в интернете предлагают взаимодействовать с прошивкой UEFI. Есть аж пять основных вариантов, как это можно сделать: efibootmgr под linux, bcdedit в windows, какая-то софтина на "Маках", команда bcfg утилиты uefi shell (запускается из-под UEFI, "на голом железе" и без ОС, поскольку скомпилирована в том самом особом формате) и для особо качественных прошивок — графическими средствами UEFI (говоря популярным языком, "в настройках BIOS").


За всеми вышенаписанными "многобуков" вы могли легко упустить такую мысль: пользователь, чтобы изменить настройки программной части (например, добавить параметр запуска ОС), вынужден перезаписывать flash-память микросхемы на плате. Есть ли тут подводные камни? О да! Windows иногда способна сделать из ноутбука кирпич, linux тоже, причём разными способами. Качество прошивок часто оставляет желать лучшего — стандарты UEFI либо реализованы криво, либо не реализованы вообще. По логике, прошивка обязана переживать полное удаление всех переменных efivars без последствий, не хранить в них критичных для себя данных и самостоятельно восстанавливать значения по-умолчанию — просто потому что пользователь имеет к ним доступ, и вероятность их полного удаления далека от нуля. Я лично в процессе экспериментов неоднократно (к счастью, обратимо) "кирпичил" свой Lenovo — из загрузочного меню исчезали все пункты, включая опцию "зайти в настройки".


Работа с загрузочными записями UEFI — тоже не сахар. К примеру, утилита efibootmgr не имеет опции "редактировать существующую запись". Если ты хочешь немного изменить параметр ядра — ты удаляешь запись целиком и добавляешь её снова, уже измененную. При этом строка содержит в себе двойные и одинарные кавычки, а также прямые и обратные слеши в не особо очевидном порядке. Когда я наконец заставил эту магию работать — я сохранил её в виде bash-скриптов, которые до сих пор валяются у меня в корневой ФС:


efibootmgr -c -L "Archlinux (debug)" -l '\EFI\archlinux\vmlinuz-linux' -u "root=/dev/mapper/vg1-lvroot rw initrd=\EFI\archlinux\initramfs-linux.img systemd.log_level=debug systemd.log_target=kmsg log_buf_len=1M enforcing=0"

Не надо использовать GRUB


Это чёртов мастодонт, 90% функциональности которого предназначено для дисков с MBR. Для настройки необходимо отредактировать ряд файлов, после чего выполнить команду генерации конфига. На выходе получается огромная малопонятная нормальному человеку простыня. В составе — гора исполняемых файлов. Ставится командой, которую просто так из головы не возьмешь — надо обязательно лезть в документацию


grub-install --target=x86_64-efi --efi-directory=esp_mount --bootloader-id=grub

Для сравнения — самый простенький UEFI-bootloader, который есть в составе пакета systemd, ставится командой


bootctl install --path=/boot

Эта команда делает ровно две вещи: копирует исполняемый файл загрузчика на EFI-раздел и добавляет свою загрузочную запись в прошивку. А конфиг для неё занимает ровно СЕМЬ строчек.


"Самое краткое руководство" — чуть более подробно


Загрузочное меню надо реализовывать на уровне загрузчика — править текстовые конфиги гораздо проще и безопасней.


Загрузочная запись нам не нужна — дело в том, что при выставлении в настройках BIOS загрузки с диска прошивка UEFI сначала ищет на нём EFI-раздел, а затем пытается исполнить файл по строго фиксированному адресу на этом разделе: /EFI/Boot/BOOTX64.EFI


Что такое "EFI-раздел"? В теории, он должен иметь особый тип "EFI System" (ef00). На практике, годится первый раздел на GPT-диске, отформатированный в FAT32 и имеющий достаточно места, чтобы разместить загрузчик и вспомогательные файлы (если есть).


Пункт 3: "Скачиваем из интернета любой UEFI-загрузчик". Что это значит? Загрузчик — это просто исполняемый файл определенного формата, к которому в комплекте идет конфиг. К примеру, если у вас есть под рукой установленный пакет с systemd — файл загрузчика можно найти по адресу /usr/lib/systemd/boot/efi/systemd-bootx64.efi, переименовать его в bootx64.efi и скопировать в /EFI/Boot/ на EFI-разделе. Нет под рукой systemd? Скачайте архив с сайта Archlinux. Или с репозитария Ubuntu. Или Debian. Есть под рукой система с Windows? Возьмите виндовый загрузчик оттуда, тоже сгодится )) Если сумеете настроить, я честно говоря не пробовал.


Пункт 4: "Настроить конфиг". Как и обычная программа, когда загрузчик запускается — он ожидает найти по определенным путям файлы конфигурации. Обычно эту информацию легко найти в интернете. Для загрузчика systemd-boot нам необходимо в корне EFI-раздела создать каталог "loader", а в нём файл "loader.conf" с тремя строчками (привожу свои):


default     archlinux
timeout     10
editor      1

Параметр editor отвечает за возможность отредактировать пункт загрузочного меню перед запуском.


Рядом с loader.conf необходимо создать каталог entries — один файл в нём будет отвечать за одну загрузочную запись в boot-меню. У меня там один файл arch.conf с таким содержанием:


title          Arch Linux
linux          /efi/archlinux/vmlinuz-linux
initrd         /efi/archlinux/initramfs-linux.img
options        root=/dev/mapper/vg1-lvroot rw initrd=\EFI\archlinux\intel-ucode.img

Я не упомянул, но довольно очевидно — ядро и initramfs должны лежать в одной файловой системе с загрузчиком, то есть на EFI-разделе. Пути к ним в конфигах отсчитываются от корня этой ФС.


Другие загрузчики


systemd-boot очень простой и предоставляет спартанского вида чёрно-белое меню. Есть варианты красивей, если душа просит красоты.


rEFind — очень красивый загрузчик. Скачать можно тут в виде deb-пакета. Использую на своём ноуте. Умеет создавать загрузочное меню автоматически, без конфига — просто сканируя файлы.


Clover. Позволяет выставлять нативное разрешение экрана, имеет поддержку мыши на экране загрузки, разные темы оформления. Дефолтная тема ужасна, конфиг в виде xml нечитаем, настроить не смог.


Различные неочевидные последствия


Вы можете легко попробовать эту схему в работе. Берёте USB-флешку, форматируете в таблицу разделов GPT, создаете FAT-раздел и копируете туда загрузчик. Комп сможет с неё стартовать.


Если просто скопировать на такую флешку boot-раздел установленного linux — система будет спокойно загружаться с флешки, не видя разницы.

Поделиться с друзьями
-->

Комментарии (83)


  1. samodum
    04.11.2016 15:00
    +10

    Это руководство в стиле «как нарисовать сову»


    1. Narical
      04.11.2016 15:03
      +3

      Напишите с какого места непонятно. Можно в личку. Я допишу если нужно.


      1. andrzzc
        05.11.2016 10:20

        Мне тоже непонятно.
        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, откуда он взялся и нужен ли он для загрузки?


        1. Narical
          05.11.2016 10:37

          Я изменил default arch на default archlinux в тексте, чтобы убрать возможность прочитать слово в значении «архитектура». Имя файла подправить забыл.
          Специально указываю, что все настройки — мои собственные, все равно настраивать надо по аналогии, копировать тут смысла нет. intel-ucode это микрокод процессора, для работы не обязателен.


          1. andrzzc
            06.11.2016 01:52

            Чтоб настраивать по аналогии, надо чтоб хоть что-то работало :)
            Итого, ещё раз повторим инструкцию по рисованию совы:
            1. Удалить все имеющиеся загрузочные записи в чипе UEFI
            2. После этого чип UEFI запускает загрузчик по фиксированному пути /EFI/Boot/BOOTX64.EFI
            3. Загрузчик из systemd-boot читает свой конфиг из /loader/loader.conf
            4. Загрузчик из systemd-boot читает свой конфиг из /entries/XXX.conf
            5. Загружаемся
            Все правильно?


            1. Narical
              06.11.2016 08:44

              1. Незачем что-то удалять. Незачем вообще лишний раз трогать. Просто выставить загрузку с диска.

              2. Да. И он уже должен работать, даже если не настроен — запускаться, получать управление, отображать меню. Вопрос дальнейшей настройки — чисто механический: открыть в инете документацию, и согласно ей настроить. И необязательно это должен быть systemd-boot, можно и grub зафигачить, и rEFInd, настройки у всех разные — но сам загрузчик должен заработать сразу, как только его положили по нужному пути.

              3,4. /loader/entries/xxx.conf (папка entries должна лежать рядом с loader.conf)


  1. arhangelsoft
    04.11.2016 15:22

    На сколько понимаю, если кривыми руками полезу в загрузчик, у меня большая вероятность превратить винт в кирпич. Собственно как сделать дамп оригинального загрузчика, а в случае кирпича вернуть его на место?
    Если это возможно, это должно быть первым шагом перед любыми манипуляциями над загрузчиком)

    Если просто скопировать на такую флешку boot-раздел установленного linux — система будет спокойно загружаться с флешки, не видя разницы.

    Я правильно понимаю, что можно клонировать загрузчик на флешку, удалить оригинал с винчестера, и в итоге у меня получается что-то вроде HASP-а для запуска системы?

    P.S.
    Очень интересно будет почитать исполнение на тему: как поставить любой linux параллельно с windows 8+ при наличии лицензии на оную и UEFI-загрузчика, без виртуалок, ничего не сломав.


    1. 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 и который ты не трогаешь совсем. То есть, винда гарантированно не пострадает.


      1. Itachi261092
        08.11.2016 16:54

        Я правильно понял, когда винда ставится, она патчит микросхему UEFI своей записью на Windows Boot Manager и этого никак не избежать без бубна?
        И ещё — выше были комментарии по поводу livecd и других операций, которые лезут в NVRAM и могут кирпичнуть мать. Можно поподробнее как/когда и при каких условиях? То есть, я при каких то действиях, могу даже не подозревать, что софт в процессе своей обычной работы лезет в NVRAM UEFI и что то там меняет? Как так жить то?


        1. AlexLysenko
          16.02.2017 14:01

          Мы решили в игровое применение не лезть — там решений и так множество, тем более что для нас в приоритете портретная ориентация телефона, а большинство игр — это про ландшафтную ориентацию.


        1. Narical
          08.11.2016 20:20

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

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


  1. mtt
    04.11.2016 15:22

    «Берёте USB-флешку, форматируете в таблицу разделов GPT» — Как это сделать?


    1. Tihon_V
      04.11.2016 16:26
      +4

      В Linux
      #: fdisk /dev/sdX
      fdisk> g
      fdisk> w


      1. win32asm
        05.11.2016 10:49

        в линухе лучше пользоваться не fdisk-ом а parted-ом — fdisk только «недавно» GPT научили.
        parted mktable gpt


    1. Narical
      04.11.2016 16:39

      У меня просто винды под рукой нет, чтобы посмотреть.
      Когда 10 винда устанавливается на новый диск, она его как раз в GPT конвертирует — то есть она это гарантированно умеет.


  1. pfactum
    04.11.2016 15:23

    > Не надо использовать GRUB

    Может, конечно, и так, но вдруг вам захотелось сделать нормальное полнодисковое шифрование?


    1. Narical
      04.11.2016 16:25

      Нет, когда нужны возможности конкретного загрузчика — то его конечно и надо использовать. Просто у меня уже крик души, я постоянно наблюдаю что люди ставят себе Grub, нередко с большим трудом, когда можно обойтись куда меньшей кровью.


    1. Tihon_V
      04.11.2016 16:35

      Обычно /boot — не шифруют. А LUKS — работает точно также (ручками передаем параметры ядру).


      1. pfactum
        04.11.2016 17:16

        Я потому и говорю «нормальное полнодисковое», включая /boot.


        1. Garrett
          05.11.2016 14:29

          Возможно это описание прольёт свет: https://wiki.archlinux.org/index.php/systemd-boot#Encrypted_Root_Installations


    1. Laney1
      04.11.2016 17:24
      +3

      вот отличная статья: https://habrahabr.ru/post/308032/


  1. Demon_i
    04.11.2016 15:29
    +1

    Спасибо за статью. Сняло многие вопросы.


  1. xtala
    04.11.2016 15:47
    +1

    >>Не надо использовать GRUB
    Да, только при мультибуте юниксов с виндой возникает знатный пердолинг с этими вашими GPT и UEFI. А вот старый добрый MBR и GRUB честно тянет тележку без танцев с бубнами. Может для каких-то мега объемных дата-систем и актуально это дело, но для большинства домашних систем нужно как козе баян.


    1. Narical
      04.11.2016 16:27

      Вот я и статью задумал, чтобы рассказать что есть прямая и короткая дорога без пердолинга.
      Реализация подкачала )


    1. Laney1
      04.11.2016 17:11
      +3

      Жесткое ограничение на число разделов, постоянное «какого хрена эта флешка не определяется как загрузочная, я же сделал все по инструкции», если не дай бог выбрал не то место для установки линуксового загрузчика — не увидишь либо линукс, либо винду. До сих пор помню команды fixboot и fixmbr.

      Так что лично я очень рад, что этот отход жизнедеятельности мамонта под названием MBR наконец закопали. Единственная проблема, с которой я сталкивался на компьютерах с UEFI — это выбор темы покрасивее для refind.


      1. xtala
        04.11.2016 21:15

        >>какого хрена эта флешка не определяется как загрузочная, я же сделал все по инструкции
        Используете самурайский метод — dd в консоли как диды завещали?:) Не знаю таких проблем. Делаю загрузочные флешки с Unetbootin в линуксе или в UltraISO под окнами. Ни разу факапов не было. Все грузится спокойно, что установочная винды, что лайв флешка с Убунтой.
        >> если не дай бог выбрал не то место для установки линуксового загрузчика — не увидишь либо линукс, либо винду
        Откуда вы такие проблемы себе роете? Подозреваю, что стараетесь реализовывать нетривиальные решения, ну тогда могу посоветовать перестать выбирать шашечки, а заняться реальной работой. Проверенно — когда не хватает времени на работу, про выбор шашечек забываешь. Как в общем и про системы где постоянно требуется знание тантрического секса на бубне типа Генту или Арч.


    1. Prototik
      04.11.2016 19:12

      Да не, не очень


      1. xtala
        04.11.2016 20:14

        Ну с Arch линукс может все и безоблачно, но у меня с Убунтой, Win7 и GPT вышли какие то проблемы, сейчас уж и не вспомню, что там было. Вроде Убунта говорила, что жесткий диск не видит, на который предварительно была установлена винда с GPT. Переустановил винду с MBR и сразу все завелось без всякого выпендрежа. С разделами тоже проблем у меня нет. У меня три жестких диска: 1TB, 500ГБ, 320ГБ. Линукс установлен на диск 1TB, диск разбит на несколько разделов в разных форматах естественно. Не пойму зачем мне этот ваш GPT и UEFI, если у меня и так все работает?


        1. Prototik
          04.11.2016 22:28
          +3

          Это проблемы исключительных дистров. Убунту — совсем уже исключительный.

          Не пойму зачем мне этот ваш GPT и UEFI, если у меня и так все работает?

          Так-то можно и на ms-dos до сих пор сидеть — а чё, там тоже всё работает.


          1. xtala
            04.11.2016 22:42

            Деаа?? И чем отличается работа в системе загруженной через GRUB + MBR от системы загруженной Gpt + НЕХ. Чем? Расскажите — посмешите.


            1. Prototik
              04.11.2016 22:48
              +5

              Ну, например, фреймбуфер на всех этапах загрузки, а не жалкий VGA.
              Ну, например, упирание в два терабайта для MBR.
              Ну, например, нормальные драйверы на этапе инициализации, а не 16-битные огрызки.
              Ну, например, secure boot.
              Ну, например, отсутствие проблем «да где этот чертов загрузочный сектор».
              Ну, например, создание несколько больше, чем 4 (7) разделов.

              Ну как, ржёте там небось, да?


              1. sumanai
                04.11.2016 23:30

                Ну, например, упирание в два терабайта для MBR.

                Актуально только для загрузочного диска. У меня два 3ТБ диска и режим BIOS, так как XP x64 ничего не знает про UEFI, а GPT для дисков с данными умеет.


              1. xtala
                04.11.2016 23:44
                -4

                Я просил указать чем отличается работа в загруженной системе, а не ваши прохладные истории пердолинга с шашечками на стадии загрузки. Или пердолинг с шашечками на стадии загрузки это ваша основная деятельность? Тада пардоньте. Единственный явный плюс который для реальных дел это поддержка жестких дисков 2тб + ну и хочу сказать, что я имею ввиду домашние машины, а не серверные монстры.


                1. Prototik
                  04.11.2016 23:49

                  Я тоже много чего просил. Только вот какое отношение загрузка имеет к процессу работы? Перефразирую более понятно для пердолящих всё и вся: как процесс доставка товара может изменить свойства самого товара? Совершенно неважно, привезёте ли вы мебель на самолёте из другой страны или его джамшуты за бутылку принесут из соседнего магазина — мебель то одна.


                  1. xtala
                    05.11.2016 07:59

                    Ну да. Перефразирую старый анекдот про бананы и пальмы на новый лад.
                    Загружается юзер на своем писюке, а за спиной кулхацкер ходит и под нос бубнит: «ну как так можно… Загружаешься… Загружаешься через граб и на жестком диске мбр, а не гпт… Посмотри на меня! Я закончил MIT, прочел статью на хабре, просидел ночь, укокошил один жесткий диск ковыряясь в его прошивке, но зато я теперь гружусь в гпт! Вот тебе ссылочка на статью на хабре приступай к экспериментам! „
                    Юзер: “И что же я получу в итоге?»
                    Кулхацкер удивленно: «Как что? Ты будешь грузить систему! „


                    1. polifill
                      06.11.2016 09:00

                      Да разные могут быть причины.
                      И использование 2+ гиговых дисков, и загрузка ОС на ZFS и пр. и пр.


        1. Narical
          05.11.2016 10:14

          Интересно, с чего вы решили, что речь идет об установленных и работающих системах?
          Мне казалось очевидным, что настройка загрузчика это неотъемлемый шаг именно установки.

          А про выбор MS-DOS+MBR против GPT+EFI — большинство возражений, которые я встречал, сводятся к «Я не понимаю как это работает, и не хочу разбираться». Конечно, за исключением редких случаев, когда есть какая-то необходимость именно в первом варианте. Просто те, кто разобрался, перестают видеть хоть какой-то смысл в ставить систему «по старому».


  1. helg1978
    04.11.2016 15:50

    подскажите, а как без GRUBа всякие quiet splash, nomodeset и прочие параметры ядру передать?


    1. 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»


      1. Narical
        04.11.2016 16:31

        Это относится к пункту «как не надо делать»)


        1. Tihon_V
          04.11.2016 16:37

          Почему? Пожалуй именно этого описания не хватает.


          1. Narical
            04.11.2016 16:44

            Последствиям от необходимости юзеру писать в NVRAM посвящено полстатьи. И про кирпичи, и про то что неудобно, что параметры на лету не поменяешь, и что строка длинная и сложная получается, с высоким шансом ошибиться/опечататься


            1. Tihon_V
              04.11.2016 16:57

              Тогда тогда изменить параметры «на лету»? Поставить GRUB? Дописать параметры в /etc/modprobe.d/? Использовать efishell для загрузки nsh-скрипта? Вопрос ведь не в записи в nvram — в случае изменения одного параметра (AHCI/IDE) мы и ранее окирпичивали Windows, здесь же мы удалим пути к EFI программам установленными производителем.


              1. Narical
                04.11.2016 17:11

                > здесь же мы удалим пути к EFI программам установленными производителем.
                Вот этого не понял. А параметры на лету умеет менять не только Grub.


                1. Tihon_V
                  04.11.2016 17:28

                  efibootmgr --help
                  efibootmgr # получили список всех возможных загрузчиков для efi
                  efibootmgr -B -b XXXX # удалили ненужную запись
                  efibootmgr -c -L "..." -l "..." # добавили новую
                  efibootmgr --bootorder XXXX,YYYY,ZZZZ # изменили порядок загрузки
                  rm -rf /sys/firmware/efi/efivars/* # выстрелить себе в ногу и биться головой об стол


                  1. Narical
                    04.11.2016 17:58

                    Ясно, я считал что efivars это просто переменные.


                    1. Tihon_V
                      04.11.2016 21:31

                      efivars — это и есть переменные. Думаю что стоит почитать статьи CodeRush, или дождаться когда он расскажет о efivars и зачем они нужны сам :)


                      1. CodeRush
                        04.11.2016 22:28
                        +1

                        efivars — это такая псевдо-ФС в 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, который в различных версиях стандарта периодически обновляется, а у некоторых вендоров имеет и свои собственные расширения, поэтому если вы можете ей не пользоваться — лучше и не пользуйтесь, во избежание.


    1. Narical
      04.11.2016 16:30

      Grub — это один из многих загрузчиков, очень навороченный.
      Во всех остальных загрузчиках параметры ядру передаются абсолютно так же — прописываются в текстовом конфиге либо меняются «на лету» прям перед загрузкой (зависит уже от конкретной реализации).
      Идея в том, что 7 строчек конфига и 3 файла у systemd-boot гораздо легче настраиваются, чем Grub, при одинаковом в принципе результате — на выходе меню со списком загрузки.


  1. 7313
    04.11.2016 15:59

    А зачем для загрузки винды отдельный диск и почему именно Fat32? :) Папка EFI вполне замечательно видится загрузчиком даже если она лежит на большом NTFS разделе рядом с папкой Windows. Главное чтобы в файле EFI\Microsoft\Boot\BCD все правильно было прописано.


    1. sumanai
      04.11.2016 16:04
      +2

      Папка EFI вполне замечательно видится загрузчиком даже если она лежит на большом NTFS разделе

      Это если в UEFI есть драйверы на эту ФС. Стандарт предписывает обязательную поддержку только FAT, поэтому форматирование в FAT32 является наиболее совместимой конфигурацией.


  1. Ununtrium
    04.11.2016 16:13

    Упущено главное: в чем профит? Когда это может понадобиться?


    1. Narical
      04.11.2016 16:32

      Каждый раз при установке linux либо linux+windows в любых сочетаниях?


      1. Ununtrium
        14.11.2016 17:05

        Все продвинутые дистры имеют гуй для этого.


  1. Forked
    04.11.2016 16:29

    Говоря о копировании в /boot, или приводя такие команды, как

    bootctl install --path=/boot
    
    , неплохо было бы заметить, что в /boot должен быть примонтирован этот EFI-раздел с FAT32.

    Кстати, EFI-раздел на диске в формате GPT имеет тип EF00. А как будет себя вести система, если тип EF00 не будет найден на дисках?


    1. Narical
      04.11.2016 16:35

      Я проверил на флешке и трех разных загрузчиках. Комп подхватывает fat-раздел в качестве ефишного, хотя тип у него 0700 Microsoft basic data.


      1. 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.


  1. sanja1989
    04.11.2016 16:31

    Интересует, как правильно настроить загрузчик, расположенный на разделе одного из дисков, для загрузки нескольких ОС (Windows, OS X и Linux) с разных дисков. Сейчас использую Clover с USB флэшки, что бы загружать OS X, установленный на отдельный жёсткий диск. Без флешки просто запускается Windows.


    1. LinuxComp
      04.11.2016 17:47

      Я понял проблему так: вы пользуетесь хакинтошем, и вы намеренно установили его на внешний жёсткий диск. Вам неудобно, что если хотите загрузиться в хакинтош, вам кроме внешнего жёсткого диска приходится вставлять ещё и флешку с кловером.

      Я бы сделал так.
      1) Установил бы первым загрузчиком rEFInd. По-моему самый удобный и красивый загрузчик.
      2) Установил бы clover вторым загрузчиком. Вроде как он заточен именно под загрузку яблок.
      3) REFInd имеет возможность обнаруживать установленные ОС даже без конфигурации конфига. Вы можете настроить, чтобы наряду с Linux и Windows в его меню отображался clover. В rEFInd есть возможность сразу добавить в меню мак, но я думаю это будет работать только на настоящих маках.
      4) Когда нужен win или lin, выбираете их из меню rEFInd при включении. Если нужен хакинтош — выбираете кловер, затем, попав в него, уже выбираете мак с подключенного жёсткого диска.
      Проблема решена — загрузочная флешка с кловером больше не нужна.


      1. sanja1989
        07.11.2016 13:28

        Спасибо, обязательно попробую так сделать.
        И попробую добавить OS X в rEFInd, так как железо у меня всё совместимо с маками — мои процессор, материнка и видеокарта ставятся в маки и OS X с ними работает как с родным железом. Если получится, постараюсь описать процесс с ньюансами :)
        Установил не на внешний, а на внутренний, но разницы нет, я так думаю.


        1. sumanai
          07.11.2016 17:13

          И попробую добавить OS X в rEFInd, так как железо у меня всё совместимо с маками

          Там не только железо, но и свои приколы с UEFI, на обход которых и рассчитан clover. Так что экспериментировать вам никто не запрещает, но считаю, что это ничем не закончится, макось не запустится.


  1. dotter
    04.11.2016 18:41

    На компьютере установлены Windows 10 + Linux Mint, загрузчик — rEFInd.
    Проблема в том, что если загрузить компьютер в Windows, то в биосе сбрасывается загрузчик на Windows Boot Manager, и компьютер после этого будет загружаться в Windows, вместо rEFInd.
    Как это можно исправить?


    1. Narical
      04.11.2016 18:42

      https://ubuntuforums.org/showthread.php?t=2294337&p=13383524#post13383524
      то что нашёл навскидку


      1. dotter
        04.11.2016 22:40

        Спасибо за попытку, но не помогло. Как сбрасывалось на Windows Boot Manager, так и продолжает сбрасываться.


        1. Narical
          05.11.2016 09:51

          Там много чего гуглится по этому вопросу, проблема решаема


        1. Fullmoon
          06.11.2016 09:31

          Попробуйте армейский способ — подменить Windows Boot Manager, bootmgr.efi, переименованным refind_x64.efi, а оригинал положить рядом, под именем, скажем, bootmgr_orig.efi. С клевером у меня это работает прекрасно.
          Только проверьте, что rEFInd работает с прямыми путями, а не относительными.


  1. Cyber100
    04.11.2016 19:30

    мой коммент будет откровением, но для uefi достаточно 48МB


    1. Narical
      04.11.2016 20:00

      И хотел бы я посмеяться над этими словами, да не получается. Когда-то я считал так-же, и себе сделал раздел 100 Мб, чтоб «с запасом». А теперь живу и мучаюсь — появилась необходимость держать две системы, и внезапно выяснилось — чуть больше 50 Мб ядро занимает. Если перед обновлением забуду fallback-ядро удалить, то обновление обламывается, а вот модули новые поставиться успевают. После ребута система мертва. А чтобы места добавить — это надо весь стек ресайзить: фс, потом логический том LVM, потом группу томов, и потом физический смещать. Называется пожалел 200 метров. Да, про вторую систему и предполагать не мог, а вот поди ж ты.


  1. NeonMercury
    04.11.2016 19:46
    +1

    Ещё один важный момент, если я не ошибаюсь. Если у вас x86 железо и UEFI, то вместо этого:


    Переименовываем и кладем этот файл на созданный раздел по адресу /EFI/Boot/bootx64.efi

    Надо файл назвать /EFI/Boot/bootia32.efi


    Такого уже осталось очень мало, но мне пока попадается, особенно дешёвые китайские планшеты (Intel, x86, x64)


    1. dmitryrublev
      04.11.2016 20:56
      +1

      Asus VivoTab Smart (ME400) как раз 32-разрядный, буду сегодня пробовать.
      Спасибо за наводку.


  1. h31
    04.11.2016 20:14

    А кто-нибудь пробовал мигрировать установленную Windows 7 с MBR/BIOS на GPT/UEFI? Если просто сменить разметку диска с помощью gdisk, венда перестает загружаться. Раздел на месте (другая венда отлично его видит), линукс тоже без проблем работает. Обидно, поменял разметку диска по сути от скуки, и потерял установленную и обжитую систему.


    1. surefire
      04.11.2016 23:46

      Вполне удачно мигрировал.
      Нужно на ESP положить загрузчик со всеми потрохами, настроить BCD и всё.


  1. Fullmoon
    05.11.2016 09:49

    Clover.… конфиг в виде xml нечитаем, настроить не смог.
    Должен отметить, что это следствие его узкого назначения. Да, его можно использовать как универсальный загрузчик — примерно с тем же успехом, что и виндовый. Если сумеете настроить, ага.

    Кстати, может кто-нибудь подсказать, как можно победить винду, при каждой загрузке выставляющую в NVRAM свой загрузчик первым и по умолчанию? Я это решил только армейским способом, переименовав cloverx64.efi в bootmgr.efi, но может, это просто как-то отключается?


    1. NeonMercury
      05.11.2016 11:38

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


      PS: В некоторых UEFI можно в настройках активировать "boot order lock", что не позволит винде менять порядок загрузчиков. Но я видел это только на lenovo.


      1. Fullmoon
        06.11.2016 09:24

        Да, я с этим сталкивался, почему и хочу сменить армейский способ на что-то встроенное. Впрочем, заменить файл всё равно проще, чем перебивать команды bcfg.


  1. syavadee
    05.11.2016 09:49

    Объясните зачем это нужно и что раньше было не так?


    1. Narical
      06.11.2016 09:14

      В первых двух предложениях я написал, зачем статья:
      1. Рассказать, что происходит «под капотом» при загрузке ОС в UEFI-режиме
      2. Рассказать, как при установке системы установить и настроить загрузчик

      Основной причиной написания статьи является тот факт, что мой способ настройки проще и безопасней, чем в подавляющем большинстве руководств по установке системы в режиме UEFI

      Вернёмся к вашему вопросу, который я не понимаю и от которого у меня болит голова)
      Что именно «зачем нужно»? Когда «раньше»?

      Если вопрос означает «У меня всё и так работает, зачем мне это перенастраивать» — ответ будет «Вам это не нужно, но знания могут пригодиться при переустановке системы или при возникновении проблем»

      Если вопрос означает «Я предпочитаю старый способ загрузки с использованием таблицы разделов MS-DOS и MBR, зачем мне UEFI» — ответ будет «Загрузка в UEFI-режиме гораздо проще для понимания, настройки и исправления проблем. И установка нескольких ОС на один диск гораздо проще.»


  1. ipekshev
    05.11.2016 11:12

    Спасибо за статью! Очень полезно!


  1. bigfatbrowncat
    06.11.2016 01:50

    А вы не могли бы рассказать, как Clover на Хакинтоше заставить нормально грузить с диска Ubuntu? Мне не удалось настроить.


    1. 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 раздела — всё работает.


      1. bigfatbrowncat
        10.11.2016 22:02

        Я пытаюсь стартануть Ubuntu Live с флешки и получаю пустой черный экран. Если выбрать в Bios загрузку с флешки напрямую, всё грузится нормально. Как это победить?


  1. ATauenis
    08.11.2016 22:47

    Скачиваем из интернета любой UEFI-загрузчик
    (нам нужен сам загрузчик, это один бинарный файл!)
    Переименовываем и кладем этот файл на созданный раздел по адресу /EFI/Boot/bootx64.efi

    NTLDR.EXE от Win2000 SP4 пойдёт? А копия boot-сектора с винта с RHEL 3? (шутка)
    Лучше напишите, как отличить гуашевые загрузчики от нормальных старорежимых.


    1. Narical
      09.11.2016 06:11

      Поиском отличать. Первая же ссылка по поиску «UEFI bootloader» даёт довольно исчерпывающую информацию.
      Другое дело, что я действительно неправ, предлагая искать «любой загрузчик», по-хорошему нужна конкретика. Про «любой» я написал, чтобы дать понять что тут нет особой загрузочной магии, т.е. для более понятного объяснения самого процесса. Не хотелось бы превращать статью в руководство по настройке одного конкретного загрузчика, когда она призвана быть как можно более общей.