GRUB byl původně vyvíjen v rámci projektu Hurd, tedy přímo pod iniciativou GNU. Od roku 1999 je to oficiální boot loader projektu GNU a postupně jej převzaly všechny velké distribuce. Proti zavaděči LILO, který byl používán dříve, je GRUB výrazně mocnější, rozumí obsahu souborového systému a umí proto dynamicky načítat konfiguraci při startu nebo je možné jej dodatečně konfigurovat už za běhu.
Původní první řada (nejnovější je verze 0.97) je dnes označována jako GRUB Legacy a už není nadále vyvíjena. Vývojáři do ní budou jen přidávat opravy chyb, ale další vývoj se zaměřuje na GRUB2. Současná verze nese označení 1.97.2. Dvojková řada se z uživatelského hlediska od té první výrazně liší. Cílem článku je tyto rozdíly představit a vysvětlit principy novější řady. Část distribucí už na novou verzi přešla.
Kterou řadu GRUB máte nainstalovanou?
Proč GRUB2?
GRUB2 je logickým pokračovatelem první řady, jedná se ale o kompletní přepis původního kódu s cílem přinést robustnější, modulární a mocnější nástroj. Hlavní novinky můžeme shrnout do několika bodů:
- podpora ne-x86 platforem
- podpora lokalizace
- možnost zobrazení ne-ASCII znaků
- podpora modulů
- vylepšená správa paměti
- vlastní skriptovací jazyk
- přesun platformně závislého kódu do modulů
Zmíněné moduly naleznete v adresáři /boot/grub
a obvykle mají jen několik málo kilobajtů. Mají příponu .mod
a v konfiguračním souboru se volají příkazem insmod
. Naleznete tu například podporu pro png či tga obrázky pozadí, ovladač pro čtení ze souborových systému etx2, ZFS, NTFS a dalších. V mém Debianu je modulů celkem 158.
Důležitý je také důraz na automatickou konfiguraci zavaděče. Zatímco dříve různé aplikace parsovaly centrální konfigurační soubor, dnes je vše prováděno na úrovni automatických skriptů a modulů. To je také hlavní kámen úrazu u uživatelů, kteří nemají s novou verzí zkušenosti. Stará pravidla zde neplatí a vše je zcela jinak.
Konec ruční editace
Původní GRUB byl konfigurovatelný pomocí standardního textového souboru, který se nacházel v /boot/grub/menu.lst
. V něm byla uložena celá konfigurace zavaděče a odtud ji také při každém startu natahoval. Tento soubor se nadále nepoužívá a nahradil jej soubor /boot/grub/grub.cfg
. Podstatný rozdíl je, že tento nový soubor už se ručně needituje.
O jeho vygenerování se starají specializované utility, především update-grub2
. To je ovšem jen zástupce pro zpětnou kompatibilitu, který doopravdy spouští příkaz update-grub
. Aby toho ale nebylo málo, poslední jmenovaný skript je velmi jednoduchý a vlastně jen zavolá následující příkaz:
# grub-mkconfig -o /boot/grub/grub.cfg
Tím spouštíme skript, který začně automaticky na základě jiných souborů generovat finální konfiguraci. Pokud si chcete jeho funkčnost vyzkoušet „nanečisto“, můžete vynechat parametr -o
a výstup se bude objevovat na obrazovce.
Odkud se berou podklady
Podklady pro tvorbu konfigurace se sbírají z několika zdrojů. Především se jedná o soubor /etc/default/grub
a skripty v adresáři /etc/grub.d/
. To je také způsob, jak mohou nově nainstalované balíky přidat položku do menu GRUB. Prostě jen přidají svůj skript do adresáře /etc/grub.d/
. Vezmeme to ale postupně.
Už zmíněný soubor /etc/default/grub
obsahuje základní globální konfigurace zavaděče. Zde je možné ručně nastavit, která položka bude po startu standardně zvolena, kolik sekund bude GRUB čekat na uživatelský vstup a podobně. Také zde ovlivňujeme některé skripty, které například nemusejí generovat položky s „recovery“ režimem a podobně. Tento soubor je určen pro ruční editaci.
To nejdůležitější se ukrývá v adresáři /etc/grub.d/
. Jsou to spustitelné bash skripty, které utilita update-grub
postupně spouští. Skripty začínají číslem (podobně jako init skripty) a jsou automaticky spouštěny ve správném pořadí. Čísla nejsou volena náhodně, ale mají vlastní pravidla:
- 00 je rezervováno pro generování hlavičky z konfiguračního souboru
- 10 hlavní bootovací položky
- 20 aplikace třetích stran
Pokud tedy nainstalujete například utilitu Memtest, balíček kromě samotného programu dodá také skript 20_memtest
, který se při spuštění postará o nezbytné akce a předá generátoru konfigurace informace pro další položku v GRUB menu. Skripty jsou jednoduše spouštěny a výstup vypisují na standardní výstup. Můžeme si tak zkusit skript ručně spustit:
$ ./20_memtest86 Found memtest86 image: /memtest86.bin menuentry "Memory test (memtest86)" { linux16 /memtest86.bin }
Vidíte, že skript našel obraz s aplikací Memtest a vygeneroval novou položku pro GRUB. Následující výstup by byl při normálním provozu zapsán do souboru /boot/grub/grub.cfg
.
Pokud chcete přidat vlastní položky menu, máte dvě možnosti: buďto si napíšete celý vlastní skript nebo můžete využít souboru 40_custom
, který je standardně prázdný a je určen právě pro uživatele. Skript může být velmi jednoduchý, nemusí nic kontrolovat, jen může prostě vypsat to, co byste postaru vepsali do konfiguračního souboru. Nezapomeňte, že se skripty spouštějí vždy ve stejném pořadí, tím můžete ovlivňovat také to, jak bude poskládána výsledná konfigurace.
Co dělají standardní skripty
V každé distribuci jsou k dispozici jiné standardní grub.d
skripty, jejich funkce je ale obvykle podobná. Soubor 00_header
sleduje obsah souboru /etc/default/grub
a na jeho základě vytvoří základ konfigurace. U mě v Debianu (a v Ubuntu také) následuje soubor 05_debian_theme
, který nastavuje vzhled zavaděče. Zde se vybírá obrázek pro pozadí a barvičky fontů. Důležitý skript 10_linux
prohledá disk, najde všechna linuxová jádra a vytvoří pro ně položky v menu, případně i položky s (recovery), pokud jsme mu to dříve nezakázali.
Dále u mě následuje zmíněný skript 20_memtest86
následovaný 20_memtest86+
, pro jinou verzi Memtestu. Jak vidíte, dva různé programy zde nijak nekolidují, každý si jednoduše dodal svůj vlastní skript a nakonec se provádějí oba. V menu jsou pak položky pro obě aplikace. Předposlední skript 30_os-prober
se stará o hledání dalších operačních systému (třeba Windows) a jejich zařazení do zavaděče a konečně poslední 40_custom
slouží pro přidání uživatelských položek. Počet skriptů v adresáři se může samozřejmě lišit v závislosti na distribuci a nainstalovaných balíčcích.
Závěrečné shrnutí
Cílem článku bylo vysvětlit principy konfigurace nové verze zavaděče GRUB2, se kterou ještě nemá většina uživatelů zkušenosti. Jelikož se změnil a zkomplikoval celý koncept nastavování, jsou uživatelé často zmatení z toho, že na disku nenacházejí obvyklý konfigurační soubor a tápou při hledání toho, kde se ten nový nachází. GRUB2 je velmi mocným a silně konfigurovatelným nástrojem, se kterým se ale většina uživatelů musí teprve sžít. Stále však platí to, co zaznělo před šesti lety na OpenWeekendu: Co nejde nabootovat Grubem… to nejde nabootovat.