Program rozruchowy jest wykonywany zaraz po inicjalizacji sprzętu przez BIOS bądź UEFI. Jego zadaniem jest poprawne załadowanie i przekazanie kontroli do jądra systemu operacyjnego. Przyjrzymy się dziś jednemu z nich – GRUB 2.
GRUB (ang. GNU GRand Unified Bootloder) – gra słowna w oparciu o fizyczną teorię wielkiej unifikacji to system rozruchowy pozwalający uruchomić wszystkie popularne systemy operacyjne w wielu różnych konfiguracjach sprzętowych. Daje on możliwość kontrolowania, w jaki sposób system powinien zostać uruchomiony. Umożliwia stworzenie listy zainstalowanych na dysku systemów operacyjnych i późniejszy wybór, który z nich uruchomić.
Obecnie stosowany w Enterprise Linux GRUB w wersji drugiej jest następcą tak zwanego GRUB Legacy. Duża część GRUB 2 pochodzi z tej strony.
Instalacja
W systemach Enterprise GRUB 2 wgrywany jest na dysk podczas instalacji podstawowych składników systemu. Również wtedy wywoływane jest przez skrypt instalacyjny polecenie grub2-mkconfig
odpowiedzialne za wygenerowanie menu startowego.
W przypadku, gdy korzystamy z innego programu rozruchowego, instalacja GRUB sprowadza się do wydania dwóch komend:
# instalacja GRUB 2 w systemie Enterprise
$ sudo yum install grub2 # bądź grub2-efi dla systemów z UEFI
# wgranie GRUB 2 na dysk → należy wybrać dysk, na którym znajduje się partycja
/boot
$ grub2-install /dev/sda
Istnieją również bardziej zaawansowane opcje instalacji
Pliki konfiguracyjne
Umiejscowienie plików konfiguracyjnych menu GRUB zależne jest od tego, czy posiadamy BIOS, czy nowsze UEFI. Pliki te znajdziemy odpowiednio w /boot/grub2/grub.cfg
oraz /boot/efi/EFI/redhat/grub.cfg
. Nie należy ich jednak modyfikować ręcznie, ponieważ są generowane automatycznie na podstawie pliku /etc/default/grub
oraz skryptów znajdujących się w katalogu /etc/grub.d/
. Właśnie tam znajduje się interesująca nas konfiguracja.
Zestaw narzędzi GRUB 2
Jak widać z poniższego zrzutu, lista narzędzi dostarczanych przez GRUB może przyprawić o zawrót głowy. Na szczęście w praktyce wykorzystuje się jedynie kilka z nich, a niektórych nawet nie powinniśmy wywoływać ręcznie, gdyż są one niskopoziomowymi programami uruchamianymi przez ich bardziej przyjazne użytkownikom interfejsy.
# grub2-<TAB><TAB> grub2-bios-setup grub2-mkconfig grub2-probe grub2-editenv grub2-mkfont grub2-reboot grub2-file grub2-mkimage grub2-render-label grub2-fstest grub2-mklayout grub2-rpm-sort grub2-get-kernel-settings grub2-mknetdir grub2-script-check grub2-glue-efi grub2-mkpasswd-pbkdf2 grub2-set-default grub2-install grub2-mkrelpath grub2-setpassword grub2-kbdcomp grub2-mkrescue grub2-sparc64-setup grub2-macbless grub2-mkstandalone grub2-syslinux2cfg grub2-menulst2cfg grub2-ofpathname
Najczęściej używanymi poleceniami są grub2-set-default
oraz grub2-mkconfig
. Pierwsze z nich pozwala ustawić domyślny wybór w menu GRUB (przy założeniu, że korzystamy z domyślnego ustawienia GRUB_DEFAULT=saved
ustawianego w pliku /etc/default/grub
). Drugie umożliwia wygenerowanie świeżego menu na podstawie wcześniej wspomnianych plików znajdujących się w katalogu /etc/grub.d/
.
Grubby
Ze względu na duży poziom skomplikowania domyślnego toolchainu GRUB oraz z powodu korzystania z różnych programów rozruchowych na różnych architekturach sprzętowych powstał grubby
– narzędzie budujące nowy poziom abstrakcji do zarządzania rozruchem komputera. Nie będę w tym miejscu rozwodził się nad jego obsługą i wymienię tylko kilka interesujących nas opcji. Resztę świetnie opisanych możemy znaleźć w podręczniku systemowym: man 8 grubby
* wyświetlanie obecnie używanych opcji:
| Polecenie | Funkcja |
|---------------------------|--------------------------------------------|
| grubby --default-kernel | Wyświetlenie domyślnego jądra |
| grubby --default-index | Wyświetlenie domyślnej pozycji w menu GRUB |
| grubby --info ALL | Wypisanie pełnej listy menu GRUB |
* ustawianie opcji:
| Polecenie | Funkcja |
|------------------------------------------|------------------------------------------|
| grubby --set-default /ŚCIEŻKA/DO/JĄDRA | Ustawienie domyślnego jądra |
| grubby --set-default-index NUMER | Ustawienie domyślnej pozycji w menu GRUB |
Źródło: https://xkcd.com/927/
Dwa słowa o new-kernel-pkg
Podczas instalacji pakietów uruchamiany jest tytułowy skrypt, który jest idempotentnym opakowaniem dostępnych w systemie narzędzi i odpowiada za dołączenie nowo wgranego jądra do programu rozruchowego.
$ sudo rpm -q --scripts kernel-ml | grep postinstall -A 1
postinstall scriptlet (using /bin/sh):
/usr/sbin/new-kernel-pkg --package kernel-ml --install
5.3.9-1.el7.elrepo.x86_64 || exit $?
--
postinstall scriptlet (using /bin/sh):
/usr/sbin/new-kernel-pkg --package kernel-ml --install
5.3.11-1.el7.elrepo.x86_64 || exit $?
--
postinstall scriptlet (using /bin/sh):
/usr/sbin/new-kernel-pkg --package kernel-ml --install
5.4.0-1.el7.elrepo.x86_64 || exit $?
Historia niestandardowego kernel-ml z repozytorium ELrepo
Jednym z powodów, dla którego poznałem bliżej zawiłości GRUB, były moje doświadczenia z automatycznym ładowaniem najnowszego zainstalowanego jądra. Zarówno grubby
, jak i ręczne ponowne generowanie grub.cfg
nie przynosiły oczekiwanego efektu i za każdym razem po instalacji świeższego kernela musiałem pamiętać o ręcznej zmianie domyślnego wyboru GRUB. Z pomocą przyszedł na szczęście niezawodny Google, więc dla pełności artykułu zamieszczam poniżej.
Okazuje się, że w systemach Enterprise znajduje się dodatkowo jeden plik konfiguracyjny dotyczący jądra systemu:
# cat /etc/sysconfig/kernel
# UPDATEDEFAULT specifies if new-kernel-pkg should make
# new kernels the default
UPDATEDEFAULT=yes
# DEFAULTKERNEL specifies the default kernel package type
DEFAULTKERNEL=kernel
W pliku tym znajduje się konfiguracja opcji mówiącej o tym, czy new-kernel-pkg
powinien automatycznie aktualizować jądro do najnowszego oraz definiująca jego nazwę. W naszym przypadku nazwa odbiega od domyślnej i powinniśmy zmienić ją na prawidłową:
# cat /etc/sysconfig/kernel
# UPDATEDEFAULT specifies if new-kernel-pkg should make
# new kernels the default
UPDATEDEFAULT=yes
# DEFAULTKERNEL specifies the default kernel package type
DEFAULTKERNEL=kernel-ml
Voilá! Teraz aktualizacja kernela będzie pociągać za sobą dodanie nowego wpisu w menu GRUB oraz aktualizację indeksu, który będzie wskazywał na nowe jądro.
Podsumowanie
GRUB 2 to program rozruchowy spełniający wszystkie potrzeby nowoczesnego sprzętu. Dzięki wykrywaniu wielu systemów operacyjnych sprawdzi się w praktycznie każdej konfiguracji. Pamiętajmy również o świetnym narzędziu dostępnym w systemach Enterprise Linux – grubby
. Dzięki niemu praca z programami rozruchowymi staje się zdecydowanie prostsza.