Obecnie, chyba w większości systemow unikoswych
(wszystkich ?) istnieje podział na poziomy pracy, tzw. runlevels.
init zawsze
oferuje tryb jednego użytkownika (single user mode), w którym nikt nie może sie
zalogować, a root korzysta z powłoki. Normalnie, system pracuje w trybie wielu
uzytkownikow (multi user mode). Istnieją jeszcze inne poziomy pracy, m.in.
reboot, halt, które również są runlevel`ami. Czasami w Linuksie stosuje sie
runlevel, w którym domyslnie uruchamiany jest X Window System. A oto lista
poziomów pracy wystepujaca w dystrybucji Slackware (w innych dystrybucjach moze
wygladac nieco inaczej ):
0 - halt, czyli zatrzymanie pracy
systemu
1 - single user mode, tryb jednego użytkownika
2 - nieużywany, skonfigurowany identycznie jak runlevel 3
3 - multiuser mode, domyślny runlevel w Slackware
4 - X11, ten poziom automatycznie uruchamia X Window System
5 - nieuzywany, skonfigurowany identycznie jak runlevel 3
6 - reboot, chyba wiadomo ;-)
init wbrew pozorom wykorzystywany jest nie tylko przy starcie Linuxa. Jest także odpowiedzialny za nadzorowanie pracy systemu m.in. wznawianie procesów, których akcja została zdefiniowana jako 'respawn' (o tym później), zmiana poziomu pracy na życzenie administratora of course (wiaze sie z tym 'zabicie' procesow nie chcianych na docelowym runlevel`u oraz uruchomieniu wymaganych przez ten runlevel ). Przyjrzyjmy się teraz plikowi konfiguracyjnemu programu init, który zowie sie inittab. Zwykle jest on umieszczony w katalogu /etc (jak wiekszosc plikow konfiguracyjnych). Każa linia w pliku inittab ma następującą składnię: id:runlevels:action:process. A teraz po kolei co jest co :
id - unikalny dwuznakowy
identyfikator linii
runlevels - lista runleveli, na których
mają być uruchamiane dane proces
action - definicja akcji
process - oznacza ścieżkę do programu, który ma zostać
uruchomiony
Myślę, że warto przyjżeć się bliżej definicji akcji. Oto lista akcji jakie mogą zostać zadeklarowane:
respawn - proces zostanie
natychmiastowo wznowiony zaraz po zakończeniu
wait - proces wykonywany tylko raz, przy startowaniu runlevel`u, init czeka na jego zakończenie
once - jak wyżej, tylko init nie oczekuje na zakończenie procesu
boot - proces wykonywany tylko przy przejściu do poziomu 'boot'
bootwait - jak wyżej, tylko init nie czeka na zakończenie procesu
sysinit - proces rozpoczynany tylko przy przejsciu to poziomu 'sysinit'
powerwait - proces zostanie rozpoczęty gdy init odbierze SIGPWR mówiący o jakichś problemach z zasilaniem
power - jak wyżej, tylko init nie czeka na zakończenie procesu
powerokwait - proces zostanie rozpoczęty, gdy init odbierze SIGPWR, a plik /etc/powerstatus będzie zawierał "OK"
ctrlaltdel - proces zostanie rozpoczęty po nacisnieciu ctrl+alt+delete
initdefault - definiuje runlevel na jakim domyślnie ma zostać uruchomiony system
Przypatrzmy się teraz przykładowej linii jaką może zawierać inittab :
rc:2345:wait:/etc/rc.d/rc.M
I po kolei...
rc - identyfikator linii
2345 - oznacza to że polecenie/program zdefiniowany później ma zostać wykonane na 2, 3, 4 oraz 5 runlevel`u
wait - definicja akcji, proces zostanie wykonany tylko raz, przy starcie runlevel`u a init będzie oczekiwal na jego zakoćczenie
/etc/rc.d/rc.M - definicja procesu jaki ma zostać uruchomiony, w tym przypadku, zostanie uruchomiony skrypt /etc/rc.d/rc.M
Jak widac nie jest to tak skomplikowane jak mogloby sie wydawac. Wystarczy troche teorii i wszystko wydaje sie proste. Myślę, że to co tu napisałem, pomoże Ci zrozumieć (choć troszkę) 'cel' istnienia/działania inita, a także budowę inittaba.