Seit Jahren ist der „Grand Unified Bootloader“ kurz „GRUB“ bzw. dessen Nachfolger GRUB2 bei den allermeisten Distributionen der Standard-Bootloader. Beide funktionieren sehr gut, wirken aber in Zeitalter von UEFI und auf normalen PCs, die nur von Festplatte booten, irgendwie aus der Zeit gefallen. Während GRUB Version 1 noch relativ übersichtlich und einfach zu konfigurieren war, benötigt man bei GRUB2 schon fast ein Hochschulstudium um durchzublicken.
PCs mit UEFI-Firmware benötigen keinen komplexen Bootloader mehr. Man kann die Firmware direkt den Kernel booten lassen. Ein dezidierter Bootloader ist in den meisten Fällen überflüssig und nur noch in Spezialfällen notwendig. Leider ist das Verfahren nicht ganz einfach umzusetzen, da man der Firmware die benötigten Kerneloptionen von Hand übergeben muss. Dazu können noch weitere Probleme kommen (Siehe z.B. ArchWiki – EFISTUB). Dazu kommt, dass bei einem Reset der Firmware alle Einträge verloren gehen und man mit einem nicht-bootfähigen System dasteht.
Es geht aber auch sehr viel einfacher:
Man benutzt einfach den, von systemd mitgelieferten, Bootloader „bootctl“. Der Loader ist kein neues Projekt, sondern hieß vor der Integrierung in systemd „gummiboot“ (Welcher wiederum nur als Referenzimplementierung gedacht war).
Installation von „bootctl“
Die Installation des Bootloaders ist sehr einfach (Ubuntu 16.04 und höher):
sudo apt-get purge grub* (Deinstalliert GRUB2 komplett)
sudo rm -r /boot/grub (GRUB2-Dateien aus dem boot-Verzeichnis/Partition löschen)
sudo efibootmgr -b 0000 -B (Entfernt den "ubuntu"-Eintrag aus der Firmare)
sudo bootctl install ("bootctl" in der Firmware hinterlegen)
Leider gibt es einen kleinen Makel:
Im Gegensatz zum Vorgänger „gummiboot“ bzw. dessen Paket in Ubuntu, installiert bzw. aktualisiert der Loader nicht automatisch die Kerneleinträge. Diese müssen leider von Hand angelegt werden. Aus diesem Grund habe ich die Dateien aus dem Paket „gummiboot“ extrahiert, welche diese Funktionalität unter „gummiboot“ bereitgestellt haben. Im Prinzip ist es nur eine kleine Konfigurationsdatei und ein kleines Shell-Skript, welche dafür sorgen, dass nach jedem Kernel bzw. Initrd-Update der Bootloader entsprechend konfiguriert wird. Hier mal der Link zur DEB-Datei:
Liste der Dateien im Paket:
/etc/default/bootctl (Konfigurationsdatei für den Bootloader. Hier werden die Kerneloptionen eingefügt) /etc/initramfs/post-update.d/zz-update-bootctl (Wird aufgerufen, wenn eine Initial-Ramdisk installiert bzw. aktualisiert wird). /etc/kernel/postinst.d/zz-update-bootctl (Wird bei einer Kernel-Installation aufgerufen) /etc/kernel/postrm.d/zz-update-bootctl (Wird bei einer Kernel-Deinstallation aufgerufen) /usr/sbin/update-bootctl (Das eigentliche Update-Skript. Kopiert den Kernel und die Initial-Ramdisk auf die EFI-Partition und legt im Loader die Einträge an).
Bei den meisten Systemen sollte es ausreichen das Paket zu installieren um den Bootloader fertig zu konfigurieren. Falls die EFI-Partition nicht unter „/boot/efi“ gemountet ist, muss man noch den Parameter „–path=PATH“ zum bootctl-Kommando hinzufügen und in der Datei „/etc/default/bootctl“ die Variable „BOOTCTL_EFI“ nach der Installation des Pakets entsprechend anpassen.
Warum das Ganze?
Wie schon am Anfang angesprochen, ist „bootctl“ deutlich einfacher aufgebaut als GRUB2. Es gibt im Grunde nur zwei Dateien die man bearbeiten muss, um den Loader zu konfigurieren. Dazu kommt, dass der Loader keine Probleme mit verschiedenen root-Dateisystemen hat. Auf meinem Desktop-PC liegt „root“ auf einem XFS-Dateisystem und ich musste meine „boot“-Partition explizit auf ein „ext4“-Dateisystem legen damit GRUB2 das System überhaupt booten konnte (Getestet unter Ubuntu 16.04, 16.10, Debian Testing). Eigentlich sollte GRUB2 mit XFS umgehen können, aber egal was ich versucht habe, es hat nicht funktioniert.
„bootctl“ sind die Dateisysteme vollkommen egal, da der Loader und die Kerneldateien immer auf der EFI-Partition liegen und ersterer nur dafür sorgt, dass der Kernel direkt von der Firmware geladen wird. Das heißt man kann grundsätzlich jedes Dateisystem als „root“-Partition einsetzen, solange der Kernel und die Initial-Ramdisk damit umgehen können. Bei Grub muss man sich daran orientieren, was dieses selbst an Dateisystemen unterstützt.