Linux/Saját linux live CD készítése/Bootolási hiba keresése grub-bal
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:
- a BIOS vagy UEFI elindítja a grub első fázisát
- 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
- 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.
- 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.
- 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
vagyinsmod 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üliset
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évmountpoint/@/
alakú. A poolt eszköznév (partíció) adja meg.set pager=1
a másutt more paranccsal szokásos lapozást állítja belinux 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 meginitrd initrd-fájl
az initrd megadása grub-nakboot
bootolás alinux
ésinitrd
-ben megadott paraméterekkelcat fájl
mint linuxbanhelp
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