Linux rendszerindítási folyamat

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.

A folyamat általános áttekintése

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:

  1. A számítógép rendszer firmware-je elvégzi a hardver kezdeti ellenőrzését és inicializálását .
  2. A BIOS esetében a firmware betöltődik a RAM-ba, és végrehajtja a rendszerindító kódot a megadott rendszerindító eszköz egyik partíciójáról , amely tartalmazza a Linux rendszerbetöltő 1. fázisát . Az 1. fázis a 2. fázist tölti be (jelentős betöltő kód). Egyes rendszerbetöltők használhatnak egy köztes szakaszt (úgynevezett fázis 1.5 ) ehhez, mivel a modern nagy kapacitású lemezek nem feltétlenül olvasnak megfelelően további kód nélkül. UEFI esetén elindul a szervizpartícióról (EFS) betöltött bootloader, amely a számítógép nem felejtő memóriájában meghatározott rendszerindítási prioritási beállítások szerint kerül kiválasztásra. Ebben az esetben nem csak egy speciális rendszerbetöltő betöltésére van lehetőség, hanem közvetlenül is betölthetjük a Linux kernelt (ehhez a kernelt az EFI_STUB opcióval kell felépíteni).
  3. A rendszerbetöltő gyakran a rendelkezésre álló rendszerindítási lehetőségek menüjét mutatja be a felhasználónak. A kijelölés után vagy egy megadott időtúllépés után a rendszerbetöltő betölti a kernelt.
  4. A betöltött kernel kitömörít a memóriába, beállítja a rendszerfunkciókat, mint például a szükséges hardver üzemeltetését és a memórialapok kezelését, majd hívja a következőt start_kernel().
  5. Ezt követően start_kernel()elvégzi az alapvető rendszerkonfigurációt (megszakítások, egyéb memóriakezelési funkciók, eszközök, illesztőprogramok inicializálása stb.), majd létrehoz egy üresjárati folyamatot , egy diszpécsert , és ezektől elkülönítve egy init folyamatot (amely a felhasználói térben fut). ).
  6. Az ütemező elkezdi hatékonyabban kezelni a rendszert, miközben a kernel tétlen.
  7. Az init folyamat végrehajtja a szükséges szkripteket, amelyek beállítják az összes nem kernel szolgáltatást és struktúrát, amelyek felhasználói környezetet hoznak létre, és bejelentkezési képernyőt jelenítenek meg a felhasználó számára.

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.

Betöltő fázis

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.

GRUB

BIOS:

  1. Az 1. fázisú rendszerbetöltőt a BIOS olvassa be az MBR-ből (Master Boot Record). [négy]
  2. Betölti a bootloader többi részét (2. fázis). Ha a második fázis egy nagy lemezen van, néha betöltődik egy köztes fázis 1.5, amely egy további kódot tartalmaz, amely lehetővé teszi az 1024-nél nagyobb számmal rendelkező hengerek ( LBA lemezek ) kiolvasását. Az 1.5 fázisú betöltő (ha szükséges) az MBR-ben vagy a rendszerindító partícióban van tárolva. [négy]
  3. A rendszerbetöltő második fázisa lefut, és megjeleníti a GRUB indítási menüjét. Ezenkívül lehetővé teszi a futási környezet kiválasztását és a rendszerbeállítások megtekintését.
  4. Az operációs rendszer kiválasztásakor az betöltődik, és a vezérlés átkerül rá. [négy]

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:

  1. Az EFS szolgáltatási partícióból betöltött GRUB (az UEFI-t indítani képes bináris fájl speciális verziója) tartalmazza az összes szükséges összetevőt a /boot fájlrendszer eléréséhez, ahol a konfigurációs és a további rendszerbetöltő fájlok találhatók.
  2. Megjeleníti a rendszerbetöltő menüt és a GRUB indítási menüjét. Ezenkívül lehetővé teszi a futási környezet kiválasztását és a rendszerbeállítások megtekintését.
  3. Az operációs rendszer kiválasztásakor az betöltődik, és a vezérlés átkerül rá. [négy]

LILO

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.

Loadlin

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.

Alapfázis

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.

Kernel rendszerindítási szakasza

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()

Kernel indítási szakasza

Forrás: az IBM leírása a Linux rendszerindítási folyamatáról   (angol) + lefordított verzió ugyanarról az oldalról A Linux rendszerindítási folyamatának részletei  (orosz)

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.

init process (csak UNIX System V típusnál)

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]

  1. Megnéz egy szkriptet sysinit, amely "beállítja a környezet elérési útját, elindítja swapa fájlrendszert, ellenőrzi a fájlrendszereket, és mindent megtesz a rendszer inicializálásához. Ezek különösen a rendszer és a hardver órajelei, a soros port speciális folyamatai , stb.
  2. Az Init ezután megvizsgálja az adott futási szinthez megadott konfigurációt .
  3. Ezt követően az init telepíti a rendszer kezdeti függvénykönyvtárát. Ez határozza meg, hogyan kell elindítani vagy leállítani a programot, és hogyan kell meghatározni a PID-jét.
  4. Ezután elindítja az összes biztosított folyamatot, és létrehoz egy felhasználói bejelentkezési munkamenetet.

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:

  1. A kialakult folyamatok normális vagy rendellenes leállása.
  2. Áramszünet jelzés.
  3. A futási szint/sbin/telinit módosításához kérje a címet . [6]

Ez a UNIX System V stílusú indítóprogramra vonatkozik . Más indítóprogramok eltérően viselkedhetnek.

Lásd még

Jegyzetek

  1. 1 2 3 4 5 Linux rendszerindítási folyamat – Kim Oldfield (2001) . Letöltve: 2008. december 10. Az eredetiből archiválva : 2008. december 18..
  2. 1 2 3 A rendszerindítási folyamat részletes áttekintése . Letöltve: 2008. december 10. Az eredetiből archiválva : 2009. február 3..
  3. 123 Dokumentáció _ _ _ Letöltve: 2008. december 10. Az eredetiből archiválva : 2010. május 5..
  4. 1 2 3 4 5 A GRUB leírása a Red Hattől  (angol) (HTML). Letöltve: 2010. augusztus 8. Az eredetiből archiválva : 2009. március 7..
  5. A Linux rendszerindítási folyamatának IBM leírása . Letöltve: 2008. december 10. Az eredetiből archiválva : 2008. május 31..
  6. 1 2 Az init folyamat kézikönyvoldala . Letöltve: 2008. december 10. Az eredetiből archiválva : 2008. június 12.
  7. Bekapcsolástól Bash promptig: Init . Letöltve: 2010. november 26. Az eredetiből archiválva : 2011. március 10.

Linkek