Почему большинство дистрибутивов объединяют UEFI и grub?


31

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

Ядра начиная с версии 3.3 поддерживают EFI_STUB, что означает, что ядро ​​может быть загружено непосредственно из UEFI. По какой причине дистрибутивы решают использовать дополнительный загрузчик? В большинстве руководств по Linux / UEFI основное внимание уделяется настройке дополнительного загрузчика (rEFInd, grub2, ELILO и т. Д.) Вместо загрузки Linux с EFI_STUB.

Единственное, чего не хватает в дистрибутивах - это поддержка. Поскольку в большинстве дистрибутивов имеется второй загрузчик, ядро ​​не добавляется в меню загрузки UEFI и не копируется в системный раздел EFI.

Три сценария достаточно, чтобы сделать всю магию. Тот, который копирует initramfs в ESP. Второй копирует ядро ​​в ESP и создает новую запись в меню загрузки UEFI. Третий сценарий удаляет старое ядро ​​и initramfs из ESP и удаляет пункт меню загрузки UEFI. Это позволяет полностью автоматизировать обновления / очистки ядра / initramfs без участия пользователя. Я использую этот подход более года, и он работал безупречно.

Почему большинство дистрибутивов используют grub вместо EFI_STUB?

Ссылки:

РЕДАКТИРОВАТЬ: Я не говорю об удалении поддержки Grub полностью, но предложить выбор для тех, кто хочет использовать его по разным причинам. Дистрибутивы могут предоставить пакет grub-efiдля тех, кто хочет связать UEFI и grub, и пакет, efistub-bootсодержащий скрипты, которые я упомянул выше.


4
Зачем им? Они уже установили методы для работы с / создания файла конфигурации grub. Кроме того, помогает, если все системы (не-UEFI и UEFI) ведут себя одинаково.
Ульрих Дангел

Звучит круто. Но, поскольку по этой ссылке вы можете сделать это, если хотите, возможно, дистрибутивы могут сделать это для вас, возможно, это затруднительное положение. Уверен, некоторые в конечном итоге даст вам возможность, хотя.
Goldilocks

1
@Bakuriu Более простая для понимания система, например, более простая последовательность загрузки, менее выполняемый код и немного более быстрое время загрузки.
Марко

4
Этот вопрос следует отложить, поскольку приведенная причина задержки неверна. На этот вопрос есть простой неоспоримый ответ: UEFI не предоставляет меню загрузки. Некоторые реализации делают. Некоторые этого не делают, потому что для достижения целевого времени загрузки Windows 8 BIOS даже не инициализирует устройства ввода . Не говоря уже о том, чтобы посмотреть, нажмет ли пользователь клавишу. Таким образом, вам придется пройти через Windows, чтобы добраться до Linux, или наоборот. Первый работает на некоторых системах, но я сомневаюсь, что спецификация гарантирует это. Последнее не работает (вы можете войти в настройку UEFI из GRUB, но не из Linux).
sourcejedi

1
@sourcejedi Вы утверждаете, что не соответствует вашим источникам. UEFI предоставляет меню загрузки (хотя интерфейс не совместим между поставщиками). mjg59 означало, что вы не можете получить загрузочное меню без философского компромисса (принимая лицензионное соглашение W8). Но эта проблема будет такой же для инсталляторов с загрузчиками не-EFISTUB. Так что это не отвечает, почему мы бы предпочли grub, а не EFISTUB.
Линчжу Сян

Ответы:


10

Учитывая, что UEFI был определен только в 2005 году, существует множество устаревшего оборудования, которое не поддерживает спецификации. Чтобы добавить UEFI к стандартному дистрибутиву, потребуется тестирование двух путей кода вместо одного, и не только общеизвестно, что загрузочный код заведомо привередлив, но и является одним из самых раздражающих кусков кода для тестирования.


5
Мало того, что тестирование раздражает много времени, это самый раздражающий код, который может пойти не так. Подумайте: что вы предпочитаете, какая-то проблема, когда система работает и работает в основном нормально или не может даже загрузить систему? Загрузчик - определенно одна из частей программного обеспечения, к которой я больше всего не отношусь, если это не необходимо.
CVn

Приведенный выше комментарий @ MichaelKjörling должен быть в Ответе. Переключиться на новый загрузчик очень и очень рискованно. Создатели дистрибутивов хотят, чтобы их пользователи имели хороший опыт, но, более того, они хотят, чтобы каждый потенциальный новый пользователь имел безупречный опыт в первый раз. Мне жаль, что я назвал дистрибутив «дистрибутивом», но он чувствовал себя хорошо в сочетании с создателями.
Йохан

@Johan msw свободен отредактировать этот пункт в ответе, я не против. (ММО не достаточно, чтобы ответить самостоятельно). Тобу и златовласка тоже касаются этой проблемы.
CVn

3

У дистрибутивов ограниченные ресурсы, и не может быть никаких причин, кроме этого. Это может быть достаточно просто и безопасно, но независимо от того, что для этого потребуется больше работ по техническому обслуживанию, потому что опция grub должна быть сохранена, хотя бы для систем без UEFI.

Я уверен, что у всех есть список возможностей и опций, которые они хотели бы видеть в дистрибутивах (я дам вам несколько страниц, смеется), и, без сомнения, многие из них были бы «совершенно легкими, без хлопот, честно говоря. .. ". Однако не существует бесконечного количества человеко-часов для их реализации. Когда мы сталкиваемся с такими решениями («Мы включаем работу в эту функцию против некоторых других?»), Основными вопросами должны быть:

  • Это необходимо? (Ответ здесь - нет).
  • Сколько людей выиграют и сколько? (ИМО: немного, а не много)
  • Есть ли разумная альтернатива, с помощью которой пользователь может приспосабливаться к самому себе, не делая ничего? (Видимо, есть.)

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

Тем не менее, я думаю, что со временем это будет принято в качестве варианта, и я поставил вопрос.


2

Ориентация на загрузчики UEFI в дополнение к grub усложнит контроль и поддержку качества. Дистрибутивы нацелены на grub, а не на спецификации UEFI, потому что grub - это бесплатное программное обеспечение, взломанное, более гибкое и высококачественное. Вы все еще можете получить загрузку с чистого UEFI, следуя инструкциям и подключив раздел UEFI /boot, потому что если вы сделаете это, обслуживание будет за вами.


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

1

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

Все, что вам нужно, это подключить ESP - или там, где вы хотите сохранить ядро ​​- поверх /boot, что вы можете сделать с помощью одной строки /etc/fstab. Сделайте это, и все текущие сценарии обновления ядра просто продолжат работать.

