Zavaděč systému GNU GRUB v.2

Zavaděč GNU GRUB ve verzi 2 už začíná být v našich systémech usazený a tak není na škodu se zajímat o to, jak vlastně tato verze zavaděče funguje. Zatlačíme slzu nad starým dobrým jedničkovým grubem (někomu se zatlačuje opravdu těžko) a jeho menu.lst a podíváme se jak je to nyní. Budu se snažit stručně vysvětlit zavádění systému v Sabayon Linuxu i když samozřejmě v jiných systémech budou principy podobné. 

Principy fungování zavaděče *

Dá se říci, že GRUB 2 má tři hlavní části:

  1. /etc/default/grub – soubor který obsahuje nastavení, edituje se ručně
  2. /etc/grub.d/ – adresář se skripty generující menu, některé se mohou editovat a nebo přidávat zcela nové
  3. /boot/grub/grub.cfg – generovaný konfigurační soubor, needituje se ručně

Tyto části postupně dále popíši trochu podrobněji a tím bude vlastně tvořena kostra článku.

/boot/grub/grub.cfg aneb jak pracuje GRUB 2 *

Vezmu to odzadu a začnu třetím bodem. Nejdříve si ale řekněme, jak vlastně zavaděč pracuje. Princip fungování zavaděče by se dal zjednodušeně shrnout do jedné věty. GRUB 2 obsahuje hlavní skript grub2-mkconfig, který generuje menu do souboru /boot/grub/grub.cfg pomocí parametrů z konfiguračního souboru /etc/default/grub a sady skriptů umístěných v /etc/grub.d/. Toť vše. Jednoduché ne? Nikdy nic není tak jednoduché jak se řekne … ale v tomto případě opravdu proces složitější není.

Chceme-li vygenerovat menu z připravených souborů, stačí spustit výše uvedený skript jako root …

# grub2-mkconfig -o /boot/grub/grub.cfg

… ten zpracuje všechny vstupy do jediného výstupního souboru. Že to má být do souboru, mu říkáme parametrem “-o” s cestou k výstupnímu souboru. Pokud se spustí pouze příkaz samotný bez parametrů …

# grub2-mkconfig

… vygeneruje se se stejný obsah ale pouze na standardní výstup, tedy na obrazovku. To se hodí v případech, kdy se chcete nejdříve podívat co se vlastně bude generovat do výstupního souboru. Třeba při ladění menu, než výsledek finálně uložíte. Sice by se v tom výstupu prasevyznalo, ale požadované informace se tam najít dají.

Zkrácený příklad generovaného výstupu vypadá nějak takto:

Generating grub.cfg ...
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub2-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#
### BEGIN /etc/grub.d/00_fonts ###
### END /etc/grub.d/00_fonts ###
### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
load_env
fi
set default="0"
if [ x"${feature_menuentry_id}" = xy ]; then
menuentry_id_option="--id"
....................

Konfigurace parametrů v /etc/default/grub *

