GRUB (rescue mode)

From DCEwiki
Revision as of 18:07, 23 February 2015 by Keny (talk | contribs) (→‎Zavedení MS Windows)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Do rescue mode (záchranného režimu) se GRUB2 dostane tehdy, když z nějakého důvodu nemůže pokračovat v činnosti. To se může stát z následujících příčin:

  1. Při instalaci GRUB2 byl chybně nastaven prefix nebo kořen ( "root" )
  2. V datovém bloku pro "first stage" chybí modul, potřebný ke zpřístupnění adresáře s dalšími moduly, nutnými pro zavedení systému
  3. Chybí obsah souboru grub.cfg


Základní příkazy

GRUB2 v záchranném režimu ( mode rescue ) má dostupnou pouze základní sadu příkazů, přesto s jejich pomocí můžete nejenom nalézt odpověď na otázku proč se váš systém nespouští, ale i případnou chybu provizorně opravit a systém spustit.

set
je-li spuštěn bez parametrů, vypíše seznam aktuálně nastavených proměnných. Jeho prostřednictvím lze také hodnoty proměnných přenastavit
ls
Tento příkaz je zjednodušená varianta příkazu, který je jinak součástí modulu ls, provádí vylistování lokálních disků a jejich obsahu, za předpokladu, že jsou natažené moduly, které to umožňují
insmod
umožňuje natáhnout další moduly. Příkaz rmmod který umožňuje naopak jejich odebírání je stejně jako příkaz lsmod součástí modulu minicmd. Tzn. že v rescue mode nemusí být dostupný!

Tuto základní paletu příkazů lze rozšířit pomocí dalších modulů přidaných do do prvního stupně zavaděče (first stage).

Krok první - kontrola proměnných

Chybné nastavení proměnných prefix a root při instalaci GRUB2 je nejčastějším zdrojem problémů při zavádění systému!

Poznámka
grub rescue> set
prefix=(hd96)/boot/grub/i386-pc
root=hd96

prefix

Pro GRUB2 je nejdůležitější nastavení proměnné prefix. Prefix obsahuje cestu do adresáře s dalšími moduly, bez kterých může být zavedení systému nemožné.

Není-li hodnota proměnné prefix nastavena správně, tak sice lze moduly zavést, ale při jejich natahování je nutné uvést plnou cestu - tj. včetně blokového zařízení a přípony.

Je-li prefix v pořádku, stačí příkazu insmod předat pouze název modulu bez přípony.

Upozornění Nastavení prefixu pro first stage se provádí při sestavování core.img, který je její součástí. Viz kapitola o instalaci GRUB2 na fyzické zařízení.

root

Druhá proměnná root obsahuje adresu zařízení, které má GRUB2 považovat za výchozí. Není-li tato proměnná nastavena správně, lze sice systém zavést, ale při zavádění musí být před cestou k jádru a ramdisku uvedena i adresa zařízení, včetně příslušného diskového oddílu.

Poznámka Proměnná root je obvykle nastavena na stejné blokové zařízení jako je to, na kterém má své moduly GRUB2, ale nemusí tomu tak být vždy. Hodnota pro root se mění, pokud chceme zavádět systém z jiného diskového zařízení, než ze kterého natahuje své moduly GRUB2.

Krok druhý - kontrola dostupných zařízení

Když spustíte příkaz ls bez parametru, uvidíte obvykle podobný výpis, jako je ten na níže uvedeném příkladu...

Poznámka
grub rescue> ls
(hd0) (hd1)
Upozornění Aby mohl GRUB2 dotáhnout všechny moduly potřebné pro zavedení systému, pak moduly, nezbytné pro zpřístupnění adresáře, který je uveden v prefixu musí být součástí first stage.

Nevypíše-li příkaz ls žádné lokální zařízení, pak to znamená, že ve first stage chybí modul biosdisk.

error: unknown filesystem

GRUB2 v současné době (verze 1.99~rc3) má k dispozici jak moduly pro většinu běžně používaných souborových systémů, tak i moduly pro různé typy tabulek rozdělení diskových oddílů, i vyšší logické vrstvy (SW RAID, LVM). Jenže prostor pro first stage je většinou omezený a tím pádem tato část zavaděče obsahuje pouze nezbytně nutné moduly.

Tato chybová hláška signalizuje, že zařízení u kterého se pokoušíme o výpis..

  • buď žádný souborový systém neobsahuje
  • nebo pro jeho souborový systém chybí příslušný modul
  • nebo je zařízení jenom nižší vrstvou pro RAID pole, či LVM skupinu
Poznámka
grub rescue> ls (hd2)
error: unknown filesystem
Upozornění Jde-li o zařízení na které odkazuje prefix, pak jde o chybu smrtelnou, kterou lze ošetřit jedině nabootováním, resp. natažením modulů GRUB2 z jiného blokového zařízení, pro které jsou ovladače ve first stage k dispozici.

U blokových zařízení, které jsou součástí RAID pole, nebo LVM skupiny, záleží také na pořadí v jakém jsou zaváděny moduly pro jednotlivé abstraktní vrstvy.

V případě, že je operační systém nainstalován nad RAID polem, musí být nejdřív natažen modul pro příslušný typ RAID pole a teprve až GRUB2 pole rozpozná, může být zaveden modul pro další vrstvu.

Poznámka Rozpoznávání LVM logických disků provádí GRUB2 při prvním natažení modulu lvm. By-li tedy modul lvm zaveden dřív, než bylo rozpoznáno RAID pole, které má být jeho součástí, musí být nejprve příkazem rmmod úplně odstraněny všechny stávající instance tohoto modulu, a teprve pak se při novém zavedení modulu lvm vytvoří příslušná zařízení.

error: bad filename

Je vcelku banální chybová hláška, která se objeví tehdy, pokud cílem příkazu ls není známé fyzické blokové zařízení, nebo adresář.

Poznámka
grub rescue> ls (system-boot)

error: bad filename

Obvykle stačí za identifikací zařízení uvést cestu..

Poznámka
grub rescue> ls (system-boot)/
./ ../ lost+found/ grub/

error: not a regular file

Poznámka
grub rescue> cat (hd0,msdos1)/grub
error: not a regular file

Krok třetí - nastavení prefixu a zavedení modulu

Při bootování z first stage která má sice k dispozici všechny potřebné moduly, ale špatně nastavený prefix (viz upozornění výše), je třeba..

  1. nejdříve opravit prefix
  2. pak přenastavit root
  3. překontrolovat nastavení
  4. a po natažením modulu normal zkusit spustit normální menu
Poznámka
grub rescue> set prefix=(hd0,msdos1)/grub/
grub rescue> set root=(hd0,msdos1)
grub rescue> set
prefix=(hd0,msdos1)/grub/
root=hd0,msdos1
grub rescue> ls /
grub/ config-xxxx System.map-xxxx vmlinuz-xxxx initrd.img-xxxx
grub rescue> insmod normal
grub rescue> normal

Pokud se normální režim zavést nepodaří, je zřejmě nějaká chyba ve výchozím menu a nezbývá než se pokusit zavést systém ručně.

Krok čtvrtý - zavedení systému

Zavedení linuxového systému

Poznámka
grub rescue> insmod linux
grub rescue> linux  /vmlinuz-xxxx root=/dev/sda1 ro single
grub rescue> initrd /initrd.img-xxxx
grub rescue> boot

Zavedení MS Windows

Poznámka U následujícího ukázkového případu je systém s MS Windows umístěn na prvním diskovém oddíle.
  1. Nejprve je třeba zavést ovladač ntfs aby bylo možné číst soubory ze souborového systému
  2. A pak je možné po zavedení modulu ntldr zavolat zavaděč ntldr z MS Windows
grub rescue> insmod ntfs
grub rescue> insmod ntldr
grub rescue> set root=(hd0,msdos1)
grub rescue> ntldr /ntldr
grub rescue> boot
Poznámka Dříve se pro zavedení MS Windows systému, který byl umístěn na prvním diskovém oddíle používal modul chainloader
grub rescue> insmod chainloader
grub rescue> set root=(hd0,msdos1)
grub rescue> chainloader +1
grub rescue> boot

Součástí diskového oddílu formátovaného na NTFS, kde je nainstalován operační systém MS Windows, je také informace na kterém sektoru disku. Ta je umístěna na offsetu 0x1c, ale hodnota v hexa kódu je zapsaná na přeskáčku podle následujícího schématu:

"0xABCDEFGH => GH EF CD AB"

U starších MS-DOS tabulek začínal první oddíl obvykle na 63 sektoru (viz předchozí stránka ) to bude hexa hodnota..

spike:~# printf "%x" 63
3f

Která po příslušném zpřeházení bude vypadat takto:

"0x00 00 00 3f" => "3f 00 00 00"

Novější MS-DOS tabulky však mají začátek prvního diskového oddílu posunutý až na sektor 2048 ( hodnota 0x800 ), takže po případném přestěhování diskového oddílu ze staršího disku je třeba provést manuální editaci a původní hodnotu změnit na..

"0x00 00 08 00" => "00 08 00 00"

V případě, že bychom systém s MS Windows přesunuli až na další diskový oddíl, který by začínal třeba na sektoru 40965750 ( hodnota 0x2711676 ), tak by byla hodnota zase jiná:

"0x02 71 16 76" => "76 16 71 02"

Editaci lze provést buď pomocí editoru hexcurse, ve kterém po otevření příslušného diskového oddílu (dejme tomu /dev/sda1) nejprve skočíme na pozici 0x1c, pak přepíšeme původní řetězcovou hodnotu na novou a změny zapíšeme.

Nebo zapsáním příslušné hodnoty na odpovídající místo disku pomocí utility dd

Poznámka Změna hodnoty pro diskový oddíl s NTFS, který byl přesunut na první diskový oddíl /dev/sda1, začínající na sektoru 4096 ( 0x1000 )
"0x00 00 10 00" => "00 10 00 00"

Při zápisu je třeba dát především pozor na to, abychom zadali správně všechny parametry. Ty se pro jiné diskové oddíly - kromě cílového diskového oddílu a hodnoty zapsané do souboru temp.in měnit nebudou.

stroj:~# echo -e "\x00\x10\x00\x00" > temp.in
stroj:~# dd if=temp.in of=/dev/sda1 bs=4 count=1 seek=7 conv=notrunc
  • Příkaz echo s parametrem -e, interpretuje hexakódy na obdpovídající bajty, které zapíše do dočasného souboru temp.in
  • Parametr bs=4, zajistí, že se zapíše blok o velikosti 4 bajtů z dočasného souboru temp.in
  • Parametr count=1, zajistí, že se zapíše pouze jeden čtyřbajtový blok z dočasného souboru temp.in a víc nic.
  • Parametr seek=7, zajistí že se tento blok zapíše od 28 bajtu ( 4*7 - pozice 0x1c )
  • Parametr conv=notrunc, je nezbytně nutný, aby nedošlo ke zkrácení zápisu příkazu dd a přepsání zbylých dat

Další proměnné

Při práci s GRUB2 se vám může hodit znalost dalších proměnných, které ovlivňují chování shellu:

pager
Nastavuje stránkování výpisu. Je-li nastaveno bez konkrétní hodnoty, posouvá se výpis vždy o celou obrazovku. Jinak v závislosti na nastavené hodnotě. Hodí se to obzvlášť při použití příkazů help, ls, lsmod, cat, aj.
menu_color_normal
nastavuje barvy pro menu. Týká se to například i příkazové řádky GRUB2 shellu
menu_color_highlight
nastavuje barvy pro vysvícené položky
gfxmode
nastavení rozlišení pro zavedení modulu gfxterm
default
určuje pořadí výchozí bootovací položky v menu grub.cfg
lang=cs_CZ
nastavení pro locales
locale_dir
nastavení adresáře s lokalizačními soubory. Obvykle to je podadresář locale, umístěný v prefixu. Nastavení cesty musí být plné, tj. včetně identifikace blokového zařízení.