9.3. Startování systému se zavaděčem GRUB

GRUB (GRand Unified Boot loader) podobně jako LILO pracuje ve dvou fázích. V první fázi, stage1, se spustí kód velký pouze 512 bytů, který je zapsaný v MBR, zaváděcím sektoru diskového oddílu nebo na disketě. Druhá fáze, stage2, spočívá ve spuštění většího programu vykonávajícího zavádění jako takové. Jedinou funkcí programu první fáze je zavést program fáze druhé.

Odsud již GRUB pracuje jinak než LILO, poněvadž program druhé fáze obsahuje kód pro čtení ze souborového systému. V současné době jsou podporovány tyto souborové systémy: Ext2, Ext3, ReiserFS, JFS, XFS, Minix a DOS FAT používaný Windows. GRUB tedy může přistupovat na souborové systémy již před vlastním startováním systému. Číst lze z těch zařízení, která jsou dostupná přes BIOS (disketové mechaniky a pevné disky). Ve výsledku to znamená, že provedené změny v konfiguraci programu GRUB nemusíme po každé změně zapsat reinstalací zavaděče. Při zavádění GRUB načte svůj soubor s menu a odsud zjistí, na kterých oddílech leží jádro a výchozí RAM disk (initrd), a je sám schopen tyto soubory najít.

Konfigurace zavaděče GRUB se nalézá v následujících souborech:

/boot/grub/menu.lst

Infromace o všech diskových oddílech a operačních systémech, které lze spustit pomocí zavaděče GRUB. Pokud není operační soubor zanesen v tomto souboru, nepůjde spustit pomocí zavaděče GRUB.

/boot/grub/device.map

Překlad jmen zařízení od zavadče GRUB a BIOSu do linuxových jmen.

/etc/grub.conf

Parametry a volby zavaděče GRUB potřebné pro správnou instalaci zavaděče.

Výhodou programu GRUB je, že lze jednoduše měnit veškeré parametry startu systému před samotným startem (viz 9.3.1.3 – „Změna položek v menu při startu“). Pokud při zavádění zjistíte, že soubor s menu obsahuje chyby, je stále možné opravit tyto chyby za chodu. V programu GRUB také můžete zadávat příkazy interaktivně na příkazový řádek, takže lze startovat i systém, jenž není uveden v konfiguračním souboru.

9.3.1. Startovací menu

GRUB zobrazuje zaváděcí menu na grafické titulní obrazovce nebo v rozhraní textového režimu. Co bude obsahem této obrazovky, lze nastavit v souboru s menu /boot/GRUB/menu.lst. V tomto souboru jsou popsány veškeré informace o diskových oddílech a operačních systémech , které lze zvolit z nabídky při zavádění.

GRUB nahraje menu přímo ze souborového systému při každém startu systému. Pokud chcete změnit nastavení zavaděče, upravíte pouze menu soubor pomocí programu YaST nebo vaším oblíbeným editorem.

Soubor s menu obsahuje příkazy spouštěné při zavádění a jeho skladba je jednoduchá na pochopení. Každý řádek sestává z příkazu, volitelně následovaného parametry. Ty jsou odděleny mezerou stejně jako v shellu. Z historických důvodů lze u některých příkazů použít před jejich prvním parametrem =. Řádky začínající znakem hash # jsou považovány za komentáře.

Každý záznam, jenž se objeví v menu zavaděče, odpovídá jménu v menu souboru, které musí být uvozeno pomocí slova title. Jinými slovy: textový řetězec následující za title (včetně mezer) se zobrazí jako volitelná položka. Následující řádky až do další položky title pak reprezentují příkazy, které se provedou, pokud zvolíte tuto položku v menu.

Jednoduchý příklad takového příkazu je zřetězené nahrání zavaděče jiného operačního systému. Příkaz se nazývá chainloader a jako parametr má obvykle zaváděcí blok jiného diskového oddílu. Zapsáno v notaci programu GRUB:

chainloader (hd0,3)+1

Jak GRUB pojmenovává zařízení je vysvětleno v sekci  9.3.1.1 – „Konvence pojmenování pevných disků a oddílů“. Příklad uvedený výše odkazuje na první blok čtvrtého oddílu prvního disku.

Příkaz pro určení obrazu jádra je kernel. První parametr je cesta k obrazu jádra na diskovém oddíle. Zbylé argumenty se během zavádění předají jádru jako parametry pro start Linuxu.

Pokud jádro nemá zabudované nezbytné ovladače pro souborový systém nebo disk (aby mohlo přistupovat na kořenový oddíl), připojte také příkaz initrd. Tento příkaz má pouze jeden parametr, a to cestu k souboru initrd. Příkaz initrd musí být umístěn bezprostředně po příkazu kernel, protože jádro (nyní již zavedené) očekává nějaký obraz initrd na konkrétní adrese v paměti.

Příkaz root zjednodušuje určení, kde se nachází obrazy jádra a initrd. root má jako jediný parametr označení zařízení nebo diskového oddílu (v notaci GRUB).

GRUB následně připojí na začátek všech cest k souborům (jádra, initrd nebo jiných souborů, které výslovně neurčují cestu nebo zařízení) hodnotu svého parametru. Toto připojování se děje do nalezení dalšího příkazu root. Tento příkaz není použit v souboru menu.lst, který je generován během instalace.

Příkaz boot je automaticky proveden jako poslední u každé položky menu. Nemusí se tedy zapisovat jako příkaz do souboru s menu. Jestliže se však dostanete do situace, že musíte zadávat příkazy do příkazové řádky programu GRUB, nezapomeňte nakonec zadat příkaz boot. Příkaz nemá parametry a pouze spustí zavádění obrazu jádra nebo zřetězený zavaděč (chain loader).

Jakmile máte vytvořen soubor s nabídkou položek odpovídajících jednotlivým OS, vyberte jednu jako implicitní pomocí příkazu default. Pokud nevyberete implicitní položku tímto příkazem, zavede se systém z první položky v menu (číslo 0). Lze také nastavit časovou prodlevu ve vteřinách, kdy můžete vybrat některou z polože. Řádky s příkazy timeout a default jsou obvykle umístěny před položky menu. Vzorový menu soubor je popsán v sekci  9.3.1.2 – „Vzorový soubor menu.lst“.

9.3.1.1. Konvence pojmenování pevných disků a oddílů

GRUB pojmenovává disky a oddíly podle jiných konvencí, než jste zvyklí v Linuxu, a jaké byste nejspíš očekávali (např. /dev/hda1). První disk je vždy odkazován jako hd0. Disketová mechanika se nazývá fd0.

[Important]Výpočet čísla oddílu

GRUB počítá diskové oddíly od nuly. hd0,0 tedy odkazuje na první oddíl prvního disku. Označení odpovídá typickému stolnímu počítači s jedním diskem připojeným jako primární master disk. V Linuxu bychom se na něj odkazovali pomocí /dev/hda1.

Čtyři primární oddíly (které lze na disku vytvořit) jsou číslovány od 0 do 3 a logické oddíly jsou číslovány od 4 výš.


(hd0,0)   první primární oddíl prvního disku
(hd0,1)   druhý primární oddíl prvního disku
(hd0,2)   třetí primární oddíl prvního disku
(hd0,3)   čtvrtý primární oddíl prvního disku
(hd0,4)   první logický oddíl
(hd0,5)   druhý logický oddíl
...

[Important]IDE, SCSI a RAID

GRUB nerozlišuje mezi IDE, SCSI nebo RAID zařízením. Veškeré pevné disky detekované BIOSem nebo diskovým řadičem jsou číslovány podle pořadí zavádění nastaveném v BIOSu.

Fakt, že disky jsou jinak adresovány Linuxem a jinak BIOSem, je problém jak pro LILO, tak pro GRUB. Oba programy používají podobný algoritmus pro mapování. Nicméně GRUB ukládá výsledek tohoto algoritmu do souboru (device.map), který lze editovat. Více informací o souboru device.map najdete v 9.3.2 – „Soubor device.map“.

V programu GRUB musí být cesta uvedena jako jméno zařízení, uzavřené do kulatých závorek, následovaná jménem souboru včetně plné cesty na tomto zařízení nebo oddílu. Cesta musí vždy začínat lomítkem. Například v systému s jedním IDE diskem a Linuxem uloženým na prvním oddílu, se odkážete na jádro takto:

(hd0,0)/boot/vmlinuz

9.3.1.2. Vzorový soubor menu.lst

Následující příklad ukazuje, jak funguje soubor menu.lst.

gfxmenu (hd0,4)/message
color white/blue black/light-gray
default 0
timeout 8

title linux
   kernel (hd0,4)/vmlinuz root=/dev/hda7 vga=791
   initrd (hd0,4)/initrd
title windows
   chainloader(hd0,0)+1
title floppy
   chainloader(fd0)+1
title failsafe
   kernel (hd0,4)/vmlinuz.shipped root=/dev/hda7 ide=nodma
   apm=off acpi=off vga=normal nosmp maxcpus=0 3
   initrd (hd0,4)/initrd.shipped

Tento fiktivní stroj má zaváděcí Linuxový oddíl na /dev/hda5, kořenový oddíl na /dev/hda7, a instalaci Windows na /dev/hda1.

První část souboru definuje nastavení titulní obrazovky a standardní chování:

gfxmenu (hd0,4)/message

Obrázek zobrazený na pozadí je uložen na /dev/hda5 a jmenuje se message.

color

Barevné schéma: bílá pro popředí, modrá jako pozadí, černá jako popředí pro vybranou položku a světle šedá pro pozadí zvolené položku. Definice barev neovlivní titulní grafickou obrazovku definovanou pomocí gfxmenu, ale pouze standardní textové rozhraní programu GRUB. V systému SUSE Linux se můžete z grafického menu do textového přepnout stisknutím Esc.

default 0

Implicitně se zavede první položka title linux.

timeout 8

Časová prodleva 8 vteřin. Pokud uživatel nezvolí jinak, zavede se implicitní volba.

Obsáhlejší druhá část definuje zavádění jednotlivých operačních systémů:

  • První položka (title linux) nastavuje zavádění systému SUSE Linux. Jádro (vmlinuz) je uloženo na prvním disku na prvním logickém oddílu (v tomto případě zaváděcí oddíl). Následné parametry blíže určují kořenový oddíl a mód zobrazení při startování jádra. Kořenový oddíl je uveden podle Linuxové konvence, protože bude interpretován samotným jádrem (a ne programem GRUB). Obraz initrd je uložen na stejném logickém oddíle prvního disku.

  • Druhá položka (title windows)je odpovědná za zavedení Windows, které jsou nainstalované na prvním oddíle prvního disku (hd0,0). Příkaz chainloader +1 způsobí, že GRUB načte a spustí první sektor definovaného oddílu.

  • Další záznam povoluje zavádění systému z disketové mechaniky bez zásahů do BIOSu.

  • Položka failsafe zavádí jádro Linuxu s mnoha přesně specifikovanými parametry jádra, aby bylo možné zavést systém na problematickém hardwaru.

Konfigurační soubor s menu můžete kdykoliv změnit. GRUB automaticky při příštím restartu načte tyto změny ze souboru. Abyste provedli permanentní změny v nastavení zavádění systému, použijte odpovídající modul programu YaST, nebo váš oblíbený editor. Pokud chcete změnit pouze jednorázově chování programu GRUB při zavádění, využijte jeho příkazovou řádku.

9.3.1.3. Změna položek v menu při startu

Grafické rozhraní dovoluje nejen zvolit položku pro zavedení systému (pomocí kurzorových kláves), ale umožňuje vám také zadat přídavné parametry pro jádro na příkazový řádek (pokud jste vybrali položku s Linuxem). Toto umí i LILO, avšak GRUB jde ještě o krok dál. Pokud stisknete Esc, přepnete se do textového módu. Nyní stiskem E vstoupíte do editovacího režimu. Zde můžete přímo měnit nastavení vybrané položky, které bude platné pouze pro toto zavádění systému. Žádná změna se nezapíše do souboru.

[Important]Rozložení klávesnice během fáze zavádění

V době zavádění systému můžete použít pouze americké rozložení klávesnice. Dejte pozor na jiné umístění znaků.

Po zapnutí režimu editace použijte kurzorové klávesy pro výběr položky, kterou chcete upravit. Nyní stiskněte E. Upravte parametry (diskové oddíly, cesty k souborům), které mají chybné hodnoty a ovlivňují proces zavádění. Opusťte režim editace stiskem Enter a jděte zpět do menu, kde můžete spustit zavádění systému s upravenými parametry. GRUB zobrazuje v dolní části obrazovky rady ohledně dalších možných činností.

Aby byly změny trvalé, upravte soubor menu.lst jako uživatel root, a přidejte libovolné parametry jádra oddělené mezerou na konec existujícího řádku:

title linux
   kernel (hd0,0)/vmlinuz root=/dev/hda3 parametry_jadra
   initrd (hd0,0)/initrd

Při příštím startování systému GRUB použije tyto nové parametry. Další možností, jak předat jádru přídavné parametry, je pomocí modulu programu YaST. Veškeré argumenty napište na konec řádku, oddělené mezerou.

9.3.1.4. Zástupné znaky a zadání jádra ke spuštění

Pokud se podílíte na vývoji jádra nebo používáte jádro vlastní, musíte, aby se systém správně spouštěl, buď změnit položky v menu.lst nebo zadat příslušné parametry do startovacího promptu. Nyní máte možnost se těmto procedurám vyhnout použitím zástupných znaků. S jejich pomocí se všechna jádra vyhovující kritériím, automaticky vloží do startovací nabídky.

Pro použití zástupných znaků stačí dodržovat pravidla při pojmenování obrazů jader a initrd a nová položka v souboru menu.lst. Předpokládejme, že máme systém s jádry a příslušnými initrd:

initrd-default
initrd-test
vmlinuz-default
vmlinuz-test

Abyste jak linux-default , tak linux-test vložili do souboru menu.lst musíte zadat:

title linux-*
   wildcard (hd0,4)/vmlinuz-*
   kernel (hd0,4)/vmlinuz-* root=/dev/hda7 vga=791 
   initrd (hd0,4)/initrd-* 

V tomto příkladě GRUB vyhledá dostupná jádra na oddíle (hd0,4) a doplní do souboru menu.lst:

title linux-default
   wildcard (hd0,4)/vmlinuz-default
   kernel (hd0,4)/vmlinuz-default root=/dev/hda7 vga=791 
   initrd (hd0,4)/initrd-default 
title linux-test
   wildcard (hd0,4)/vmlinuz-test
   kernel (hd0,4)/vmlinuz-test root=/dev/hda7 vga=791 
   initrd (hd0,4)/initrd-test 
    

Problémy mohou nastat, pokud jste obrazy jader pojmenovali jiným než obvyklým způsobem, který nevyhovuje zadaným kritériím hledání, nebo pokud některý ze souborů neexistuje. Problémy s nastavením a používánímzástupných znaků nespadají do instalační podpory.

9.3.2. Soubor device.map

Výše zmíněný soubor device.map mapuje zařízení pojmenovaná podle notace programu GRUB na jména podle Linuxové notace. Pokud váš systém má jak IDE tak SCSI zařízení, GRUB zkouší určit pořadí zavádění podle určitého algoritmu. Bohužel GRUB není schopen získat tuto informaci z BIOSu. Ukládá proto pořadí zařízení, ze kterých se zavádí systém do souboru /boot/GRUB/device.map. Na systémech kde je BIOS nastaven tak, aby zaváděl OS z IDE disků a až poté z SCSI, by soubor vypadal takto:

(fd0)  /dev/fd0
(hd0)  /dev/hda
(hd1)  /dev/hdb
(hd2)  /dev/sda
(hd3)  /dev/sdb

Jestliže GRUB zavádí systém podle device.map a narazí na problém, zkontrolujte pořadí zařízení v tomto souboru, a případně změňte jejich pořadí v GRUB shellu. Jakmile nastartujete systém, můžete změnit pořadí v modulu konfigurace zavaděče programu YaST, nebo ve vašem oblíbeném editoru.

Po změnách provedených v souboru device.map musíte aktualizovat instalaci zavaděče. To provedete následujícími příkazy:

GRUB -batch < /etc/GRUB.conf

9.3.3. Soubor /etc/grub.conf

Kromě souborů menu.lst a device.map GRUB používá pro uložení svého nastavení také soubor GRUB.conf. V tomto souboru jsou uložena data o místech, kam má příkaz GRUB uložit kód zavaděče:

root (hd0,4)
install /GRUB/stage1 d (hd0) /GRUB/stage2 0x8000
(hd0,4)/GRUB/menu.lst
quit

Druhá a první řádka jsou napsané v jedné řádce. Jednotlivé údaje mají následující význam:

