Bootloader
From Wikipedia, the free encyclopedia
Remove ads
A bootloader 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 bootloader az operációs rendszer része. Ennek ellenére vannak olyan bootloaderek, 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 bootloader nem közvetlenül az operációs rendszert, hanem annak bootloaderét tölti be és indítja el. Vagyis a bootloader egy másik bootloadert 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 bootloader 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 bootloadereivel foglalkozik.
Remove ads
Bootloader indítása BIOS-ban
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 bootloadert, az elsőként megtaláltat betölti a memória egy fix helyére, és elindítja. A BIOS által betöltött bootloader 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 bootloadernek, honnan töltötte a memóriába. A bootloader á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 bootloader azonban nem ismer fájlrendszert. 512 bájton ez lehetetlen. A bootloader 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 bootloader második fázisaként. Az előbbit alkalmazza a DOS bootloadere, az utóbbit a grub.
Az IBM PC bootolása floppyról
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 bootloader, 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 bootloadert í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 bootloadert 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
A SYS parancs a winchesterre olyan bootloadert í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 bootloaderek kapcsán. A bootloaderek 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.
Remove ads
Bootloader indítása UEFI-ben
Az UEFI 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 bootloadert. 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 bootloader 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 bootloadert 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.
Remove ads
A DOS bootolása
Ebben az alfejezetben arról lesz szó, hogyan oldotta meg a DOS azt a tyúk-tojás problémát, hogy a bootloadernek fájlból kell olvasnia a kernelt, de kernel nélkül nem ismer fájlrendszert.
A bootloadert 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ú bootloader 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ó bootloaderét tartalmazta. Innen lényegében azonos a folyamat a floppy-éval. Más szóval: az mbr-beli bootloader 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
A grub a linux rendkívül sikeres bootloadere. 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 bootloader 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]
Remove ads
Jegyzetek
Források
Kapcsolódó lapok
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads