Arch Linux i Fedora pod jednym dachem z systemd-boot

Kategoria: Oprogramowanie Data publikacji: 3 komentarze

W ramach projektu systemd dostarczany jest minimalistyczny program rozruchowy systemd-boot, z którego pomocą możemy bardzo fajnie zorganizować sobie przełączanie między dwiema dystrybucjami Linuksa zainstalowanymi na jednym komputerze. Na przykładzie Arch Linuksa oraz Fedory pokażę, jak wykorzystać potencjał programu systemd-boot.

Założenia

  • Arch Linux jest moim głównym system — to on ma kontrolę nad faktycznie używanym bootloaderem. Fedora jest systemem podrzędnym. Posiada ona oczywiście swój bootloader, ale będziemy z niego korzystać wyłącznie pośrednio.
  • Program rozruchowy ma domyślnie startować Arch Linuksa.
  • Chcę mieć możliwość uruchomienia Fedory przy starcie komputera, ale także z poziomu uruchomionego Arch Linuksa na zasadzie „uruchom ponownie, ale wystartuj Fedorę”.
  • Jeżeli z poziomu Arch Linuksa użyję opcji „uruchom ponownie”, ma zostać uruchomiony Arch Linux. Jeżeli tę samą czynność wykonam w Fedorze, ma wystartować Fedora.

Podstawowa konfiguracja

Zakładam, że użytkownik ma już instalację programu rozruchowego systemd-boot za sobą. Wiele informacji na ten temat można znaleźć w internecie, na przykład w artykule na wiki Arch Linuksa. Poniżej przedstawię dla formalności moje pliki konfiguracyjne.

Konfiguracja bootloadera w /boot/loader/loader.conf:

default   arch-linux
timeout   0
editor    0
auto-entries  0

Pozycja mojego systemu w pliku /boot/loader/entries/arch-linux.conf:

title   Arch Linux
linux   /vmlinuz-linux
initrd  /intel-ucode.img
initrd  /initramfs-linux.img
options root=/dev/disk/by-uuid/e2c27b76-6e44-4fd8-850f-9b36679a947a resume=/dev/disk/by-uuid/8bc4ccb1-5598-4822-9a56-3de4c45cf169 quiet

Według naszych założeń kontrolę nad systemd-boot sprawować ma Arch Linux — to z jego poziomu bootloader jest aktualizowany. Fedora posiada swój własny bootloader (GRUB), który może być uruchamiany pośrednio, poprzez dodatkową pozycję systemd-boot.

W pliku /boot/loader/entries/fedora.conf definiuję pozycję dla systemu podrzędnego:

title   Fedora
efi     /EFI/fedora/shimx64.efi

Jak widać, w przypadku Fedory nasz bootloader systemd-boot nie ma zbyt dużo do roboty — jedynie bootloaderuje kolejny bootloader. :)

Uruchamianie systemów

Dzięki opcji default w pliku loader.conf Arch Linux będzie uruchamiany domyślnie.

Opcja timeout sprawia, że systemd-boot nie wyświetla menu wyboru systemu, a od razu uruchamia domyślną pozycję. Aby uruchomić Fedorę, możemy naciskać losowe klawisze (oczywiście te nieużywane przez oprogramowanie płyty głównej) w pierwszych sekundach rozruchu komputera, co zmusi bootloader do pokazania menu wyboru pozycji. Alternatywnie możemy po prostu dodać opcję timeout w pliku loader.conf.

Z poziomu działającego Arch Linuksa można wykorzystać funkcję o nazwie „oneshot”. Wywołane w terminalu polecenie bootctl set-oneshot fedora sprawi, że przy następnym uruchomieniu komputera systemd-boot wystartuje pozycję systemu Fedora, a nie domyślną, wynikającą z konfiguracji. Zachowanie to nie zostanie jednak zapisane na stałe — przy kolejnym uruchomieniu normalnie wystartuje Arch Linux. Polecenie bootctl set-oneshot musi zostać uruchomione jako root, na przykład przez sudo. W przeciwieństwie do innych składników projektu systemd, bootctl nie próbuje podnieść sobie uprawnień przez PolicyKit.

Jest jeszcze inna możliwość — możemy upiec dwie pieczenie na jednym ogniu. Za pomocą jednego polecenia systemctl reboot --boot-loader-entry fedora ustawimy „oneshot” i od razu dokonamy restartu maszyny. W odróżnieniu do poprzedniej komendy, systemctl reboot zwykle nie wymaga podnoszenia uprawnień.

Zachowanie po restarcie maszyny

Pozostaje jeszcze kwestia zachowania się komputera po restarcie. Jako że system Arch Linux jest domyślny w konfiguracji systemd-boot, zostanie automatycznie uruchomiony po zrestartowaniu komputera niezależnie od tego, z poziomu którego systemu czynność restartu została rozpoczęta. Czy da się zrobić tak, żeby reboot z Fedory skutkował uruchomieniem Fedory?

Pomimo że Fedora domyślnie nie używa systemd-boot, istnieje w niej polecenie bootctl, które może zapisać w pamięci UEFI informację odczytywaną przez nasz bootloader. Możemy skonfigurować Fedorę, by ustawiała sama siebie jako „oneshot” przy restarcie. W tym celu do pliku /etc/systemd/system/bootctl-fedora-oneshot.service na Fedorze wrzucić możemy:

[Unit]
Description=Set bootloader oneshot to Fedora
DefaultDependencies=no

[Service]
Type=oneshot
ExecStart=/usr/bin/bootctl set-oneshot fedora

[Install]
WantedBy=reboot.target

Usługę możemy włączyć za pomocą systemctl enable bootctl-fedora-oneshot.service.

Rozwiązanie takie ma wadę: gdy zechcemy przełączyć się z Fedory do Arch Linuksa, musimy pamiętać, aby wyłączyć komputer, a nie uruchomić go ponownie.

Komentarze (3)

  1. Tomasz Gąsior

    Ogólnie GRUB ssie. Jest zbyt ogromny i skomplikowany pod względem konfiguracji. To jest główny powód, dla którego w ogóle poruszyłem temat systemd-boot.

    Jak najbardziej GRUB potrafi wykryć inne systemy za pomocą osprobera. Zawsze wyłączam tę funkcję, bo uważam, że jest wadliwa by design — distro powinno zawsze samo zarządzać swoimi parametrami rozruchu i bootloaderem, a nie być bootloaderowane przez bootloader innego systemu.

Dodaj komentarz