Bevezetés a Linux rendszerindítási és indítási folyamataiba
A Linux rendszerindítási és indítási folyamatainak megértése fontos mind a Linux konfigurálásához, mind az indítási problémák megoldásához. Ez a cikk a GRUB2 bootloader segítségével történő bootolási sorrend és a systemd inicializáló rendszer által végrehajtott indítási sorrend áttekintését mutatja be.
A valóságban két eseménysorozat szükséges ahhoz, hogy egy Linux számítógépet elindítsunk és használhatóvá tegyünk: a boot és az indítás. A boot-szekvencia a számítógép bekapcsolásakor kezdődik, és a kernel inicializálásával és a systemd indításával fejeződik be. Ezt követően az indítási folyamat veszi át a feladatot, és fejezi be a Linux-számítógép üzemképes állapotba hozását.
A Linux bootolási és indítási folyamata összességében meglehetősen egyszerűen érthető. A következő lépésekből áll, amelyeket a következő szakaszokban részletesebben ismertetünk.
- BIOS POST
- Boot loader (GRUB2)
- Kernel inicializálása
- A systemd, az összes folyamat szülőprogramjának elindítása.
Megjegyezzük, hogy ez a cikk azért foglalkozik a GRUB2-vel és a systemd-vel, mert a legtöbb nagyobb disztribúcióban ezek a jelenlegi boot loader és inicializáló szoftverek. Történelmileg más szoftvereket is használtak, és néhány disztribúcióban még mindig megtalálhatóak.
A bootolási folyamat
A bootolási folyamat többféleképpen is elindítható. Először is, ha a tápellátás ki van kapcsolva, a táp bekapcsolása elindítja a boot folyamatot. Ha a számítógépen már egy helyi felhasználó fut, beleértve a root vagy egy nem privilegizált felhasználót, a felhasználó programozottan is kezdeményezheti a boot folyamatot a GUI vagy a parancssor segítségével, hogy újraindítást kezdeményezzen. Az újraindítás először leállítja, majd újraindítja a számítógépet.
BIOS POST
A Linux-indítási folyamat első lépésének valójában semmi köze a Linuxhoz. Ez a bootolási folyamat hardveres része, és minden operációs rendszer esetében ugyanaz. Amikor a számítógépet először bekapcsoljuk, lefut a POST (Power On Self Test), amely a BIOS (Basic I/O System) része.
Amikor az IBM 1981-ben megtervezte az első PC-t, a BIOS-t a hardverkomponensek inicializálására tervezték. A POST a BIOS azon része, amelynek feladata a számítógép hardverének megfelelő működésének biztosítása. Ha a POST hibásan működik, előfordulhat, hogy a számítógép nem használható, és így a rendszerindítási folyamat nem folytatódik.
A BIOS POST ellenőrzi a hardver alapvető működőképességét, majd BIOS-megszakítást (INT 13H) bocsát ki, amely megkeresi a boot-szektorokat a csatlakoztatott bootolható eszközökön. Az első olyan boot-szektort, amelyet talál, és amely érvényes boot-rekordot tartalmaz, betölti a RAM-ba, majd a vezérlés átkerül a boot-szektorból betöltött kódhoz.
A boot-szektor valójában a boot-töltő első szakasza. A legtöbb Linux-disztribúció háromféle bootloadert használ: GRUB, GRUB2 és LILO. A GRUB2 a legújabb, és manapság sokkal gyakrabban használják, mint a többi régebbi lehetőséget.
GRUB2
A GRUB2 a “GRand Unified Bootloader, version 2” rövidítése, és ma már ez az elsődleges bootloader a legtöbb jelenlegi Linux-disztribúcióban. A GRUB2 az a program, amely éppen elég okossá teszi a számítógépet ahhoz, hogy megtalálja az operációs rendszer kernelét és betöltse a memóriába. Mivel a GRUB-ot könnyebb leírni és kimondani, mint a GRUB2-t, ebben a dokumentumban használhatom a GRUB kifejezést, de hacsak nincs másképp meghatározva, a GRUB2-re fogok hivatkozni.
A GRUB-ot úgy tervezték, hogy kompatibilis legyen a multiboot specifikációval, ami lehetővé teszi, hogy a GRUB a Linux és más szabad operációs rendszerek számos verzióját elindítsa; a saját fejlesztésű operációs rendszerek bootrekordját is képes betölteni.
A GRUB azt is lehetővé teszi, hogy a felhasználó egy adott Linux-disztribúció esetében több különböző kernel közül választhasson a bootoláshoz. Ez lehetővé teszi, hogy egy korábbi kernelváltozatra bootoljon, ha egy frissített kernel valahogy meghibásodik, vagy nem kompatibilis egy fontos szoftverrel. A GRUB a /boot/grub/grub.conf fájl segítségével konfigurálható.
A GRUB1 ma már elavultnak számít, és a legtöbb modern disztribúcióban a GRUB2-vel váltották fel, amely a GRUB1 újraírása. A Red Hat alapú disztribúciók a Fedora 15 és a CentOS/RHEL 7 körül frissítettek a GRUB2-re. A GRUB2 ugyanazt a bootolási funkcionalitást biztosítja, mint a GRUB1, de a GRUB2 egy mainframe-szerű parancsalapú pre-OS környezet is, és nagyobb rugalmasságot tesz lehetővé a bootolás előtti fázisban. A GRUB2 konfigurálása a /boot/grub2/grub.cfg.
A GRUB elsődleges funkciója mindkét GRUB esetében a Linux kernel memóriába töltése és futtatása. A GRUB mindkét verziója lényegében ugyanúgy működik, és ugyanaz a három szakasza van, de a GRUB2-t fogom használni a GRUB munkájának ismertetéséhez. A GRUB vagy a GRUB2 konfigurálása és a GRUB2 parancsok használata nem tartozik ennek a cikknek a tárgykörébe.
Noha a GRUB2 hivatalosan nem használja a GRUB2 három szakaszának jelölését, kényelmes így hivatkozni rájuk, ezért ebben a cikkben így fogok hivatkozni.
1. szakasz
Amint azt a BIOS POST fejezetben említettük, a POST végén a BIOS a csatlakoztatott lemezeken keres egy rendszerindítási rekordot, amely általában a Master Boot Record (MBR) lemezen található, az elsőt, amit talál, betölti a memóriába, majd megkezdi a rendszerindítási rekord végrehajtását. A bootstrap kód, azaz a GRUB2 stage 1 nagyon kicsi, mert a partíciós táblával együtt el kell férnie a merevlemez első 512 bájtos szektorában. Egy klasszikus általános MBR-ben a tényleges bootstrap kód számára kijelölt teljes hely 446 bájt. Az 1. szakaszhoz tartozó 446 bájtos fájl neve boot.img, és nem tartalmazza a partíciós táblát, amely külön kerül a bootrekordhoz.
Mert a bootrekordnak ilyen kicsinek kell lennie, nem is túl okos, és nem érti a fájlrendszer struktúráit. Ezért az 1. szakasz egyetlen célja az 1.5. szakasz megtalálása és betöltése. Ehhez a GRUB 1.5-ös szakaszának a boot record és a meghajtó első partíciója közötti térben kell elhelyezkednie. Miután a GRUB 1.5. szakasza betöltődött a RAM-ba, az 1. szakasz átadja az irányítást az 1.5. szakasznak.
1.5. szakasz
Mint fentebb említettük, a GRUB 1.5. szakaszának magának a bootrekordnak és a lemez meghajtó első partíciója közötti területen kell elhelyezkednie. Ezt a helyet történelmileg technikai okokból nem használták fel. A merevlemez első partíciója a 63. szektorban kezdődik, és mivel az MBR a 0. szektorban van, így 62 512 bájtos szektor marad – 31 744 bájt -, amelyben a core.img fájl tárolható, amely a GRUB 1.5. fázisa. A core.img fájl mérete 25 389 bájt, így az MBR és az első lemezpartíció között bőséges hely áll rendelkezésre a tárolásához.
Az 1.5. fázisban elhelyezhető nagyobb mennyiségű kód miatt elegendő kódot tartalmazhat néhány gyakori fájlrendszer-illesztőprogramhoz, például a szabványos EXT és más Linux fájlrendszerekhez, a FAT-hoz és az NTFS-hez. A GRUB2 core.img sokkal összetettebb és alkalmasabb, mint a régebbi GRUB1 1.5-ös fázisú GRUB1. Ez azt jelenti, hogy a GRUB2 2. fázisa elhelyezhető egy szabványos EXT fájlrendszerben, de logikai kötetben nem. Így a stage 2 fájlok szabványos helye a /boot fájlrendszerben van, konkrétan a /boot/grub2.
Megjegyezzük, hogy a /boot könyvtárnak olyan fájlrendszeren kell lennie, amelyet a GRUB támogat. Nem minden fájlrendszer támogatja. Az 1.5. szakasz feladata a végrehajtás megkezdése a fájlrendszer-illesztőprogramokkal, amelyek szükségesek a 2. szakasz fájljainak a /boot fájlrendszerben való megkereséséhez és a szükséges illesztőprogramok betöltéséhez.
2. szakasz
A GRUB 2. szakaszának összes fájlja a /boot/grub2 könyvtárban és több alkönyvtárban található. A GRUB2 nem rendelkezik képfájllal, mint az 1. és 2. szakasz. Ehelyett többnyire futásidejű kernelmodulokból áll, amelyeket szükség szerint a /boot/grub2/i386-pc könyvtárból tölt be.
A GRUB2 2. fázisának feladata a Linux kernel megkeresése és betöltése a RAM-ba, valamint a számítógép irányításának átadása a kernelnek. A kernel és a hozzá tartozó fájlok a /boot könyvtárban találhatók. A kernelfájlok azonosíthatók, mivel mindegyikük neve vmlinuz kezdetű. A /boot könyvtár tartalmának listázásával megtekintheti a rendszerén jelenleg telepített rendszermagokat.
A GRUB2 a GRUB1-hez hasonlóan támogatja a Linux rendszermagok egyikéből történő indítást. A Red Hat csomagkezelője, a DNF támogatja a kernel több verziójának tárolását, így ha probléma merül fel a legújabb verzióval, a kernel egy régebbi verziója is elindítható. Alapértelmezés szerint a GRUB a telepített rendszermagok indítás előtti menüjét kínálja, beleértve egy mentési opciót és, ha konfigurálva van, egy helyreállítási opciót.
A GRUB2 második fázisa betölti a kiválasztott rendszermagot a memóriába, és átadja a számítógép irányítását a rendszermagnak.
Kernel
A helytakarékosság érdekében minden rendszermag önkicsomagoló, tömörített formátumban van. A kernelek a /boot könyvtárban találhatók, egy kezdeti RAM lemezképpel és a merevlemezek eszköztérképeivel együtt.
A kiválasztott kernel memóriába töltése és a végrehajtás megkezdése után először ki kell bontania magát a fájl tömörített változatából, mielőtt bármilyen hasznos munkát végezhetne. Miután a kernel kibontotta magát, betölti a systemd-t, amely a régi SysV init programot helyettesíti, és átadja neki az irányítást.
Ez a bootolási folyamat vége. Ezen a ponton a Linux kernel és a systemd fut, de a végfelhasználó számára semmilyen produktív feladatot nem tud végrehajtani, mert semmi más nem fut.
Az indítási folyamat
Az indítási folyamat a boot folyamatot követi, és a Linux számítógépet olyan üzemkész állapotba hozza, amelyben produktív munkára használható.
systemd
A systemd az összes folyamat anyja, és ő felelős azért, hogy a Linux hostot olyan állapotba hozza, amelyben produktív munkát lehet végezni. Néhány, a régi init programnál jóval kiterjedtebb funkciója a futó Linux host számos aspektusának kezelése, beleértve a fájlrendszerek mountolását, valamint a produktív Linux hosthoz szükséges rendszerszolgáltatások indítását és kezelését. A systemd minden olyan feladata, amely nem az indítási sorrenddel kapcsolatos, kívül esik e cikk keretein.
Először is a systemd mountolja az /etc/fstab által meghatározott fájlrendszereket, beleértve az esetleges swap fájlokat vagy partíciókat is. Ekkor hozzáférhet az /etc állományban található konfigurációs fájlokhoz, beleértve a sajátját is. Az /etc/systemd/system/default.target konfigurációs fájl segítségével határozza meg, hogy melyik állapotba vagy célba kell indítania a gépet. Az alapértelmezett.target fájl csak egy szimbolikus hivatkozás a valódi célfájlra. Egy asztali munkaállomás esetében ez általában a graphical.target lesz, ami a régi SystemV initben a runlevel 5-nek felel meg. Kiszolgáló esetén az alapértelmezett fájl inkább a multi-user.target lesz, ami a SystemV-ben a runlevel 3-nak felel meg. A emergency.target az egyfelhasználós módhoz hasonló.
Megjegyezzük, hogy a célok és a szolgáltatások systemd egységek.
A lenti 1. táblázat a systemd célok összehasonlítása a régi SystemV indítási futási szintekkel. A systemd target aliasokat a systemd biztosítja a visszafelé kompatibilitás érdekében. A cél aliasok lehetővé teszik a szkriptek – és sok rendszergazda, mint például én – számára, hogy a SystemV parancsokat, például az init 3 parancsot használják a futási szintek megváltoztatására. Of course, the SystemV commands are forwarded to systemd for interpretation and execution.
SystemV Runlevel | systemd target | systemd target aliases | Description |
halt.target | Halts the system without powering it down. | ||
0 | poweroff.target | runlevel0.target | Halts the system and turns the power off. |
S | emergency.target | Single user mode. No services are running; filesystems are not mounted. This is the most basic level of operation with only an emergency shell running on the main console for the user to interact with the system. | |
1 | rescue.target | runlevel1.target | A base system including mounting the filesystems with only the most basic services running and a rescue shell on the main console. |
2 | runlevel2.target | Multiuser, without NFS but all other non-GUI services running. | |
3 | multi-user.target | runlevel3.target | All services running but command line interface (CLI) only. |
4 | runlevel4.target | Unused. | |
5 | graphical.target | runlevel5.target | multi-user with a GUI. |
6 | reboot.target | runlevel6.target | Reboot |
default.target | This target is always aliased with a symbolic link to either multi-user.target or graphical.target. systemd always uses the default.target to start the system. Az default.target soha nem lehet alias a halt.target, poweroff.target vagy reboot.target. |
1. táblázat: A SystemV futási szintek összehasonlítása a systemd célokkal és néhány cél aliasával.
Minden célnak van egy sor, a konfigurációs fájlban leírt függősége. systemd elindítja a szükséges függőségeket. Ezek a függőségek azok a szolgáltatások, amelyek a Linux-állomás adott szintű működéséhez szükségesek. Amikor a cél konfigurációs fájlokban felsorolt összes függőség betöltődik és fut, a rendszer az adott célszinten fut.
A systemd megnézi a régi SystemV init könyvtárakat is, hogy létezik-e ott valamilyen indítófájl. Ha igen, a systemd ezeket konfigurációs fájlokként használja a fájlok által leírt szolgáltatások indításához. Az elavult hálózati szolgáltatás jó példa azokra, amelyek a Fedorában még mindig SystemV indítófájlokat használnak.
A lenti 1. ábrát közvetlenül a bootup man oldalról másoltuk. Ez mutatja az események általános sorrendjét a systemd indítása során, valamint a sikeres indításhoz szükséges alapvető sorrendi követelményeket.
A sysinit.target és basic.target célok az indítási folyamat ellenőrző pontjainak tekinthetők. Bár a systemd egyik tervezési célja, hogy a rendszerszolgáltatásokat párhuzamosan indítsa el, mégis vannak olyan szolgáltatások és funkcionális célok, amelyeket el kell indítani, mielőtt más szolgáltatások és célok elindulnának. Ezek az ellenőrző pontok nem léphetők át, amíg az adott ellenőrző pont által megkövetelt összes szolgáltatás és célpont nem teljesül.
A sysinit.target tehát akkor érhető el, amikor az összes olyan egység, amelytől függ, befejeződött. Az összes ilyen egységet, a fájlrendszerek mountolását, a swap fájlok beállítását, az udev indítását, a véletlengenerátor magjának beállítását, az alacsony szintű szolgáltatások elindítását és a kriptográfiai szolgáltatások beállítását, ha egy vagy több fájlrendszer titkosítva van, el kell végezni, de a sysinit.target-en belül ezek a feladatok párhuzamosan is elvégezhetők.
A sysinit.target elindítja az összes olyan alacsony szintű szolgáltatást és egységet, amelyek szükségesek ahhoz, hogy a rendszer marginálisan működőképes legyen, és amelyek szükségesek ahhoz, hogy a basic.targetre léphessünk.
local-fs-pre.target
|
v
(various mounts and (various swap (various cryptsetup
fsck services...) devices...) devices...) (various low-level (various low-level
| | | services: udevd, API VFS mounts:
v v v tmpfiles, random mqueue, configfs,
local-fs.target swap.target cryptsetup.target seed, sysctl, ...) debugfs, ...)
| | | | |
\__________________|_________________ | ___________________|____________________/
\|/
v
sysinit.target
|
____________________________________/|\________________________________________
/ | | | \
| | | | |
v v | v v
(various (various | (various rescue.service
timers...) paths...) | sockets...) |
| | | | v
v v | v rescue.target
timers.target paths.target | sockets.target
| | | |
v \_________________ | ___________________/
\|/
v
basic.target
|
____________________________________/| emergency.service
/ | | |
| | | v
v v v emergency.target
display- (various system (various system
manager.service services services)
| required for |
| graphical UIs) v
| | multi-user.target
| | |
\_________________ | _________________/
\|/
v
graphical.target
1. ábra: A systemd indítási térkép.
A sysinit.target teljesítése után a systemd ezután elindítja a basic.targetet, elindítva az összes egységet, amely szükséges a teljesítéshez. Az basic target néhány további funkciót biztosít azáltal, hogy olyan egységeket indít el, amelyek a következő targethez szükségesek. Ezek közé tartozik például a különböző futtatható könyvtárakhoz vezető útvonalak, kommunikációs aljzatok és időzítők beállítása.
Végül a felhasználói szintű célokat, a multi-user.target-et vagy a graphical.target-et lehet inicializálni. Vegyük észre, hogy a multi-user.target-et el kell érni, mielőtt a grafikus célfüggőségek teljesülnének.
Az 1. ábrán aláhúzott célok a szokásos indítási célok. Ha ezen célok valamelyikét elérjük, akkor az indítás befejeződött. Ha a multi-user.target az alapértelmezett, akkor a konzolon egy szöveges módú bejelentkezést kell látnia. Ha a graphical.target az alapértelmezett, akkor grafikus bejelentkezést kell látnia; a konkrét GUI bejelentkezési képernyő, amelyet lát, az Ön által használt alapértelmezett kijelzőkezelőtől függ.
Kérdések
A közelmúltban volt egy olyan Linux számítógépen, amely a GRUB2-t használta, szükségem az alapértelmezett boot kernel módosítására. Azt tapasztaltam, hogy néhány parancs nem működött megfelelően számomra, vagy nem megfelelően használtam őket. Még nem vagyok biztos benne, hogy melyik volt a helyzet, és további kutatást kell végeznem.
A grub2-set-default parancs nem állította be megfelelően az /etc/default/grub fájlban az alapértelmezett kernel indexét számomra, így a kívánt alternatív kernel nem indult el. Ezért kézzel módosítottam az /etc/default/grub GRUB_DEFAULT=saved fájlt GRUB_DEFAULT=2-re, ahol a 2 a telepített kernel indexe, amit indítani akartam. Ezután lefuttattam a grub2-mkconfig > /boot/grub2/grub.cfg parancsot az új grub konfigurációs fájl létrehozásához. Ez a megkerülés a várakozásoknak megfelelően működött és elindult az alternatív rendszermag.
Következtetések
A grub2 és a systemd init rendszer a legtöbb modern Linux disztribúció boot és indítási fázisának kulcsfontosságú elemei. Annak ellenére, hogy különösen a systemd körül voltak viták, ez a két komponens zökkenőmentesen működik együtt, hogy először betöltse a rendszermagot, majd elindítsa az összes olyan rendszerszolgáltatást, amely egy működőképes Linux rendszer létrehozásához szükséges.
Noha szerintem mind a GRUB2, mind a systemd összetettebb, mint elődeik, ugyanolyan könnyen megtanulhatóak és kezelhetőek. A man oldalak rengeteg információt tartalmaznak a systemd-ről, a freedesktop.org pedig a systemd teljes man oldalait online elérhetővé teszi. További linkekért tekintse meg az alábbi forrásokat.