Warum verketten die meisten Distributionen UEFI und Grub?

31

Die meisten Distributionen installieren einen zusätzlichen Bootloader auf einem UEFI-System. UEFI selbst ist ein Bootloader und bietet ein Menü zur Auswahl verschiedener Betriebssysteme oder einzelner Kernel. Darüber hinaus können die UEFI-Einstellungen leicht mit User-Space-Tools wie geändert werden efibootmgr.

Kernel seit 3.3 unterstützen EFI_STUB, was bedeutet, dass der Kernel direkt von der UEFI geladen werden kann. Aus welchem ​​Grund entscheiden sich Distributionen für die Verwendung eines zusätzlichen Bootloaders? Die meisten Tutorials zu Linux / UEFI befassen sich hauptsächlich mit der Einrichtung des zusätzlichen Bootloaders (rEFInd, grub2, ELILO usw.), anstatt Linux mit EFI_STUB zu booten.

Das einzige, was in den Distributionen fehlt, ist die Unterstützung. Da die meisten Distributionen einen zweiten Bootloader verketten, wird der Kernel weder zum UEFI-Bootmenü hinzugefügt noch in die EFI-Systempartition kopiert.

Drei Skripte reichen aus, um die ganze Magie zu vollbringen. Eine, die die initramfs in den ESP kopiert. Ein zweiter kopiert den Kernel auf den ESP und erstellt einen neuen Eintrag im UEFI-Startmenü. Das dritte Skript entfernt den alten Kernel und initramfs vom ESP und löscht den Eintrag im UEFI-Startmenü. Dies ermöglicht vollautomatisierte Kernel- / Initramfs-Updates / Bereinigungen ohne Benutzerinteraktion. Ich benutze diesen Ansatz seit mehr als einem Jahr und er hat einwandfrei funktioniert.

Warum verwenden die meisten Distributionen grub anstelle von EFI_STUB?

Links:

EDIT: Ich spreche nicht davon, die Grub-Unterstützung vollständig zu entfernen, sondern eine Auswahl für diejenigen anzubieten, die sie aus verschiedenen Gründen verwenden möchten. Distributionen könnten ein Paket grub-efifür diejenigen bereitstellen , die UEFI und Grub verketten möchten, sowie ein Paket, efistub-bootdas die oben erwähnten Skripte enthält.

Marco
quelle
4
Warum sollten sie? Sie haben bereits Methoden zum Behandeln / Generieren von Grub-Konfigurationsdateien entwickelt. Außerdem hilft es, wenn sich alle Systeme (Nicht-UEFI & UEFI) gleich verhalten.
Ulrich Dangel
Hört sich cool an. Aber da nach diesem Link , den Sie können es tun , wenn Sie wollen, vielleicht ist es ein Potential für Morast distros es automatisch für Sie zu tun. Betcha einige geben Ihnen schließlich die Wahl tho.
Goldlöckchen
1
@Bakuriu Ein besser verständliches System, eine einfachere Startsequenz, weniger ausgeführter Code und eine etwas schnellere Startzeit.
Marco
4
Diese Frage sollte zurückgestellt werden, da der angegebene Grund für das Zurückstellen falsch ist. Die Frage hat eine einfache, unbestreitbare Antwort: UEFI bietet kein Startmenü. Einige Implementierungen tun dies. Einige tun dies nicht, da das BIOS nicht einmal Eingabegeräte initialisiert , um die Zielstartzeit für Windows 8 zu erreichen . Geschweige denn abwarten, ob der Benutzer eine Taste drückt. Sie müssen also Windows durchgehen, um auf Linux zuzugreifen, oder umgekehrt. Ersteres funktioniert auf einigen Systemen, aber ich bezweifle, dass die Spezifikation dies garantiert. Letzteres funktioniert nicht (Sie können UEFI-Setup von GRUB, aber nicht von Linux aus aufrufen).
Sourcejedi
1
@sourcejedi Sie behaupten, dass Ihre Quellen nicht übereinstimmen. UEFI bietet ein Startmenü (Benutzeroberfläche jedoch herstellerübergreifend inkonsistent). mjg59 bedeutete, dass man ohne einen philosophischen Kompromiss (der W8 EULA akzeptierte) nicht zum Bootmenü kommen kann. Dieses Problem tritt jedoch auch bei Installationsprogrammen auf, die keine EFISTUB-Grub-Bootloader verwenden. Es wird also auch nicht beantwortet, warum wir Grub EFISTUB vorziehen würden.
Lingzhu Xiang

Antworten:

10