root(hd0,4)

Tato položka říká programu GRUB, že veškeré následující příkazy se týkají prvního logického oddílu na prvním disku, na kterém jsou uloženy soubory pro zavádění.

install parametr

Zde se říká, že GRUB má spustit svůj interní příkaz install a určuje, kam uložit kód. Zavaděč prvního stupně zapsat do MBR prvního disku (/GRUB/stage1 d (hd0)), a na paměťovou adresu 0x8000 nahrát zavaděč druhé fáze (/GRUB/stage2 0x8000). Poslední parametr ((hd0,4)/GRUB/menu.lst) ukazuje, kde je uložen soubor s menu.

9.3.4. GRUB shell

GRUB sestává ze dvou částí: zavaděče a běžného Linuxového programu (/usr/sbin/GRUB). Tomuto programu se také říká GRUB shell. Program obsahuje interní příkazy pro zapsání kódu zavaděče na disk nebo disketu (install a setup). Jinými slovy, tyto vnitřní příkazy můžete spustit v rámci GRUB shellu na běžícím Linuxovém stroji. Nicméně tyto příkazy jsou také dostupné během zavádění pomocí programu GRUB - ještě před tím, než je nastartován Linux. Díky tomu je mnohem jednodušší opravit vadný systém.

Výše zmíněný algoritmus pro mapování zařízení se použije pouze tehdy, pokud GRUB spouští svůj shell. GRUB načte soubor device.map a namapuje jména používaná programem GRUB na Linuxová jména. Každé zařízení je na jednom řádku. Pokud máte potíže se zaváděním systému, zkontrolujte zda pořadí zařízení uvedených v device.map koresponduje s nastavením v BIOSu počítače. Soubor najdete v adresáři /boot/GRUB/. Chcete-li vědět o tomto tématu více, přečtěte si sekci  9.3.2 – „Soubor device.map“.

9.3.5. Nastavení hesla pro zavádění

Protože GRUB umí během zavádění přistupovat na různé souborové systémy, můžeme ho použít i pro čtení souborů, které by za normálních okolností nebyly přístupné - na běžícím systému by uživatel potřeboval mít oprávnění uživatele root. Abyste tomuto zamezili, nastavte si heslo pro zavaděč GRUB. Tímto můžete zabránit neautorizovaným osobám v přístupu k souborům během zavádění, a předejít zavedení jiného než implicitního operačního systému.

[Important]Startovací heslo a splash

Pokud pro GRUB nastavíte heslo, není při startu zobrazen standardní splash.

Heslo vytvoříte tak, že se přihlásíte jako root a provedete následující kroky:

  1. Spusťte GRUB shell a zašifrujte heslo:

    GRUB> md5crypt
    Password: ****
    Encrypted: $1$lS2dv/$JOYcdxIn7CJk9xShzzJVw/
        
  2. Vložte zašifrovaný řetězec do globální sekce souboru menu.lst:

            gfxmenu (hd0,4)/message
            color white/blue black/light-gray
            default 0
            timeout 8
            password -md5 $1$lS2dv/$JOYcdxIn7CJk9xShzzJVw/
            

    Od teď nelze spouštět příkazy programu GRUB při zavádění systému bez znalosti hesla. Oprávnění získáte po stisknutí P a zadání hesla. Uživatelé ale stále mohou zavádět libovolné nainstalované OS bez omezení.

  3. Abyste zamezili zavedení některých operačních systémů, přidejte ke každé položce, kterou chcete mít chráněnou heslem, řádek lock. Jako v následujícím příkladě:

            title linux
                     kernel (hd0,4)/vmlinuz root=/dev/hda7 vga=791
                     initrd (hd0,4)/initrd
                     lock
         

    Po restartování počítače se při pokusu o zavedení OS z takto označené položky zobrazí chybová hláška:

        Error 32: Must be authenticated
        

    Česky tedy:

        Chyba 32: Musíte zadat heslo
            

    Vraťte se do menu stisknutím Enter. Zde stiskněte P a zadejte heslo. Vybraný OS (v našem případě Linux) se zavede po zadání hesla.

[Important]Heslo pro zavádění a úvodní obrazovka

Nastavení hesla vypne implicitní zobrazování grafické úvodní obrazovky (boot splash screen).