A Linux rendszerindítási folyamata a Linux alapú operációs rendszerek előkészítésének lépései . Ez a folyamat sok tekintetben hasonlít a BSD és más Unix -szerű rendszerek indításához, amelyekből származik.
Amikor a számítógép elindul, a vezérlés soros átvitele történik a számítógép rendszer firmware-je ( BIOS vagy UEFI ) között a rendszertöltőre , majd onnan a kernelre . A kernel ezután elindítja az ütemezőt (többfeladatos munkavégzéshez), és végrehajtja az init programot (amely beállítja a felhasználói környezetet, és lehetővé teszi a felhasználói interakciót és bejelentkezést), ami után a kernel tétlen marad, amíg külső hívást nem kap.
A letöltés fő lépései:
Amikor leállás történik, az init meghívásra kerül, hogy a felhasználói szintű programokat ellenőrzött módon, szintén parancsfájlok szerint leállítsa. Ezt követően az init bezárul, és a kernel végrehajtja a saját leállását.
BIOS-on keresztüli indításkor: A rendszerbetöltő fázisai platformonként eltérőek. Mivel a korai indítási lépések függetlenek az operációs rendszertől, a rendszerindítási folyamat általában a következőképpen kezdődik:
Mostantól a letöltés folytatódik. Az első fázis betölti a betöltő kód többi részét, amely általában megkérdezi, hogy a felhasználó milyen operációs rendszert (vagy munkamenet-típust) szeretne futtatni. A rendszerbetöltő kód egy konfigurációs fájlból jön létre, /etc/lilo.conf (для LILO)amely meghatározza az elérhető rendszereket. Ez a fájl különösen a rendszerindító partícióról és a kernel helyéről tartalmaz információkat, valamint további rendszerindítási lehetőségeket, ha vannak ilyenek. A választás eredményeként a megfelelő kernel betöltődik a RAM -ba, a képfájlból ( initrd ) beállítjuk a minimális kezdeti fájlrendszert , majd a megfelelő paraméterekkel együtt az irányítás átkerül az új operációs rendszerre.
A LILO és a GRUB bizonyos különbségeket mutat: [1]
UEFI- n keresztüli indításkor: UEFI-ben a rendszerbetöltő azonnal védett módban indul (32 bites vagy 64 bites), és valójában a rendszertöltő minden fázisa egyszerre töltődik be (figyelembe véve a szervizpartícióról történő rendszerindítást, nincs szükség hogy a rendszerbetöltő külön fázisokra ossza fel és helyezze el azokat különböző helyekre). Ellenkező esetben a kernel betöltésének és inicializálásának folyamata nem tér el a BIOS verziójától.
BIOS:
A GRUB támogatja mind a közvetlen, mind a láncindítást, valamint az LBA-t, az ext2-t és "igazi parancsorientált, művelet előtti környezetet az x86-os gépeken". Három felülettel rendelkezik: kiválasztó menü, beállításszerkesztő és parancskonzol. [négy]
UEFI:
A LILO régebbi, mint a GRUB, és működésében szinte azonos, kivéve, hogy nem tartalmaz parancssori felületet. Ezért minden változtatást el kell végezni a beállításain, és be kell írni az MBR-be, ami után a rendszer újraindul. Így egy hibás konfiguráció a lemezt bootolhatatlanná teheti külön rendszerindító eszköz ( hajlékonylemez stb.) használata nélkül, amely a hibát javító programot tartalmaz. [3] Ezenkívül a LILO nem ismeri fel a fájlrendszereket; ehelyett a képfájlok címei közvetlenül az MBR-ben vannak tárolva, [3] és a BIOS segítségével közvetlenül hozzáférnek hozzájuk.
A Linux indításának másik módja a DOS vagy a Windows 9x , ahol a Linux kernel teljesen lecseréli az operációs rendszer futó példányát. Ez akkor lehet hasznos, ha a hardvert a szoftverben kell tartalmaznia, és a megfelelő programok csak DOS-hoz léteznek, Linuxhoz nem, mivel a gyártó saját szoftvere és üzleti titok. Ez a rendszerindítási módszer nem különösebben releváns, mivel a Linux számos hardvereszközhöz rendelkezik illesztőprogramokkal, bár a múltban meglehetősen hasznos volt.
Egy másik példa, amikor a Linux olyan tárolóeszközön van, amelyet nem a BIOS-ból való rendszerindításra terveztek: a DOS vagy a Windows betöltheti a megfelelő illesztőprogramokat, hogy megkerülje ezt a BIOS-korlátozást, majd onnan indítsa el a Linuxot.
A Linux kernel olyan fő funkciókat kezel, mint a memóriakezelés , a feladatkezelő , az I/O , a folyamatok közötti kommunikáció és az általános rendszerfelügyelet. A letöltés két lépésben történik: először a kernelt (tömörített képfájl formájában) betöltjük a RAM-ba és kicsomagoljuk, majd olyan alapvető funkciókat konfigurálunk, mint az alapvető memóriakezelés. A vezérlés ezután utoljára átkerül a fő kernel indítási folyamatába. Miután a kernel teljesen működőképes (azaz betöltötte és végrehajtotta a kódját), megkeresi és elindítja az init folyamatot, amely önállóan beállítja a felhasználói környezet működéséhez és a rendszerbe való esetleges bejelentkezéshez szükséges felhasználói teret és folyamatokat. Maga a kernel készenléti módba kerül, és készen áll a többi folyamat hívására.
A kernel rendszerint képfájlként indul el, a zlib segítségével zImage vagy bzImage formátumba tömörítve . Tartalmaz egy fő programot, amely minimális hardverbeállítást hajt végre, kicsomagolja a teljes képet a nagy memóriába , és csatlakoztatja a RAM-lemezt , ha van. [5] Ezt követően végrehajtja a kernel indítását és folyamatot (x86 család processzorok esetén). ./arch/x86/boot/headstartup_32()
A kernel indítási funkciója (más néven swapper vagy process 0 ) megszervezi a memóriakezelést ( laptáblázatok és memórialapozás), meghatározza a processzor típusát és a további szolgáltatásokat (például matematikai társprocesszor jelenlétét ), majd átvált az architektúrától független funkciókra. a Linux kernelhez a start_kernel().
start_kernel()számos inicializálási feladatot végez. Beállítja a megszakításkezelőket ( IRQ ), majd beállítja a memóriát, elindítja az init folyamatot (az első felhasználói módú folyamatot), majd elindítja az üresjárati feladatot a hívással cpu_idle(). Vegye figyelembe, hogy a kernel indítási folyamata a kezdeti RAM-lemezt ("initrd") is felcsatolja, amelyet korábban ideiglenes gyökérfájlrendszerként töltöttek be a rendszerindítási fázis során. Ez lehetővé teszi az illesztőprogram-modulok betöltését anélkül, hogy más fizikai eszközökre és illesztőprogramokra támaszkodna, és a kernel mérete kicsi marad. A gyökér fájlrendszert ezt követően egy hívás váltja fel, pivot_root()amely leválasztja az ideiglenes fájlrendszert, és lecseréli a valódi gyökér fájlrendszerre, amint az elérhetővé válik. Ezután az ideiglenes rendszer által használt memória felszabadul.
Így a kernel inicializálja az eszközöket, csak olvasható módban felcsatolja a rendszerbetöltő által megadott fájlrendszert, és elindítja az init ( /sbin/init) folyamatot, amelyet a rendszer által elsőként elindított folyamatként jelölünk meg (folyamatazonosító PID = 1). [1] A megfelelő üzeneteket a kernel (a fájlrendszer csatlakoztatásakor) és az init (az azonos nevű folyamat indításakor) jeleníti meg. A kernel egy initrd -t is futtathat a beállítások kezelésére és az eszközök inicializálására a gyökér fájlrendszer csatlakoztatása előtt. [egy]
A Red Hat szerint a rendszerindítási folyamat részletei ebben a szakaszban a következőkben foglalhatók össze: [2]
Amikor a kernel elindul, azonnal inicializálja és konfigurálja a számítógép memóriáját, valamint beállítja a rendszerhez kapcsolódó különféle hardvereket, beleértve az összes processzort, I/O alrendszert és tárolóeszközt. Ezután megkeresi a tömörített initrd képet egy előre meghatározott helyen a memóriában, kicsomagolja, felcsatolja, és betölti a szükséges illesztőprogramokat. Ezután inicializálja a fájlrendszerhez társított virtuális eszközöket, például LVM -et vagy szoftveres RAID -tömböket, mielőtt leválasztja az initrd lemezképet , és visszafoglalja a lemezkép által korábban elfoglalt memóriát. A kernel ezután létrehoz egy gyökéreszközt, felcsatolja a csak olvasható gyökérpartíciót, és felszabadítja a nem használt memóriát. Ekkorra a kernel betöltődik a memóriába, és működőképes. Mivel azonban nincsenek olyan felhasználói programok, amelyek érdemi inputot adnának a rendszerhez, keveset lehet tenni vele.
Most, hogy a megszakítások engedélyezve vannak, a diszpécser átveheti a rendszer általános irányítását, hogy lehetővé tegye a megelőző többfeladatos munkát, és az init folyamat hátra van a felhasználói környezet betöltésére a felhasználói térben.
Az Init minden folyamat szülője. Fő feladata a szkriptelt folyamatok létrehozása egy /etc/inittab. Ez a fájl általában olyan bejegyzéseket tartalmaz, amelyek arra utasítják az init -et, hogy minden egyes sorhoz, amelybe a felhasználók bejelentkezhetnek, generálja a getty -t. Ezenkívül vezérli a bármely rendszer által igényelt offline folyamatokat. A futási szint egy rendszer programozott konfigurációja, amely csak a folyamatok adott csoportjának létezését teszi lehetővé. Az egyes futási szinteken az init által generált folyamatokat a . [6]/etc/inittab
Lényegében az init megszervezi és karbantartja az összes felhasználói területet , amely magában foglalja a fájlrendszerek ellenőrzését és csatlakoztatását, a szükséges felhasználói szolgáltatások elindítását és a felhasználói területre való váltást, amikor a rendszer elindult. Hasonló a Unix és a BSD indítófolyamatokhoz , amelyekből származik, de néhány esetben megváltoztatták vagy újratervezték. Egy tipikus Linux rendszeren az init rendelkezik egy futási szint néven ismert paraméterrel , amely 1 és 6 közötti értékeket vesz fel, és meghatározza, hogy mely alrendszereket engedélyezze. Minden futási szintnek saját szkriptjei vannak, amelyek szabályozzák az adott futási szint beállításával vagy eltávolításával kapcsolatos különféle folyamatokat, és ezeket a szkripteket tartják szükségesnek a rendszerindítási folyamathoz. Az Init szkriptek általában könyvtárakban vannak tárolva olyan néven, mint /etc/rc…. Az init fő szintű konfigurációs fájlja /etc/inittab. [7]
A rendszerindítás során ellenőrzi, hogy az alapértelmezett szint le van-e írva a -ban /etc/inittab, és ha nem, akkor a rendszerkonzolon keresztül kéri le. Ezután végrehajtja az adott szinthez tartozó összes rendszerindító szkriptet, beleértve a modulok betöltését, a fájlrendszer integritásának ellenőrzését (amely csak olvasható módon volt csatlakoztatva), újracsatlakoztatja írási-olvasási módot, és beállítja a hálózatot. [egy]
A Red Hat szerint az init folyamat a következő mintát követi: [2]
Miután az összes adott folyamatot elindította, az init alvó módba lép, és megvárja a három esemény egyikét:
Ez a UNIX System V stílusú indítóprogramra vonatkozik . Más indítóprogramok eltérően viselkedhetnek.