Angesichts der Tatsache, dass UEFI erst 2005 definiert wurde, gibt es eine Reihe älterer Geräte, die die Spezifikation nicht unterstützen. Das Hinzufügen von UEFI zu einer Standarddistribution erfordert das Testen von zwei statt nur einem Codepfad. Der Startcode ist nicht nur notorisch pingelig, sondern auch einer der irritierendsten und zeitaufwändigsten zu testenden Codebits.

msw
quelle
5
Es ist nicht nur ärgerlich zeitaufwendig zu testen, es ist auch der ärgerlichste Code, der möglicherweise schief geht. Bedenken Sie: Was bevorzugen Sie, ein Problem, wenn das System zum größten Teil normal läuft oder wenn Sie das System nicht einmal booten können? Der Bootloader ist definitiv eine der Software-Komponenten, bei denen es mir am wichtigsten ist, nicht zu berühren, es sei denn, dies ist erforderlich.
ein Lebenslauf vom
Der obige Kommentar von @ MichaelKjörling sollte in einer Antwort stehen. Der Wechsel zu einem neuen Bootloader ist sehr, sehr riskant. Die Entwickler von Distributionen möchten, dass ihre Benutzer eine gute Erfahrung machen. Darüber hinaus möchten sie, dass jeder einzelne potenzielle neue Benutzer eine einwandfreie Erfahrung beim ersten Mal macht. Es tut mir leid, dass ich Distribution als "Distribution" bezeichnet habe, aber es hat sich in Zusammenarbeit mit den Entwicklern gut angefühlt.
Johan
@Johan msw ist frei, diesen Punkt in der Antwort zu bearbeiten, es macht mir nichts aus. (Es ist nicht genug, eine Antwort für sich zu sein, IMO.) Sowohl Tobu als auch Goldlöckchen berühren das Thema ebenfalls.
ein Lebenslauf vom
3

Distros verfügen nur über begrenzte Ressourcen, und darüber hinaus gibt es möglicherweise keinerlei Gründe. Es mag einigermaßen einfach und sicher sein, aber egal, was für Wartungsarbeiten erforderlich sind, da die Grub-Option nur für Nicht-UEFI-Systeme beibehalten werden muss.

Ich bin mir sicher, dass jeder eine Liste von Funktionen und Optionen hat, die er gerne von Distributionen übernehmen lassen möchte (ich gebe Ihnen ein paar Seiten, lol), und zweifellos wären viele davon "ganz einfach, kein Ärger, ehrlich. .. ". Es gibt jedoch nicht unendlich viele Arbeitsstunden, um sie umzusetzen. Bei Entscheidungen wie diesen ("Arbeiten wir an dieser Funktion im Vergleich zu anderen?") Sollten die Hauptfragen lauten:

  • Ist es nötig? (Die Antwort hier ist nein).
  • Wie viele Menschen werden davon profitieren und wie viel? (IMO: ein paar und nicht viel)
  • Gibt es eine sinnvolle Alternative, über die sich der Benutzer anpassen kann, ohne dass wir etwas unternehmen? (Anscheinend gibt es.)

Der Grund, warum die Leute Distros überhaupt benutzen, ist, dass jeder mit begrenzten Ressourcen konfrontiert ist (andernfalls stellen Sie einfach ein Team ein, kaufen Sie ihnen Platz und Ausrüstung und lassen Sie alles für Sie tun, genau wie Sie wollen). Die Realität ist also, dass die Distributionen die allgemeinen Bedürfnisse ihrer Benutzer widerspiegeln .

Trotzdem denke ich, dass dies mit der Zeit als Option angenommen wird, und habe die Frage positiv bewertet.

Goldlöckchen
quelle
2

Das gezielte Anvisieren von UEFI-Bootloadern zusätzlich zu Grub würde die Qualitätskontrolle und -unterstützung erschweren. Die Distributionen zielen eher auf Grub als auf die UEFI-Spezifikation ab, da Grub freie Software, hackbar, flexibler und von hoher Qualität ist. Sie können dennoch einen reinen UEFI-Start erhalten, indem Sie einem Lernprogramm folgen und die UEFI-Partition anhängen. Andernfalls /bootliegt die Wartung bei Ihnen.

Tobu
quelle
Ihre Qualitätsbehauptung ist umstritten, aber ich denke, der Grund, warum sie ins Visier genommen wird, hat nichts damit zu tun. Sie haben bereits Tausende von Zeilen schlecht geschriebener Shell-Skripte, warum sollten sie also 20 gute wollen?
mikeserv
1