Soubor obsahuje několik již přednastavených voleb, další se pak dají doplnit. Toto jsou některé z nich.

  • GRUB_DEFAULT=saved – pokud je GRUB_SAVEDEFAULT nastaveno na true, při příštím startu se automaticky vybere stejná položka jako při minulém
  • GRUB_DEFAULT=0 – jaká položka z menu bude provádět při startu, “0” je první, “1” druhá … atd.
  • GRUB_TIMEOUT =3 – jak dlouho bude grub čekat na uživatelský vstup, než se spustí autoboot na DEFAULT položku (-1 pro trvalé čekání na výběr, 0 pro okamžitý start bez čekání)
  • #GRUB_TERMINAL=console – pokud povolíte, grub se spustí v textové konzoli namísto grafického terminálu s definovanými fonty a splash pozadím
  • GRUB_GFXMODE=1024×768 – rozlišení grafického terminálu, může zde být nejspíš jiná hodnota, uložená při instalačním procesu. Pokud není položka definována, bude použita hodnota “auto” a grub vybere sám vhodnou hodnotu z preferovaných rozlišení.
  • GRUB_CMDLINE_LINUX=”” – parametry přidávané jako argument na konec každého (včetně recovery) jádra
  • GRUB_CMDLINE_LINUX_DEFAULT=”” – parametry přidávané jako argument na konec jádra standardních “ne-recovery” řádek, které jsou generované v případě že GRUB_DISABLE_RECOVERY je nastaveno na “true”.
  • GRUB_BACKGROUND=”/boot/grub/default-splash.png”- pozadí zavaděče v grafické konzoli, mohou být použity soubory obrázků .png, .tga, .jpg, nebo .jpeg a obrázek bude roztáhnut přes obrazovku podle použitého rozlišení
  • #GRUB_THEME=”/boot/grub2/themes/starfield/theme.txt” povolte a upravte cestu k tématu, pokud si chcete nastavit jiné téma. Pozor, zde nám pan ředitel v konfiguračním souboru udělal chybu a tak pokud budete experimentovat vynechte z cesty dvojku
  • GRUB_DISABLE_OS_PROBER=”true” – tato položka v souboru není, nastavte jí v případě že nechcete generovat do menu grubu ostatní operační systémy

Soubor obsahuje více položek, ale buď jsou pro základní funkce zavaděče nedůležité, a nebo se o nich nepíše ani v manuálu, jako například definování barev menu.

Spouštěcí skripty v /etc/grub.d/ *

Tento adresář obsahuje sadu spouštěcích skriptů, číslovaných podle priority spouštění. Sabayon 13.08 má ve výchozím stavu v tomto adresáři před-vytvořeny tyto skripty:

  • 00_fonts – pro fonty generující se skriptem grub2-mkfont
  • 00_header – příprava prostředí mimo jiné pomocí parametrů ze souboru /etc/default/grub a získávání uložených stavů ze značkovacího kilobajtového souboru, zvaného enviroment block /boot/grub/grubenv
  • 10_linux – skript pro generování řádků s linuxovými jádry
  • 20_linux_xen – pro položky určené na Xen virtualizaci
  • 30_os-prober - část generující položky s ostatními operačními systémy
  • 40_custom – uživatelská část
  • 41_custom – alternativa k předchozí možnosti, přidání položek přímo pomocí vytvořeného souboru /boot/grub/custom.cfg

Z našeho pohledu může být zajímavý soubor 40_custom, který je podle dokumentace určen k přidávání vlastních položek do menu. Samozřejmě je možné přidat i zcela nový spustitelný soubor/skript, například s názvem 50_moje-polozky-v-menu, jenž bude správně v pořadí zpracován. Rezervovány jsou podle manuálu pouze 00_* pro 00_header, 10_* pro nativní bootovací položky a 20_* pro aplikace třetích stran (např. memtest86+).

Úprava parametrů jádra *

Tak, nyní už máme informací poměrně dost a tak můžeme zkusit praktický pokus s odstraněním zjednodušeného grafické rozhraní při startování systému, které se zobrazuje místo řádkového výpisu. Tyto grafiky lze samozřejmě dočasně překonat klávesou F2, ale osobně  spíše chci trvale vidět co přesně systém v danou chvíli děje.

Někteří z vás tuší, že pro vypnutí obrázku bude nutné vynechat parametr splash v proměnné GRUB_CMDLINE_LINUX v souboru /etc/default/grub. Ale copak? Že je proměnná GRUB_CMDLINE_LINUX prázdná? Ano :) a teď najít odkud že se nám to ty parametry berou že :D Docela jsem se s hledáním potrápil. Dokolečka přes všechny spouštěcí skripty, abych pak nakonec došel opět k souboru kde jsem začínal, a našel na konci jednu nenápadnou podmínku, která přinesla do hledání světlo. Na závěru našeho konfiguračního souboru/etc/default/grub je umístěna podmínka, která přidává další parametry do proměnné GRUB_CMDLINE_LINUX

if [ -f "/etc/default/sabayon-grub" ]; then
 # this file is placed by the Sabayon Installer and contains
 # custom GRUB_CMDLINE_LINUX parameters created at install
 # time.
 . /etc/default/sabayon-grub
fi

Zde je vidno, že se jedná o soubor /etc/default/sabayon-grub, který obsahuje hodnoty podobné těmto

# this file has been added by the Anaconda Installer
# containing default installer bootloader arguments.
# DO NOT EDIT NOR REMOVE THIS FILE DIRECTLY !!!
GRUB_CMDLINE_LINUX="${GRUB_CMDLINE_LINUX} splash vga=791 quiet dokeymap
keymap=cz domdadm resume=swap:UUID=20dd5fda-eca6-40d8-8ad9-980ea4635632
real_resume=UUID=20dd5fda-eca6-40d8-8ad9-980ea4635632 dolvm
root=UUID=be06e4bf-9d40-4220-8bc7-17bc6f03dacd docrypt"

Je hezké, že jsme varováni, nicméně není jiné cesty, než právě tento soubor upravit. Pro zakázání splash obrazovky odstraňte vyznačený parametr splash, a v případě že vám vadí ještě stručnost výpisu na obrazovku, vyjměte i parametr quiet. Uložit provedené změny a znovu vygenerovat menu zavaděče …

# grub2-mkconfig -o /boot/grub/grub.cfg

… a restartovat. Ještě jedna poznámka. Pokud budete chtít nějaké parametry jádra přidávat a ne jako v tomto případě ubírat, použijte standardní postup, tedy editaci proměnné GRUB_CMDLINE_LINUX v souboru /etc/default/grub.

Problémy se startem GRUB 2 *

Pokud se zavaděč poškodí tak že se nespustí, nebo ho přepíše nějaký operační systém, který si myslí že je na světě sám, je potřeba zavaděč, nemáte-li jeho zálohu, znovu nainstalovat. Pokud máte po ruce nějaké instalační CD/DVD Sabayonu (nebo jiné linuxové distribuce s grubem2) nabootujte na něj a spusťte terminál jako root. Dále uvedu příklad pro instalaci GRUBu 2 do MBR na disk sda. Při skutečné situaci berte toto jen jako vodítko a doplňte správný disk dle vlastního systému.

Nejdříve je dobré si udělat přehled o rozdělení disků (například):

# fdisk -l 
/dev/sda1 xxx Linux 
/dev/sda2 xxx Linux swap 
/dev/sda3 xxx Linux

x-ka jsou sloupce pro nás nyní s nezajímavými informacemi. V tomto případě budu instalovat grub na sda. Nejdříve je potřeba vytvořit svůj přípojný bod

# mkdir /mnt/disk-sabayon

pak připojit disk kde je systém, neboli root (nebo též “/“) do tohoto bodu

# mount /dev/sda1 /mnt/disk-sabayon

po připojení zkontrolovat, že se jedná správný disk a obsahuje “/boot” adresář (v případě že je /boot na samostatné partition, tak ho stejným způsobem připojit do /mnt/disk-sabayon/boot)

# ls /mnt/disk-sabayon

pak nainstalovat Grub2 do MBR na sda

# grub2-install --root-directory=/mnt/disk-sabayon /dev/sda

odmontovat připojený disk

# umount /mnt/disk-sabayon

… a restart systému.

Samozřejmě není nutné instalovat zavaděč do MBR (i když to je obvyklé). Je také možné zavaděč instalovat přímo na partition se systémem a využívat alternativní zavaděče z jiných OS. Záleží na konfiguraci kterou používáte na svém konkrétním systému.

Texty se vztahují k verzi sys-boot/grub-2.00-r4.

Luděk