Мой `/ etc / fstab 'выглядит так:

LABEL=ESP /esp vfat defaults 0 2
#
#^ i like a separate mount point - not necessary though
#
/esp/EFI/arch_root /boot none bind,defaults 0 2
#
#^ i keep separate installations in separate directories
#

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

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


1
Я не понимаю, как это может работать. Обратите внимание, что имена файлов ядра и initramfs включают версию. Если сценариев нет, вы загрузите старое ядро ​​после установки нового. Или по-другому: как изменить ядро ​​по умолчанию, чтобы оно указывало на новое? (Мои скрипты используют efobootmgrдля обновления порядка загрузки и изменения ядра по умолчанию).
Марко

@Marco - ну, по умолчанию путь загрузки есть, \EFI\BOOT\BOOTX64.efiи поэтому он может быть назван так. UEFI не может (по спецификации) обрабатывать аргументы ядра в первую очередь - и поэтому образ initramfs / kernel должен быть связан вместе в этом случае. но я не знаю, что вы имеете в виду по поводу именования версий - я думаю, что это делают только Debian, и я считаю, что это все равно непродуктивно. условное название для вашего ядра vmlinuz. В любом случае, правильный способ сделать это с помощью менеджера загрузки, а не загрузчика . Используйте приложение EFI, которое находит ваше ядро ​​и передает его имя EFI для загрузки - как это делает rEFInd.
mikeserv

Я использую Debian и имя ядра, например, vmlinuz-4.2.0-1-amd64которое я оставляю как есть, а затем использую, efibootmgrчтобы добавить это в список загрузки и сделать его по умолчанию. Я вижу, что наименование ядра BOOTX64.efiможет быть решением. Но в любом случае для этого мне понадобился бы сценарий, и, кроме того, он не позволяет легко сохранять несколько ядер, если все они названы одинаково.
Марко

@Marco - вам не нужен целый отдельный скрипт - ваш менеджер пакетов - apt, вероятно, будет в любом случае запускать какой-то скрипт, когда установлено ядро ​​для сборки initramfs. там, вероятно, уже есть сотня вещей, чтобы определить имя вашего ядра, но только одна дополнительная строка переименует все, что вы захотите. и вы можете легко хранить столько ядер, сколько захотите, если сохраните дерево загрузки . rEFInd обрабатывает его, делая загрузочный образ по умолчанию самым последним измененным образом ядра в своих путях поиска.
mikeserv

Изменение стандартных скриптов, установленных менеджером пакетов, - плохая идея. Они могут обновляться, что, в свою очередь, стирает ваши изменения и - в данном конкретном случае - может даже привести к невозможности загрузки системы. Есть каталоги для пользовательских сценариев, которые вызываются после установки ядра / initramfs и предназначены для использования именно для такой цели, как эта. Кстати: вы предлагаете редактировать сценарии в ваших комментариях. Однако в своем ответе вы утверждаете: «Вам не нужны эти сценарии или какая-либо дополнительная работа», что неверно (по крайней мере, для Debian).
Марко

0

Они объединяют UEFI и GRUB в качестве решения для временной реализации.

Когда поддержка UEFI и сопутствующие проблемы (например, Secure Boot) будут решены, все больше и больше дистрибутивов будут использовать ее напрямую. Между тем, это все еще очень ново: Google Trends демонстрирует довольно ограниченное принятие: http://www.google.com/trends/explore?q=cannot+boot+uefi#q=uefi%2C%20%20efi%2C % 20% 20bios & CMPT = д

Другие упоминали все потенциальные ловушки, связанные с использованием чистого UEFI-решения и / или одновременной поддержкой как не-UEFI, так и чисто UEFI-систем. Ядро UEFI может работать в системе, отличной от UEFY, но инструментам обновления ядра необходимо обновить либо меню GRUB, либо меню загрузки UEFI, либо оба, и т. Д. И т. Д.

На самом деле речь идет о контроле качества, как уже упоминалось: важные проблемы с этим кодом имеют большое влияние: когда компьютер не загружается новыми пользователями, то есть потенциальными конвертерами в Linux, он превращает его в мусор и возвращается к чему-то «безопасному».

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


Я надеюсь, что нет, но это в основном потому, что у меня есть серьезные опасения по поводу режимов блокировки UEFI и «обещание» Microsoft позаботиться о том, чтобы всегда был подписанный образ для использования в Linux ...
Шадур

0

Дополнительный код необходим для обхода ошибок прошивки

Когда нет цепочки grub, дистрибутив больше полагается на прошивку для корректной загрузки. Поскольку у любого программного обеспечения будут проблемы, прошивка также склонна к этому. Теперь дистрибутивам Linux придется написать, чтобы обойти эти ошибки прошивки.

Пример из реальной жизни в качестве примера. Материнская плата Asrock H81 pro BTC P1.80 позволяет создавать пункты меню загрузки с efibootmgr. Может быть создано несколько пунктов меню загрузки, и порядок загрузки может быть изменен с помощью efibootmgr --bootorder XXXX,YYYY,ZZZZили может быть установлен временный параметр следующей загрузки efibootmgr --bootnext XXXX. Обе эти команды возвращают вывод, что дает вам представление о том, что порядок загрузки изменился или будет запущена следующая загрузка BootNext: XXXX. Однако при перезагрузке упрямая прошивка просто игнорирует вновь запрошенную опцию загрузки и перезагружается в предыдущее BootCurrent:значение. Постоянное изменение порядка загрузки может быть сделано только из утилиты настройки прошивки. И непостоянные изменения не доступны вообще.


-2

Я думаю, что если загрузка выполняется только EFI и мы удаляем загрузчик, то это будет трудно как для производителя HW, так и для производителя операционной системы. У поставщика HW будет больше ядер для тестирования, в то время как для компаний, производящих ОС, будет похоже на то, загружается ли их ядро ​​различными FW.

Более того, при прямой загрузке ядра из EFI, где в стеке будет помещаться защищенная загрузка? В текущем сценарии, когда управление переходит к загрузчику ОС, тогда загрузчик проверяет, правильно ли подписано ядро ​​или нет. В случае, если мы загружаем ядро ​​напрямую из EFI, я думаю, что это создаст беспорядок только потому, что весь стек будет нарушен. Просто мнение, из того, что я понимаю.


это глупо. причина, по которой загрузчик проверяет ключ, в том, что UEFI нет. Цепная загрузка избыточна для безопасной загрузки подписанного ядра, просто проверьте ключ в прошивке - как это должно работать.
mikeserv
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.