Linux/Saját linux live CD készítése/Bootolási hiba keresése grub-bal

A Wikikönyvekből, a szabad elektronikus könyvtárból.

Ha egy gép nem bootol, először megpróbáljuk megkeresni a hiba okát. Ennek ismeretében általában elég gyorsan el lehet dönteni, hogy van-e esély rá, hogy a grub interaktív utasításaival be lehessen bootolni a gépet, vagy az erősebb fegyverhez, a live/rescue CD/USB-hez kell fordulni. A legvégső esetben visszatöltünk mentésből, de ezzel elveszítjük a mentés és a visszatöltés között keletkezett információkat.

A grub egy mini operációs rendszer saját fájlrendszerrel és speciális parancsokkal. Moduláris szerkezetű, a modulok az egyes grub-parancsokat vagy -funkciókat hajtják végre. Elképzelhető, hogy az alábbi leírt grub-parancsok egy részét a grub a megfelelő modul hiányában nem érti meg. Indulás után a /boot/grub/grub.cfg-beli parancsokat hajtja végre abban a fájlrendszerben, amelyre a root nevű környezeti változója mutat (a paraméter nélküli set set parancs írja ki a változókat).

A grub az általa látott fájlrendszerekre kerek zárójelbeli saját névvel hivatkozik. A kerek zárójel a név része. A név nem azonos a kernel által a /dev könyvtárban létrehozottakkal: sok hiba ebből az eltérésből adódik. A grub tudja olvasni a fájlrendszereket (feltéve, hogy a megfelelő modulja rendelkezésre áll), így látja pl. a grub.cfg-t is.

A bootolás sorrendje[szerkesztés]

A hiba okának kiderítéséhez tudni kell, hogy melyik lépésben következett be. A lépések:

  1. a BIOS vagy UEFI elindítja a grub első fázisát
  2. az első fázis elindítja a másodikat, mely már látja a bootolandó fájlrendszert, benne a grub.cfg-vel, kernellel, initrd-vel
  3. a grub betölti a kernelt, az initrd számára pedig létrehoz egy memóriadiszket, majd elindítja a kernelt, root fájlrendszerként a memóriadiszkkel.
  4. az initrd egy mini linux egy mini, memóriabeli fájlrendszerben, a kernel számára tehát egy szokásos módon elindítandó linux rendszer. A legfontosabb feladata a bootoláshoz szükséges kernel-modulok betöltése.
  5. a programok lefuttatása után az initrd a pivot_root kernelhívással megváltoztatja a kernel root fájlrendszerét a root nevű kernelparaméterben kapottra. A kernel felszabadítja az initrd-t tartalmazó memóriadiszket, és elindítja az új root-ban levő linux rendszert.

A grub két fázisa két különböző helyre íródik a diszken. Az első fázis igen rövid, pár száz bájt, ezért az mbr 512 bájtjában is elfér (a partíciós táblával együtt).

A leggyakoribb hibaüzenetek/-jelenségek[szerkesztés]

Invalid partition table!
Az üzenetet a BIOS írja ki, így a szöveg kissé változó lehet. A BIOS nem tudja elolvasni a diszk vagy pendrive partíciós tábláját. Ha gpt-t akartunk bootolni, lehet, hogy egyáltalán nem ismeri azt. Sok túlbuzgó BIOS ellenőrzi, hogy van-e bootolhatónak megjelölt partíció, holott azt a boot loaderek/managerek régóta nem használják. Ha a boot flag nem segít, CD-ről kell megpróbálni bootolni, mert az nem használ partíciós táblát, vagy másik (másféle partíciós táblájú) diszkről. Meggondolandó a BIOS frissítése – persze csak a hiba elhárítása után.
A gép el sem kezd bootolni a kívánt diszkről
A gép BIOS-ában nincs engedélyezve a bootolás az eszközről, vagy az eszközök sorrendje rossz. Itt is lehet baj a bootolhatóként megjelölt partíció hiánya, vagy az, hogy a BIOS nem ismeri az eszközön levő gpt partíciót. Az is lehet, hogy az eszközön nincs grub. Hardver ok (pl. érintkezési hiba) is elképzelhető.
A bootolás a grub rescue> prompttal megáll
A grub nem tudja betölteni a második fázisát. A grub-install utasításban az eszközfájl nem a diszkképre mutatott, amikor bootolhatóvá akartuk tenni a diszket, vagy nem vettük figyelembe a grub hibajelzését. Annyit tehetünk, hogy az ls utasítással megnézzük, a grub lát-e egyáltalán diszket (blokkos eszközt), amiről bootolni lehet. Ha igen, a normal nevű grub-modul betöltésével a normál grub-promptba jutunk: insmod normal vagy insmod grub-eszköz/boot/grub/normal.mod.
A bootolás a grub> prompttal megáll
Hiányzik vagy rossz helyen van a grub.cfg fájl. A gépet kézzel kiadott grub-utasításokkal általában be tudjuk bootolni.
A bootolás az (initramfs) prompttal megáll
Az initrd elindult, de nem tud átváltani a végleges root fájlrendszerre. A grub megtalálta a root fájlrendszert, de az initrd nem, mert a grub-név jó volt, a kernel eszköznév nem. A két név ui. különböző. (Mini) linuxban vagyunk, megpróbálhatjuk kideríteni, mi a baj. Pl.:
ls -l /dev/disk/by-label
ls -l /dev/sda*
mount
lsmod
cat /proc/cmdline
A bootolás kernel panic-kal végződik
A kernel elindult, de nem találja a root fájlrendszert. Nem töltődött be a megfelelő kernel-modul initrd-ből. Vagy a kernel nem találja a grub.cfg-ben megadott initrd fájlt (a grub megtalálta, különben nem jutott volna ide, tehát ismét a grub és kernel közötti névkülönbség okozza a bajt), vagy a tartalma nem megfelelő.

A grub bootolással kapcsolatos utasításai[szerkesztés]

Ha elindult a grub második fázisa, és megtalálta a grub.cfg fájlt /boot/grub-ban, visszaszámlálást látunk. A c megnyomásával jutunk grub parancsmódba, a e azt írja ki, milyen utasításokat fog végrehajtani a grub, ha az adott menütételt választjuk ki. Szövegszerkesztőben vagyunk: az utasításokat módosíthatjuk. c-ből vagy e-ből Esc-vel jutunk a visszaszámláláshoz.

Ha visszaszámlálás nélkül jutottunk a grub promptba, akkor a grub nem találta a grub.cfg-t, vagy az hibás volt (ezt a cat /boot/grub/grub.cfg-vel ellenőrizhetjük). A grub> prompt mellett a képernyő a sorszerkesztési lehetőségeket is mutatja.

Bootolás grub parancssorból:

  • ls kiírja a grub által látott diszkeket (blokkos eszközöket) a saját eszközneveivel. A kerek zárójelek az eszköznév részei.
  • set root=grub-eszköznév lehetővé teszi, hogy a fájlnevekben ne kelljen kiírni az itt megadott eszköznevet. A root az egyik grub környezeti változó. A paraméter nélküli set az összeset kiírja.
  • ls fájl kiírja a wildcard-dal megadott fájlok nevét vagy a könyvtár tartalmát. ZFS fájlrendszer esetén a név mountpoint/@/ alakú. A poolt eszköznév (partíció) adja meg.
  • set pager=1 a másutt more paranccsal szokásos lapozást állítja be
  • linux kernelfájl root=linux-eszközfájl a bootolandó kernel és a root fájlrendszer megadása, az utóbbi már kernelbeli eszköz-elnevezéssel. A sor végén kernelparaméterek adhatók meg
  • initrd initrd-fájl az initrd megadása grub-nak
  • boot bootolás a linux és initrd-ben megadott paraméterekkel
  • cat fájl mint linuxban
  • help a grub parancsai

Példa:

ls (hd0,msdos5)/boot/grub

Ugyanez másképp:

set root=(hd0,msdos5)
ls /boot/grub

Példa kézi bootolásra:

set root=(hd0,msdos5)
linux /vmlinuz root=/dev/sda3
initrd /initrd.img
boot

ZFS fájlrendszer esetén:

set root=(hd0,msdos1)
linux /ROOT/@/vmlinuz root=ZFS=helyi/ROOT
initrd /ROOT/@/initrd.img
boot