Blog » Linux

GRUB 2 – nowoczesny program rozruchowy

GRUB nowoczesny program rozruchowy

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 |

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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *