Boot loader

(Rendszertöltő szócikkből átirányítva)
Ez a közzétett változat, ellenőrizve: 2023. április 13. 3 változtatás vár ellenőrzésre.

A boot loader az operációs rendszer elsőként induló programja. Feladata a bootolás, vagyis a kernel háttértárolóról történő betöltése és elindítása. Ezután kezdődik a szolgáltatások elindítása (melyet tágabb értelemben a bootolás részének tekintünk). A háttértároló rendszerint merevlemez, de lehet CD, pendrive, SSD, hálózat stb.

A boot loader az operációs rendszer része. Ennek ellenére vannak olyan boot loaderek, melyek más operációs rendszert is el tudnak indítani (pl. a grub), sőt, olyanok is, melyek nem is kötődnek operációs rendszerhez (ezeket általában boot managereknek nevezik). Ez a chain loading-nak(en) (láncbetöltésnek) nevezett technikának köszönhető: a boot loader nem közvetlenül az operációs rendszert, hanem annak boot loaderét tölti be és indítja el. Vagyis a boot loader egy másik boot loadert indít.

A mai számítógépek a bekapcsolás után egy csak olvasható, kikapcsolás után sem felejtő memóriában (ROM-ban) tárolt programot, ún. firmware-t indítanak el. A boot loader elindítása a firmware utolsó teendője a gép ellenőrzése és a hardver eszközök üzembe helyezése után.

Ez a szócikk elsősorban az IBM PC típusú gépek bootolásával, a DOS és Linux operációs rendszer boot loadereivel foglalkozik.

Boot loader indítása BIOS-ban

szerkesztés

Az IBM PC-k hagyományos firmware-e a BIOS. Ez meghatározott sorrendben (mely a mai gépeken már állítható) keres a különböző tárolóeszközökön boot loadert, az elsőként megtaláltat betölti a memória egy fix helyére, és elindítja. A BIOS által betöltött boot loader legfeljebb 512 bájt lehet. A PC-k kezdetektől a mai napig meglevő konstrukciós hibája, hogy a BIOS nem adja át a boot loadernek, honnan töltötte a memóriába. A boot loader általában ugyanazon a fizikai eszközön van, mint az általa betöltendő kernel, de nem tudja, hol, ezért meg kell keresnie a kernelt.

A másik megoldandó elvi probléma, hogy az operációs rendszerek minden információt – a kernelt is beleértve – fájlokban tartanak, a BIOS és a boot loader azonban nem ismer fájlrendszert. 512 bájton ez lehetetlen. A boot loader következő feladata fájlrendszert kezelő program betöltése akár már az operációs rendszer részeként, akár a boot loader második fázisaként. Az előbbit alkalmazza a DOS boot loadere, az utóbbit a grub.

Az IBM PC bootolása floppyról

szerkesztés

Az IBM PC első változatának (szűkebb értelemben ez az IBM PC) háttértárolója általában egy, legfeljebb négy[1] 5"-es, 180K kapacitású floppy volt. A BIOS betöltötte a floppy első szektorát a memóriába, és elindította: ez volt a boot loader, mely aztán BIOS-hívásokkal a floppyról beolvasta az operációs rendszert.

Két (vagy több) floppy esetén már itt kiütközött a konstrukciós hiba: a gép csak az A: floppydrive-ról tudott bootolni. Elvileg persze lehetett volna olyan boot loadert írni, mely a B:-t használja, de ez esetben a felhasználónak kellett volna tudnia, hogy két ugyanolyan floppy közül az egyik csak az A:, a másik csak a B: drive-ból bootol.

Végül a problémát nem így oldották meg, hanem a BIOS-gyártók lehetővé tették BIOS szinten a floppyk felcserélését. Vagyis a boot loadert az A: floppydrive-ra írták meg, miközben a BIOS a második floppy-ra irányította. Később, amikor különböző méretű és kapacitású floppyk kerültek forgalomba, és két floppydrive nem okvetlenül volt egyforma, ez volt a módja a második drive használatának.

Bootolás más eszközről

szerkesztés

A SYS parancs a winchesterre olyan boot loadert írt, ami a winchesteren kereste a kernelt, így nem keveredett össze a floppyval. Két winchester esetén ugyanaz a probléma került elő, mint a floppy-nál. Alig volt olyan boot manager, ami képes volt a második winchesterről is bootolni.

A CD-k megjelenése nem okozott nagy problémát: ritkán volt egy gépben több CD-olvasó. Az USB-k megjelenésével azonban a helyzet tarthatatlanná vált a bootoló eszköz kiválasztása és a boot loaderek kapcsán. A boot loaderek végignézik az összes lehetséges bootoló eszközt, és keresnek rajta egy jelet, ahonnan felismerik a keresett kernelt. Miután az USB-probléma a DOS-t már nem érinti, a kérdést a grub-bal kapcsolatban folytatjuk.

Boot loader indítása UEFI-ben

szerkesztés

Az UEFI(en) egy általános, nemcsak IBM PC-n használható firmware. IBM PC-n a BIOS-t válthatja fel. A mai PC-firmware-ekben beállítható, hogy BIOS vagy UEFI módban működjenek-e.

Az UEFI rendkívüli módon leegyszerűsíti az operációs rendszerek bootolását, ui. ismeri a vfat fájlrendszert. Ebben keresi egy szabványosított nevű könyvtárban és fájlban a boot loadert. Ugyanúgy indítja el, mint az operációs rendszerek a (külső, nem shell-be épített) parancsokat. A fájl neve \EFI\BOOT\BOOTx64.EFI 64 bites, \EFI\BOOT\BOOTIA32.EFI 32 bites PC esetén. (A vfat fájlrendszerben a könyvtárakat \ választja el egymástól, a kis- és nagybetűk azonosnak számítanak.)

Ha a gépen több operációs rendszer van, a szabványos boot loader lehet olyan boot manager, mely tud chain load-ot (pl. a grub), de az UEFI utasításaival, parancssorból is el lehet indítani valamelyik boot loadert tartalmazó fájlt.

Ha nincs szabványos nevű bootolandó fájl, az UEFI némi késleltetés után a \startup.nsh-t próbálja indítani, mely UEFI-utasításokat tartalmaz. Ha a fájl nem létezik, promptot ad, és a kezelő parancsaira vár. Az UEFI parancsnyelve, mely a billentyűről vagy a \startup.nsh-ból kapott parancsokat értelmezi, kb. a DOS parancsnyelvének bonyolultságával ér fel.

Az UEFI-t szabványos partíciós táblára, az ún. GPT-re tervezték. GPT-ben is vannak partíciótípusok, az UEFI boot partíciójának típuskódja 1. A partícióknak vannak flag-jeik, többek között létezik a DOS/MBR-partícióból ismert bootolható flag arra az esetre, ha ezt a gép firmware-je megkövetelné, vagy több 1-es típusú partíció lenne.

A DOS/MBR-típusú partíciós táblába utólag vették fel az EFI típust. Kódja EF, célja, hogy lehessen UEFI-partíciót használni a teljes partíciós tábla GPT-re konvertálása nélkül. A partíciót itt is vfat32-re kell formázni.

A DOS bootolása

szerkesztés

Ebben az alfejezetben arról lesz szó, hogyan oldotta meg a DOS azt a tyúk-tojás problémát, hogy a boot loadernek fájlból kell olvasnia a kernelt, de kernel nélkül nem ismer fájlrendszert.

A boot loadert a DOS SYS(en) parancsa írta fel a floppy első szektorába,[2] közvetlenül utána pedig a kernelt diszk-kép formájában (a szektorok sorrendje azonos volt a memóriabeli sorrenddel). Ha a floppy elején nem volt elég hely (mert már voltak fájlok a floppy-n), a SYS hibát jelzett, és nem tudta bootolhatóvá tenni a floppy-t. A diszkkép felírásával együtt létrehozott két fájlt IO.SYS és MSDOS.SYS néven, melyek területe azonos volt a felírttal, így más fájl nem írta felül őket. A két fájl számára bevezettek egy külön attribútumot, a SYSTEM-et, mely azt jelentette, hogy a fájlokat nem szabad elmozgatni a floppy más területére (pl. töredezettségmentesítés érdekében). (Egyúttal rejtetté is tette a két fájlt, bár itt és most ennek nincs jelentősége.)

Winchesteren annyi volt a különbség, hogy az első szektorba, az MBR-be egy általános célú boot loader került, mely az ugyanebben a szektorban található partíciós táblából kiválasztotta az aktívat (bootolhatót), azután betöltötte és elindította a partíció első szektorát, mely a partíció boot loaderét tartalmazta. Innen lényegében azonos a folyamat a floppy-éval. Más szóval: az mbr-beli boot loader láncbetöltést végzett.

Az aktív flag-es partíciós megoldásnak óriási hátránya volt, hogy bekapcsolás után az az operációs rendszer bootolt be, amit előzőleg beállítottunk. Ha épp nem azt akartuk használni, az aktív flag átállítása után még egy bootra volt szükség. Nem véletlen, hogy a DOS-felhasználók nagyon gyorsan elkezdtek különböző boot managereket használni. Ennek ellenére néhány BIOS a mai napig kitartóan ellenőrzi a boot flag meglétét, és nem hajlandó nélküle bootolni, bár a flag-et ma már szinte senki nem használja.