Das eigentliche Problem ist, dass die Leute nicht verstehen, wie es funktioniert. Zum Beispiel erwähnen Sie in Ihrer Frage, dass nur drei Skripte erforderlich sind, und die meisten Antworten hier beziehen sich auf alle / jede zusätzliche Wartung, die erforderlich wäre, damit es funktioniert - aber die Wahrheit ist, dass Sie diese Skripte nicht benötigen oder zusätzliche Arbeit.

Alles, was Sie brauchen, ist das Binden des ESP - oder wo immer Sie den Kernel behalten möchten - /boot, was Sie mit einer einzelnen Zeile in tun können /etc/fstab. Wenn Sie dies tun, funktionieren alle aktuellen Kernel-Aktualisierungsskripten einfach weiter.

Meine `/ etc / fstab 'sieht so aus:

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
#

Hier wird jedoch ein guter Punkt in Bezug auf herstellerspezifische Einstellungen angesprochen. UEFI gibt die Schnittstelle für ein Startmenü nicht explizit an . Das ist zu gewinnen und wird nicht zwischen Maschinen konsistent sein. Es ist nervig, aber wahr.

Und so, während ein Lader wie grubeigentlich nur für macht mehr Arbeit, ein Menü Anwendung - wie REFind - entzerrt die Unterschiede und vereinfacht alles.

mikeserv
quelle
1
Ich verstehe nicht, wie das funktionieren könnte. Beachten Sie, dass die Dateinamen des Kernels und von initramfs die Version enthalten. Wenn keine Skripte vorhanden sind, booten Sie Ihren alten Kernel, nachdem Sie einen neuen installiert haben. Oder anders formuliert: Wie wird der Standardkernel so geändert, dass er auf den neuen verweist? (Meine Skripte dienen dazu efobootmgr, die Startreihenfolge zu aktualisieren und den Standardkernel zu ändern.)
Marco
@Marco - Nun, der Standard-Boot-Pfad ist \EFI\BOOT\BOOTX64.efiund so könnte er dafür benannt werden. die UEFI Überhöhung (durch spec) Griff Argumente an den Kernel in erster Linie - und so die Initramfs / Kernel - Image Bedarf in diesem Fall miteinander verbunden werden. Aber ich weiß nicht, was Sie mit der Versionsbenennung meinen - ich denke, nur Debians tun das, und ich halte es sowieso für unproduktiv. Der übliche Name für Ihren Kernel ist vmlinuz. Auf jeden Fall ist der richtige Weg, dies zu tun, mit einem Bootmanager, nicht mit einem Loader . Verwenden Sie eine EFI-App, die Ihren Kernel findet und den Namen an EFI weitergibt, um zu booten, wie dies bei rEFInd der Fall ist.
mikeserv
Ich benutze Debian und der Name des Kernels ist zB vmlinuz-4.2.0-1-amd64der, den ich belasse und benutze efibootmgr, um ihn der Boot-Liste hinzuzufügen und als Standard festzulegen. Ich sehe, dass die Benennung des Kernels BOOTX64.efieine Lösung sein könnte. In jedem Fall würde ich ein Skript benötigen, um das zu tun, und außerdem ist es nicht einfach, mehrere Kernel zu behalten, wenn sie alle den gleichen Namen haben.
Marco
@Marco - Sie brauchen kein eigenes Skript - Ihr Paketmanager - wahrscheinlich passend - führt sowieso ein Skript aus, wenn ein Kernel zum Erstellen des initramfs installiert ist. Wahrscheinlich werden dort hundert Dinge getan, um den Namen Ihres Kernels zu ermitteln, aber nur eine einzige zusätzliche Zeile bewirkt die Umbenennung nach Belieben. und Sie können problemlos so viele Kernel behalten, wie Sie möchten, wenn Sie einen Boot- Baum haben . rEFInd behandelt dies, indem das Standard-Boot-Image zum zuletzt geänderten Kernel-Image in seinen Suchpfaden gemacht wird.
mikeserv
Das Ändern der vom Paketmanager installierten Stock-Skripte ist eine schlechte Idee. Sie werden möglicherweise aktualisiert, wodurch Ihre Änderungen gelöscht werden und in diesem speziellen Fall sogar ein nicht mehr startfähiges System entsteht. Es gibt Verzeichnisse für Benutzerskripte, die nach einer Kernel- / Initramfs-Installation aufgerufen werden und genau für diesen Zweck verwendet werden sollen. Übrigens: Sie schlagen vor, Skripte in Ihren Kommentaren zu bearbeiten. In Ihrer Antwort geben Sie jedoch an, dass Sie "diese Skripte oder zusätzliche Arbeit nicht benötigen", was nicht der Fall ist (zumindest für Debian).
Marco
0

Sie verketten UEFI und GRUB als temporäre Implementierungslösung.

Sobald der UEFI-Support und die damit verbundenen Probleme (z. B. Secure Boot) behoben sind, werden immer mehr Distributionen ihn direkt verwenden. In der Zwischenzeit ist dies noch sehr neu: Google Trends wird nur in begrenztem Umfang übernommen: http://www.google.com/trends/explore?q=cannot+boot+uefi#q=uefi%2C%20%20efi%2C % 20% 20bios & cmpt = q

Andere haben alle potenziellen Gefahren einer reinen UEFI-Lösung und / oder der gleichzeitigen Unterstützung von Nicht-UEFI- und reinen UEFI-Systemen erwähnt. Ein UEFI-Kernel funktioniert möglicherweise auf einem Nicht-UEFY-System, aber die Kernel-Aktualisierungstools müssen entweder ein GRUB-Menü ODER ein UEFI-Startmenü ODER beides usw. usw. aktualisieren.

Wie bereits erwähnt, geht es hier wirklich um die Qualitätskontrolle: Wichtig ist, dass Probleme mit diesem Code einen großen Einfluss haben: Wenn der Computer neue Benutzer nicht bootet, dh potenzielle Linux-Konverter, wird er als Müll entsorgt und auf etwas "Sicheres" zurückgegriffen.

Aber wie gesagt, wenn die Technologie mehr Akzeptanz findet, wird sie zum Standard.

Johan
quelle
Ich hoffe nicht - aber das liegt hauptsächlich daran, dass ich ernsthafte Bedenken hinsichtlich der Sperrmodi von UEFI und des "Versprechens" von Microsoft habe, sicherzustellen, dass es immer ein signiertes Image für Linux gibt ...
Shadur
0

Zusätzlicher Code ist erforderlich, um Firmware-Fehler zu umgehen

Wenn Sie grub nicht verketten, verlässt sich die Distribution mehr auf die Firmware, um richtig zu booten. Da jede Software Probleme hat, ist auch die Firmware dafür anfällig. Jetzt müssen die Linux-Distributionen auch schreiben, um diese Firmware-Fehler zu umgehen.

Ein realer Fall als Beispiel. Das Asrock H81 Pro BTC P1.80 Motherboard ermöglicht die Erstellung von Bootmenüeinträgen mit efibootmgr. Es können mehrere Startmenüeinträge erstellt werden, und die Startreihenfolge kann mithilfe von geändert efibootmgr --bootorder XXXX,YYYY,ZZZZoder eine temporäre Option für den nächsten Start mithilfe von festgelegt werden efibootmgr --bootnext XXXX. Beide Befehle geben eine Ausgabe zurück, die Ihnen den Eindruck vermittelt, dass sich die Startreihenfolge geändert hat oder der nächste Start beispielsweise ausgeführt wird BootNext: XXXX. Beim Neustart ignoriert die hartnäckige Firmware jedoch nur die neu angeforderte Startoption und führt einen Neustart mit dem vorherigen BootCurrent:Wert durch. Eine dauerhafte Änderung der Startreihenfolge kann nur über das Firmware-Setup-Dienstprogramm vorgenommen werden. Und eine nicht dauerhafte Änderung ist überhaupt nicht verfügbar.

Pro Backup
quelle
-2

Ich denke, wenn das Booten nur von EFI ausgehändigt wird und wir den Bootloader entfernen, wird es sowohl für HW-Hersteller als auch für Hersteller von Betriebssystemen schwierig sein. HW-Anbieter werden mehr Kernel zum Testen haben, während es für Unternehmen, die Betriebssysteme herstellen, so aussieht, als ob ihr Kernel von einer anderen FW geladen wird.

Außerdem beim direkten Booten des Kernels von EFI, wo im Stack passt der sichere Boot? Im aktuellen Szenario prüft der Bootloader, ob der Kernel korrekt signiert ist, sobald die Steuerung auf den Bootloader des Betriebssystems übergeht. Wenn wir den Kernel direkt von EFI laden, dann denke ich, dass es nur zu Chaos kommt, wenn der gesamte Stapel gestört wird. Nur eine Meinung von welchem ​​Verständnis ich habe.

Shubham
quelle
Das ist dumm. Der Grund, warum der Bootloader den Schlüssel überprüft, ist, dass die UEFI dies nicht tut. Chain-Loading ist redundant, um einen signierten Kernel zu starten. Überprüfen Sie einfach den Schlüssel in der Firmware - so wie es funktionieren sollte .
mikeserv