Csak a "System V" stílusú "init"-ről beszélek, amit a Linux rendszerek a leginkább használnak.
Vannak más megoldások is. Valójában bármilyen programot berakhatsz az /sbin/init
-be, amit a
kernel le fog futtatni, amint betöltődött.
Az "init
" feladata, hogy minden úgy működjön ahogy kell. Leellenőrzi a fájlrendszereket és
felcsatolja őket. Lefuttatja a "démonokat", hogy naplózzák a rendszerüzeneteket, hálózatkezelést
csináljanak,
kiszolgáljanak web oldalakat, figyeljenek az egeredre stb. Szintén ez indítja a getty folyamatokat, amik
kirakják a bejelentkező (login) promptot a virtuális terminálodra.
Van egy nagyon komplikált történet a "futási szintek" (run-levels) közötti kapcsolásról, de a legnagyobb részét kihagyom, és csak a rendszer indulásáról beszélek.
Az" init" beolvassa az /etc/inittab
fájlt, ez írja le mit csináljon. Általában először
lefuttat egy inicializáló szkriptet. A program, ami végrehajtja (soronként) ezt a szkriptet, a
bash, ugyanaz a program ami kiírja a parancssorodat. Debian rendszereken az inicializáló szkript
az /etc/init.d/rcS
, Red Hat-en a /etc/rc.d/rc.sysinit
. Ez az, ami a
fájlrendszereket leellenőrzi és
felcsatolja, beállítja az órát és a csere (swap) területet, beállítja a gép hálózati nevét
(hostname) stb.
Ezután egy másik szkript indul el, ami elvisz az alapértelmezett futási szintre. Ez csak
annyit jelent, hogy elindul néhány alrendszer. Van egy pár könyvtár, az /etc/rc.d/rc0.d,
/etc/rc.d/rc1.d, ..., /etc/rc.d/rc6.d
Red Hat alatt, vagy az /etc/rc0.d , /etc/rc1.d, ...,
/etc/rc6.d
Debian alatt, ami a futási szintekhez tartozik. Ha a 3-as futási szinten vagyunk
Debianban, akkor a szkript lefuttatja az összes "S"-el (start rövidítése) kezdődő szkriptet az
/etc/rc3.d
-ben. Ezek a szkriptek valójában csak linkek más szkriptekhez egy másik
könyvtárban, amit általában "init.d
"-nek hívnak.
Tehát az "init
" meghívja a futási szint (run-level) szkriptünket, és más "S"-el kezdődő
szkripteket keres egy könyvtárban. Megtalálhatja elsőként az S10syslog
-ot. A számok
megmondják
a (run-level) szkriptnek, milyen sorrendben futtassa le őket. Ebben az esetben az S10syslog
hajtódik
végre először, mivel nincs S00 ... S09 kezdetű szkript. De az S10syslog
valójában csak egy
link az
/etc/init.d/syslog
-hoz, ami egy rendszernaplózást (system logger) elindító és leállító
szkript. Mivel a link "S"-el kezdődik, a (run-level) szkript tudja, hogy végre kell hajtania a
syslog
-ot egy "start" paraméterrel. Vannak ennek megfelelő, "K"-val (kill - megölni)
kezdődő linkek,
amik meghatározzák, mi és milyen sorendben legyen leállítva, amikor elhagyjuk a futási szintet.
Ha meg akarod változtatni az alrendszerek alapértelmezett indítását, létre kell
hoznod ezeket a linkeket az rcN.d
könyvtárban, ahol N az alapértelmezett futási szint az
inittab
fájlodban.
Az utolsó fontos dolog, amit az "init" csinál, hogy elindít pár getty
-t. Ezek "respawned"
állapotúak, ami azt jelenti, hogy ha leállnak, akkor az "init
" egyszerűen újraindítja
őket. A legtöbb disztribució hat virtuális terminált indít. Lehet, hogy kevesebbet akarsz a
memóspórolás érdekében, vagy többet, amivel egy csomó dolgot hagyhatsz futni és gyorsan
váltogathatsz köztük ha szükséged
van rájuk. Lehet, hogy akarsz majd futtatni egy getty
-t szöveges terminálnak vagy modemes
betárcsázáshoz. Ebben az estben át kell szerkesztened az inittab
fájlodat.
A /etc/inittab
az "init" legfelső szintű konfigurációs fájlja.
Az rcN.d
könyvtárak, ahol N = 0, 1, ..., 6, határozzák meg, milyen alrendszerek
indulnak el.
Valahol az "init" által elindított szkriptekben, a mount -a
parancs kerül végrehajtásra. Ez
annyit jelent, hogy felcsatolódik az összes fájlrendszer, aminek fel kell csatolódnia. Ez az
/etc/fstab
fájlban van leírva. Ha meg akarod változtatni, hogy hova és mi
csatolódjon, amikor a rendszered elindul, ezt a fájlt kell átszerkesztened. Az fstab
fájlnak van egy kézikönyv (man) oldala is.
Keresd meg alapértelmezett futási szintedhez tartozó rcN.d
könyvtáradat és adj ki egy
ls -l
parancsot, hogy lásd milyen fájlokhoz kapcsolódnak a linkek.
Változtasd meg a rendszereden futó getty-k számát.
Törölj minden alrendszert, amire nincs szükséged, az alapértelmezett futási szinten.
Nézd meg, milyen közel jutottál a kezdéshez.
Telepíts egy floppy-ra lilo-t, kernelt és egy statikusan linkelt "hello world" programot, amit
nevezz el /sbin/init
-nek, és figyeld ahogy bebootol és kiírja: hello.
Nézd figyelmesen a rendszered indulását és jegyzetelj, milyen üzeneteket ír ki arról ami
történik. Esetleg nyomtass ki egy részt a rendszernaplóból (/var/log/messages
). Ezután az
inittab
-bal kezdve, fusd át az összes szkriptet és figyeld meg, melyik kódrészlet mit
csinál.
Berakhatsz extra start üzeneteket is, mint például:
echo "Hello, en vagyok a rc.sysinit"
Ez jó gyakorlat arra is, hogy megtanuld a Bash shell alatti szkriptírást. A szkriptek közül néhány eléggé komplikált. Legyen kéznél egy jó Bash referenciakönyv.
inittab
és fstab
fájlokhoz.
Megnézheted a "man inittab
" begépelésével.