Bootolás grub-bal

szerkesztés

A grub a linux rendkívül sikeres boot loadere. Winchesteren szinte mindig ezt használják. Kiszorította a korábban egyeduralkodó LILO-t(en), aminek még a fejlesztését is abbahagyták. Egyedül az ISO-formátumú CD-ken van versenytársa: az isolinux(en).

Sikerét annak köszönheti, hogy olvasni tud szinte minden fájlrendszert, ami linuxban szóbajön, beleértve a ZFS-t is. Ez óriási előnyt ad:

  • hiba esetén a felhasználó bele tud nézni a fájlrendszerekbe, így sokszor kideríthető a hiba oka, és gyakran kézzel kiadott grub-utasításokkal bebootolható a rakoncátlan operációs rendszer
  • képes felismerni az elérhető operációs rendszereket, így automatikusan tud boot menüt generálni
  • nem kell másolatot készítenie a kernelről és az initrd-ről (és megismételni a másolást minden változtatáskor), hiszen azt közvetlenül tudja olvasni a fájlrendszerből bootolás során.

Lényegében úgy bootol, mint a DOS, azzal a különbséggel, hogy az ottani boot loader csak a grub első fázisa, mely a grub második fázisát tölti be a DOS-nál leírt kernel helyett, ugyanúgy diszk-képből. A második fázis (normal.mod grub-modul) által válik lehetővé a kommunikáció a felhasználóval és a fájlrendszerek ismerete, amivel közvetlenül tud linux rendszereket bootolni, és láncbetöltéssel windows-t is.

Ugyancsak a fájlrendszer ismeretének köszönhető, hogy különbséget tud tenni több bootolható rendszer között (hiszen több USB eszköz is tartalmazhat bootolható rendszert). A grub search utasítása beállítja a parancsban megadott grub-változó értékét arra a partícióra, melyen a keresett jelet megtalálta. A keresett jel lehet

  • a fájlrendszer azonosítója (UUID(en)) search --set root --fs-uuid UUID
  • a fájlrendszer címkéje[3] search --set root --label címke
  • a fájlrendszerben található fájl search --set root --file fájlnév.

A fenti példákban a root változó szerepel, mert ha grub-utasításban fájlra hivatkozunk eszközmegadás nélkül, a root változóból veszi a grub az eszköz grub-nevét.

A bootolás előtt meg kell adni a kiválasztott kernelt és annak root fájlrendszerét, az utóbbit nem grub-, hanem linux eszköznévvel:

linux /boot/kernelfile root=/dev/disk/by-uuid/UUID
linux /boot/kernelfile root=/dev/disk/by-label/címke

A linux grub-utasítás két helyen is hivatkozik fájlra, egyik esetben sincs megadva a grub-eszköznév,[4] ezért a grub abban a fájlrendszerben keresi a /boot ill. /dev könyvtárat, amelyikben megtalálta az search utasításbeli UUID-et ill. címkét. A /dev/disk/by-uuid/UUID ill. /dev/disk/by-label/címke pedig szimbolikus link a megfelelő eszközfájlra. Így találja meg a kernel a root fájlrendszerét.

A --file fájlnév lehetőséget CD-k esetén használják, ahol a megadott fájllal azonos könyvtárban található a kernel, az initrd és a kernel root fájlrendszerét squashFS(en) fájlrendszerbe csomagolva tartalmazó alkönyvtár. Ilyenkor a grub-utasítás linux /vmlinuz boot=live alakú, ahol live az előbb említett alkönyvtár neve, vmlinuz a kernelé.[5]

  1. A PC hardver a mai napig legfeljebb négy floppyvezérlő áramkört tartalmaz.
  2. A FORMAT nevű alacsony szintű formázóprogram, mely a floppy track-jeit és szektorait létrehozta, az első szektort egy olyan „boot loader”-rel töltötte fel, mely kiírta, hogy a floppy-n nincs operációs rendszer, és nem bootolt.
  3. A címke megadása fájlrendszerenként más, pl. az ext2/3/4 fájlrendszerben az e2label vagy tune2fs utasítással lehet címkét rendelni a fájlrendszerhez.
  4. Eszköznévvel pl. ilyen lenne: linux (hd0,2)/boot/kernelfile
  5. Példa a --file fájlnév használatára (WikiKönyvek).
UEFI: Grub:

Kapcsolódó lapok

szerkesztés