- IT Blog – Linux & Windows - https://it.naxoblog.hu -

A rendszer elindulási folyamata

A számítógép bekapcsolásakor a BIOS öntesztje és a meghajtók detektálása után a boot-olási folyamat veszi kezdetét. Jelen esetben tegyük fel, hogy az elsődleges boot-olási eszköznek a merevlemez van megadva, vagy a merevlemez előtt megadott eszközökről nem indul el a gép. A BIOS megvizsgálja a háttértároló legelső blokkját (Master Boot Record – MBR). Az ott elhelyezkedő betöltő program vagy elindítja a megadott partíción lévő rendszert, vagy átadja egy másik partíció legelső blokkjában (Volume Boot Record – VBR) elhelyezett rendszerbetöltő programnak a vezérlést. GNU/Linux alatt elsősorban GRUB-ot vagy LILO-t használnak rendszerbetöltőnek.

A rendszerbetöltő mind az MBR-ből, mind az VBR-ből képes elindítani a rendszer. Ha csak egy GNU/Linux rendszer található el a merevlemezen, akkor is szükséges a rendszerbetöltő használata. Rendszer elindulásának a folyamata a kernel betöltődésével veszi kezdetét. (A kernel olyan a számítógép számára, mint az emberi test számára az agy.) A kernel betöltődése után inicializálja a hardver elemeket, betölti a szükséges eszközvezérlőket, majd elindítja az init programot. Az init a legelső folyamat, ami elindul. Feladata a fájlrendszer ellenőrzése, a démon programok (háttérben futó programok) elindítása és a bejelentkezések lehetővé tétele (getty futtatása).

Futási szintek

Az init egyéb remek tulajdonságai mellett, biztosítja a rendszergazdának a különböző futási szinteket. A futási szintek segítségével lehet befolyásolni, hogy a boot-olási folyamat során mely démonok (milyen szolgáltatások), programok induljanak el.

A hét futási szint

0: Rendszer lekapcsolására szolgáló futási szint. Minden folyamatot leállít, majd kikapcsolja a számítógépet (ha lehetséges).
1: Egyfelhasználós üzemmód, csak a rendszergazda léphet be, más néven szerviz üzemmód. Sajnos több terjesztés sem tartja fontosnak a rendszergazda jelszavának kérését e futási szint használatakor, a Debian bekéri.
2, 3, 4, 5: Alapesetben, a telepítés befejezése után, azonos programokat indítanak el. A rendszergazdára bízzák a különböző futási szintek létrehozását igény esetén.
6: Rendszer újraindítására szolgáló futási szint. Minden folyamatot leállít, majd újraindítja a számítógépet.

A 2-es az alap futási szint, de a boot-olási folyamat megkezdése előtt a rendszerbetöltőből is kiválasztható a kívánt futási szint.

Futási szint állítása GRUB-ból

GRUB telepítése esetén alapesetben mindegyik kernelhez két sor tartozik: a felső a normál indítású (2-es szint), az alatta levő a single-user mode/recovery mode. (A single-user/recovery üzemmód olyan, mint a Windows-ban a csökkentett üzemmód.)
Ha másik futási szintet szeretnénk használni, akkor lépjünk rá a normál indítású kernelre, szerkesszük az indítási paramétereit az “e” betű lenyomásával

Debian GNU/Linux, kernel 2.6.26-1-686 <-- 'e'
Debian GNU/Linux, kernel 2.6.26-1-686 (single-user mode)

Majd ez fogad minket, szerkesszük a kernel-lel kezdődő sort szintén az “e” betű lenyomásával:

root   (hd0,0)
kernel  /boot/vmlinuz-2.6.26-1-686 root=/dev/hda1 ro <-- 'e'
initrd  /boot/initrd.img-2.6.26-1-686

Ezzel megkapjuk a szerkesztési felületet:

...
grub edit> kernel  /boot/vmlinuz-2.6.26-1-686 root=/dev/hda1 ro

A “ro” után írjuk be a kívánt futási szint számát (például: 4) majd nyomjunk enter-t. Ezután visszakerülünk az előző állapotra:

root  (hd0,0)
kernel  /boot/vmlinuz-2.6.26-1-686 root=/dev/hda1 ro 4
initrd  /boot/initrd.img-2.6.26-1-686

Végül a “b” betű lenyomásával elindíthatjuk a már módosított kernel-paraméterekkel a GNU/Linux rendszerünket.

Ugyanez (K)ubuntu 8.04 alatt:

Ubuntu 8.04, kernel 2.6.24-23-generic <-- 'e'
Ubuntu 8.04, kernel 2.6.24-23-generic (recovery mode)

root   (hd0,0)
kernel   /vmlinuz-2.6.24-23-generic root=UUID...ddb ro quiet splash <-- 'e'
initrd   /initrd.img-2.6.24-23-generic

grub edit> kernel   /vmlinuz-2.6.24-23-generic root=... splash 4

Az előzőekhez hasonlóan írjuk a kernel-lel kezdődő sor végére a kívánt futás szint számát, majd enter, utána pedig a “b” betűvel a boot-olás elindítása.

Futási szint állítása LILO-ból

Habár a GRUB rugalmassága miatt nagyon sok helyről kiszorította már a LILO-t, de még lehet vele találkozni, ezért mi is foglalkozunk vele.

Alapesetben a rendszer indulása előtt csak egy “LILO” jelenik meg pár másodpercre. Ilyenkor az ESC, a CTRL vagy TAB gombokkal lehet előhozni a LILO prompt-ját (“lilo:“) vagy a táblázatos megjelenítés. Ha grafikus képpel fogad minket a LILO, akkor kisebb gond lehet, hogy “vakon” kell begépelni az alábbiakat.

