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.
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 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.
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
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
Kapcsolódó:
Élet systemd nélkül: