artykuły
Powrót do listy artykułów

Temat artykułu: Proces 'init'
Tekst napisał focusek dnia 14-01-2005

init jest pierwszym i zarazem jednym z najważniejszych procesów uruchamianych przez Linuxa. Jest wywoływany bezpośrednio przez kernel i otrzymuje pid 1. init 'osobiście' uruchamia kolejne procesy / demony, m.in. do obslugi swap`a. W późniejszej kolejności, inicjalizowane są urządzenia, montowane jest główne drzewo katalogów (Root Directory).

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.