lilo: <betöltendő kernel> <futási szint>
lilo: Linux-2.4.21 4

Szerviz üzemmód betöltése a következőképpen lehetséges (1-es vagy single vagylagos használata):

lilo: <betöltendő kernel> <1|single>
lilo: Linux-2.4.21 1
lilo: Linux-2.4.21 single

Futási szint állítása a működő rendszeren

Rendszer betöltődése után, a rendszer használata közben is lehet futási szintet váltani (de csak a rendszergazda teheti meg):

root@bash# init 4
root@bash#

Ezután megkezdődik a kívánt folyamatok leállítása és elindítása a /etc/rcX.d/ könyvtárak előírása szerint.

Előző és az aktuális futási szint megjelenítése – runlevel

Lekérdezhetjük az aktuális és az előző futási szintet a runlevel parancs segítségével:

root@bash# runlevel
N 2
root@bash#

Először jeleníti meg az előző, majd szóközzel elválasztva az aktuális futási szintet. Ha az előző állapotot jelző szám helyett egy „N” betű jelenik meg, akkor nem volt előző állapot a gép elindulása óta.

Az init finomhangolása

A /etc/inittab fájl tartalmazza az init-re vonatkozó beállításokat, amelyekkel szintén befolyásolhatók az egyes futási szintek.

Alap futási szint beállítása:

id:2:initdefault:

A szerviz szint kivételével, az összes többi futási szint esetén lefuttatásra kerülnek az alábbi könyvtárban elhelyezkedő script fájlok:

si::sysinit:/etc/init.d/rcS

Azaz a /etc/rcS könyvtárba tárolt fájlok mindenképpen lefutnak függetlenül attól, hogy melyik futási szinten indul el a gép.

Az alábbi sorral lehet root jelszót kérni a szerviz üzemmódra lépéskor:

~~:S:wait:/sbin/sulogin

Megadható, hogy az egyes futási szintek indulásakor milyen program/script induljon el és milyen paraméterekkel:

l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6

A megadott script az „/etc/rcX.d” könyvtárban elhelyezett programokat indítja el vagy állítja meg. A “K” betűvel kezdődőeket leállítja (kill), az “S” betűseket pedig elindítja (start). Futási szintre lépéskor előbb a leállításokat hajtja végre, majd utána az elindításokat. Az S/K után két szám következik (sorrend meghatározása), majd jön a program neve. Ha a sorszámok azonosak, akkor azok a programok az ábécé sorrendje alapján kerülnek futtatása.

Beállítható, hogy a CTRL+ALT+DEL billentyűkombinációra mi történjen:

ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

UPS jelzéseire történő reagálást a következő sorok adják meg:

pf::powerwait:/etc/init.d/powerfail start
pn::powerfailnow:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail stop

A konzolok számát a következőképpen adhatjuk meg:

azonosító:futásszint:tevékenység:processz

1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6

Alapesetben 6 darab terminálon tudunk bejelentkezni a rendszerbe, de ezt akár növelhetjük vagy csökkenthetjük, igény szerint. Maximálisan 63 konzolt hozhatunk létre.

A futásszint mezőben lehet megadni, hogy melyik futási szinten legyen elérhető az aktuálisan megadott konzol.

A tevékenység mezőben adható meg, hogy milyen feltételekkel fusson le a processz mezőben megadott program, ilyen lehet például:

respawn A program automatikusan újraindul megállása után.
wait A processz akkor indul el, amikor a megadott futási szintre lép a rendszer, és az init addig vár, amíg a processz fut.
once Csak egyszer, a futási szintre lépéskor indul el
boot A process a rendszer újraindulása közben indul el (a megadott futási szint lényegtelen ilyenkor).
bootwait A processzt a rendszer indulása közben indítja el, az init megvárja amíg lefut.
initdefault Az initdefault bejegyzést azt adja meg, hogy a rendszer induláskor melyik futási szintre lép automatikusan, ha nem adjuk meg, akkor az init bekéri a konzolról.
sysinit A processz a rendszer újraindítása alatt hajtódik végre, mégpedig a boot és a bootwait bejegyzés előtt. Az init ilyenkor megvárja, hogy a processz befejeződjön, mielőbb továbbmenne.
ctrlaltdel A processz akkor hajtódik végre, ha az init SIGINT szignált kap. Ez azt jelenti, hogy a rendszer valamelyik konzolján valaki lenyomta a CTRL+ALT+DEL billentyűkombinációt. Ez általában a rendszer valamiféle leállását okozza: egyfelhasználós módra történő váltás, újraindítás vagy leállítás.

A processz mezőben adható meg, hogy melyik program induljon el. Ha a processz mező „+” jellel kezdődik, akkor az init nem készít bejegyzést az utmp és a wtmp fájlokban a processzről.

Ha megváltoztattuk az /etc/inittab fájlt, akkor ajánlatos az init programmal újraolvastatni a tartalmát, hogy tovább az új beállításokkal fusson:

root@bash# init q
root@bash#

vagy

root@bash# kill -HUP 1
root@bash#

S már érvénybe is lépett az új beállítás.

Még érdemes egy szösszenet erejéig meglesni a /etc/rc.local fájlt. E fájl minden többfelhasználós futási szint (azaz a single-user/recovery módok kivételével) végén lefut. Alap telepítés esetén nem csinál semmit, de lehetőségünk van módosítani, parancsokat elhelyezni benne.

A (K)ubuntu rendszerek már nem a “sima” SystemV init-et használják, áttértek az upstart-ra, ami egy event-alapú init rendszer és a beállító fájljai a /etc/event.d/ könyvtárban találhatók meg.