Tartalomjegyzék

< Linux

Boot

Bevezetés

A hibaelhárításhoz fontos ismerni a rendszerindítási folyamatot. Az alábbi leírásban megnézzük pontról-pontra mi történik a rendszer indulásakor. A leírás egy része a https://wiki.debian.org/systemd oldal egy részének a fordítása.

Boot folyamatok

A következő felsorolásban, megtekinthetjük milyen rendszerek vesznek részt a rendszer elindulásában, sorrendben:

A gép bekapcsolása után a memória üres, a processzor alapállapotba kerül. A végrehajtást a gép BIOS-a számára adja át, amelynek címe:

0xFFFF FFF0

A BIOS a hardver tesztelése és előkészítése után, betölti az indítható eszköz fő betöltőszektorát, az MBR-t. Az MBR átadja a vezérlést az indítani kívánt eszköz betöltő szektorára (boot szektor). A betöltő szektor elindítja a kernelt, ha kell paraméterezve.

A kernel betöltése után szükségünk van egy rendszerpartícióra. Ha fájlrendszer meghajtója modulként van fordítva, akkor ez a rendszerpartíció közvetlenül nem csatolható. A megoldás egy initrd nevű képfájl és a linuxrc script vagy bináris használata jelenti. Ezek segítségével felcsatolható a valódi rendszerpartíció, ahol elindul a systemd. A Debian 9 rendszeren ez valójában még mindig egy init folyamat, de már a systemd része. A CentOS 7-en már konkrétan a systemd nevű démon indul.

A systemd a beállításoknak megfelelően elindítja a rendszer szolgáltatásait.

A rendszer a SysVinit korában úgynevezett futási szinteket tartalmazott. Minden futási szinten más-más szolgáltatás, indult, állt le. A Systemd rendszerben a számokat nevek váltják le, amelyeket nem szinteknek, hanem céloknak (target) nevezünk.

A systemd

A systemd a linuxos rendszer és szolgáltatásainak menedzsere. A DebianJessie változata óta a Debian rendszerekben alapértelmezés a SysV után. A systemd kompatibilis a SysV-al és az LSB init scriptekkel.

A systemd tulajdonságai:

Az induló rendszeren a systemd kapja a 1-es PID-et. A Debian ps ax kimenete megtéveszthet minket, mert létezik a /sbin/init, ami valójában egy szimbolikus link a /lib/sysmtemd/systemd állományra.

A systemd feladatai unitokba vannak szervezve. A legáltalánosabb unitok a szolgáltatás (.service), csatolási pont (.mount), eszközök (.device), socketek (.socket) vagy az időzítők (.timer). A példa kedvééért a a secure shell démon unitja ssh.service.

Minden unit egy önálló konfigurációs fájlban van definiálva. A unit fájlok kiterjesztése mutatja annak típusát. A unitok a /lib/systemd/system könyvtárban találhatók. Ha egy azonos nevű fájl létezik a /etc/systemd/system könyvtárban, akkor a systemd figyelmen kívül hagyja a /lib/systemd/system könyvtárban lévőt. A rendszergazda a /etc/systemd/system könyvtárban elhelyezett fájlokkal szabja testre a rendszert. Egyes unitokat a systemd úgy állít elő, hogy a fájlrendszerben nem tartozik hozzá állomány.

A systemd minden szolgáltatást egy erre a célra kijelölt vezérlőcsoportba (cgroup) helyez. A modern kernelek támogatják az erőforrások csoportok alapján történő elosztását.

Függelék

A SysVinit futási szintjei

Nyolcféle futási szinttel van dolgunk.

0 A rendszer leállásakor végrehajtódó műveletek.
6 Újraindításkor végrehajtandó műveletek.
S A rendszer indulásának egy fázisában egyfelhasználós mód.
1 Alaprendszert indító egyfelhasználós mód
2 Általános több felhasználós mód (Debian GNU/Linuxon alapértelmezés).
3 Általános több felhasználós mód.
4 Általános több felhasználós mód.
5 Általános több felhasználós mód.

Az aktuális futási szint a következő paranccsal kérdezhető le:

runlevel

Az eredmény például:

N 2

Az eredményben az előző futási szint is megjelenik. Ha az előző „N”, akkor nem volt még más futási szint.

Minden futási szintnek van egy könyvtára, ahova scripteket linkelünk be szimbolikusan. Ezek a scriptek lefutnak az adott futási szintre lépéskor.

Az egyes futási szinteknek megfelelő könyvtárak Debian GNU/Linuxon:

/etc/rc0.d
/etc/rc1.d
/etc/rc2.d
/etc/rc3.d
/etc/rc4.d
/etc/rc5.d
/etc/rc6.d
/etc/rcS.d

Mint azt fentebb említettük ide nem szokás állományokat másolni, ide csak linkelünk. Az egyes szolgáltatások scriptjei a következő könyvtárban szokás elhelyezni:

/etc/init.d/

Ebből a könyvtárból linkelünk az egyes futási szintekre.

Ha belenézünk rc0.d, stb, könyvtárba, azt látjuk, hogy minden link egy S vagy K betűvel kezdődik, majd egy kétjegyű szám követi. Az S karaktert akkor használjuk, ha azt szeretnék, hogy az adott futási szintre lépre az adott szolgáltatás elinduljon. A K betűt pedig akkor használjuk, ha leakarjuk állítani a szolgáltatást. A számok prioritást határoznak meg. Amely linknek kisebb a száma, az a szolgáltatás előbb indul.

Minden többfelhasználós futási szint végén a következő script lefut:

/etc/rc.local

Scriptek, démonok indítása, leállítása

Ha szeretnénk egy scriptet induláskor lefuttatni, akkor két lehetőségünk van. A legegyszerűbb ha /etc/rc.local fájlban felveszem, útvonalastul, mindenestül, mivel ez minden többfelhasználós futási szinten (2, 3, 4, 5) lefut.

A másik lehetőség, hogy beteszem egy futás szintre. Másoljuk a scriptet a következő könyvtárba:

/etc/init.d

Állítsuk be például a sajat.sh nevű scriptet, amelynek útvonala a következő:

/root/bin/sajat.sh
cp /root/bin/sajat.sh
update-rc.d sajat.sh defaults

Most töröljük a futásiszintekről:

update-rc.d sajat.sh remove

Ha precízebbek szeretnénk lenni a scriptet a következő minta alapján készítsük el:

/etc/init.d/skeleton

Ezen fájl alapján készítsük el a script fejlécét a BEGIN INIT INFO és END INIT INFO közötti rész scriptünkbe másolásával, átírásával.

Olvasni valók:

man update-rc.d
man insserv

Linkek

Kapcsolódó:

Élet systemd nélkül: