INIT(8) Podręcznik Administratora Systemu Linux INIT(8)
NAZWA
init, telinit - sterowanie procesu inicjującego
SKŁADNIA
/sbin/init [ 0123456Ss ]
/sbin/telinit [ -t sec ] [ 0123456sSQqabcUu ]
OPIS
Init
Init jest przodkiem wszystkich procesów. Jego głównym
zadaniem jest stworzenie procesów w oparciu o skrypt
zapisany w pliku /etc/inittab (patrz też inittab(5)). Ten
plik zawiera zwykle pozycje które każą procesowi init
pomnażać getty na każdej linii, na które użytkownicy mogą
się zalogować. Kontroluje też samodzielne procesy,
których istnienie jest konieczne w danym systemie.
POZIOMY PRACY
Runlevel (poziom pracy) jest to konfiguracja oprogramowa
nia systemu, która pozwala zaistnieć tylko wytypowanym
grupom procesów. Procesy tworzone przez init dla każdego
z tych poziomów są zdefiniowane w pliku /etc/inittab.
Init może być w jednym z ośmiu poziomów pracy: 0-6 i S lub
s. Poziom pracy jest zmieniany przez uruchomienie telinit
przez uprzywilejowanego użytkownika. telinit wysyła
odpowiednie sygnały do init, mówiące w jaki tryb ma
przejść.
Tryby pracy 0, 1, oraz 6 są zarezerwowane. Tryb 0 jest
używany by zatrzymać system, tryb 6 by przeładować system
(reboot), a tryb 1 by wprowadzić system w tryb pracy jed
nego użytkownika (single user - mode). Tryb S nie jest
pomyślany dokładnie tak by go używać bezpośrednio, lecz
raczej dla skryptów wykonywanych przy wchodzeniu w tryb 1.
Aby uzyskać więcej informacji na ten temat, zobacz strony
podręcznika dla shutdown(8) i inittab(5).
Tryby pracy 7-9 też są poprawne, choć niezbyt udokumen
towane. To z powodu "tradycyjnych" wariantów Unixa nie
używających ich. Jeśli jesteś ciekaw to wiedz, że poziomy
S i s są w rzeczywistości takie same. Wewnętrznie są to
tylko zastępcze nazwy dla takich samych trybów pracy - to
jedynie zbytek po systemach, których autor zwykł był
używać podczas pisania sysvinit.
BOOTOWANIE
Po tym jak init jest wywołany w ostatnim kroku sekwencji
bootującej jądra, szuka pliku /etc/inittab w celu
znalezienia w nim pola typu initdefault (patrz też init
tab(5)). Pole initdefault określa początkowy poziom pracy
systemu. Jeśli nie ma tam takiego pola (lub w cale nie
istnieje /etc/inittab), poziom pracy musi być podany z
9 Marzec 1998 1
INIT(8) Podręcznik Administratora Systemu Linux INIT(8)
konsoli systemowej.
Poziom S lub s wprowadza system w tryb jednego użytkownika
i nie wymaga pliku /etc/initttab. W trybie jednego
użytkownika, wywoływany jest /sbin/sulogin na urządzeniu
/dev/console.
Podczas wchodzenia w tryb jednego użytkownika, proces init
czyta stany ioctl(2) konsoli z /etc/ioctl.save. Jeśli ten
plik nie istnieje, init inicjuje linię przy 9600 bodach i
z ustawieniami CLOCAL. Gdy init opuści tryb jednego
użytkownika, zapamiętuje ustawienia ioctl konsoli w tym
pliku, więc może ponownie ich użyć przy okazji następnej
sesji jednego użytkownika.
Podczas wchodzenia w tryb wielu użytkowników po raz pier
wszy, init wykonuje pozycje boot i bootwait by pozwolić
systemom plików zamontować się zanim użytkownicy będą
mogli się zalogować. Potem wykonywane są wszystkie pozy
cje przypisane danemu poziomowi pracy.
Kiedy nowy proces startuje, init sprawdza najpierw czy
istnieje plik /etc/initscript. Jeśli tak, używa tego
skryptu by ten proces zacząć.
Za każdym razem, gdy proces potomny się zakończy, init
zapamiętuje ten fakt i powód śmierci procesu jest zapisany
w /var/run/utmp i /var/log/wtmp, pod warunkiem że te pliki
istnieją.
ZMIENIANIE TRYBÓW PRACY
Po tym jak "namnożone" zostaną wszystkie wyszczególnione
procesy, init czeka na śmierć każdego swojego procesu
potomnego, sygnał braku energii, lub zasygnalizowanie
przez telinit by zmienić poziom działania systemu. Gdy
wystąpi jeden spośród tych trzech warunków, ponownie
sprawdzany jest plik /etc/inittab, ponieważ nowe pola mogą
być do niego dodane w każdej chwili. Jednakowoż, init
wciąż oczekuje na wystąpienie jednego z tych trzech
warunków. By przygotować się na natychmiastową odpowiedź,
telinit Q albo użyta komenda q może obudzić proces init by
jeszcze raz przeczytał plik /etc/inittab.
Jeśli init nie jest w trybie jednego użytkownika i odbiera
sygnał zaniku energii, wywoływane są specjalne pola stwor
zone z myślą o zaniku energii.
Gdy init jest proszony o zmianę poziomu działania, wysyła
sygnał ostrzegawczy SIGTERM do wszystkich procesów, które
nie są zdefiniowane w nowym poziomie pracy. Potem czeka 5
sekund zanim "na siłę" zakończy te procesy poprzez sygnał
SIGKILL. Zauważ, że init zakłada, że wszystkie te procesy
(i ich potomki) pozostają w tej samej grupie procesów,
którą init orginalnie im utworzył. Jeżeli jakikolwiek
9 Marzec 1998 2
INIT(8) Podręcznik Administratora Systemu Linux INIT(8)
proces zmienił swą przynależność do grupy procesów to nie
odbierze tych sygnałów. Tego typu procesy muszą być
kończone osobno.
TELINIT
/sbin/telinit jest symbolicznym dowiązaniem do /sbin/init.
Pobiera on jednoznakowy argument i sygnały init by podjąć
stosowne działanie.
Poniższe argumenty można stosować jako rozkazy dla
telinit:
0,1,2,3,4,5 lub 6
mówią procesowi init by przełączył w odpowiedni
poziom działania.
a,b,c każą procesowi init by przetwarzał tylko te pola
pliku /etc/inittab, które odnoszą się do poziomu
pracy a,b lub c.
Q lub q
każą procesowi init jeszcze raz przeczytać plik
/etc/inittab.
S lub s
mówią żeby init przełączył w tryb jednego użytkown
ika.
U lub u
każą procesowi init przeładować się (zachowując
obecny stan). Nie występuje ponowne odczytywanie
pliku /etc/inittab. Poziom pracy powinien być
ustawiony na Ss12345, w przeciwnym wypadku żądanie
może być "delikatnie" zignorowane.
telinit może także powiedzieć procesowi init jak długo
powinien on czekać między wysyłaniem sygnałów SIGTERM i
SIGKILL. Domyślną wartością jest 5 sekund, ale może być
ona zmieniona za pomocą opcji -t sec.
telinit może być wywoływany tylko przez użytkowników
uprzywilejowanych.
Wywołany init sprawdza czy jest procesem inicjującym init
czy też jest wywołany jako telinit poprzez wgląd w swój
identyfikator procesu; prawdziwy identyfikator procesu
init ma zawsze wartość 1. Teraz już wiadomo, że zamiast
wywoływać telinit możesz też po prostu użyć init a nie
skrótu.
ŚRODOWISKO
Init ustawia następujące zmienne środowiskowe dla wszyst
kich swoich dzieci:
PATH /usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin
9 Marzec 1998 3
INIT(8) Podręcznik Administratora Systemu Linux INIT(8)
INIT_VERSION
Jak mówi nazwa - wersja programu. Użyteczne dla
określenia jeśli skrypt uruchamia się bezpośrednio
z init.
RUNLEVEL
Obecny poziom pracy systemu.
PREVLEVEL
Poprzedni poziom pracy systemu (użyteczne po zmi
anie poziomów).
CONSOLE
Konsola systemu. Tak naprawdę ta wartość jest
przyjmowana od jądra; jednak jeśli nie jest ustaw
iona init ustawi ją domyślnie na /dev/console.
FLAGI STARTOWE
Jest możliwe by przekazać pewne flagi do procesu init z
monitora startowego (np. LILO). Init dopuszcza stosowanie
następujących flag:
S, single
Bootowanie w trybie jednego użytkownika. W tym trybie
/etc/inittab jest sprawdzany (wczytywany) i skrypty
startowe rc są zwykle uruchamiane zanim wystartuje
powłoka dla trybu jednego użytkownika.
1-5 Poziom działania w jakim system ma wystartować.
-b, emergency
Wejście bezpośrednio w tryb jednego użytkownika bez
uruchamiania żadnych innych skryptów startowych.
INTERFEJS
Init nasłuchuje wiadomości na łączu fifo w /dev,
/dev/initctl. Telinit używa tego do komunikacji z proce
sem init. Ten interfejs nie jest zbyt dobrze udokumen
towany czy skończony. Zainteresowani powinni przestudiować
plik initreq.h w podkatalogu src/ archiwum tarowego z
kodem źródłowym init.
SYGNAŁY
Init reaguje na następujące sygnały:
SIGHUP
Init szuka /etc/initrunlvl i /var/log/initrunlvl.
Jeśli jeden z tych plików istnieje i zawiera poziom
pracy z postaci ASCII, init przełącza w nowy, podany
poziom. Jest to tylko po to by zachować zgodność
"wstecz"! . W normalnej sytuacji (pliki nie
9 Marzec 1998 4
INIT(8) Podręcznik Administratora Systemu Linux INIT(8)
istnieją) init zachowuje się tak jakby wywołany był
telinit q.
SIGUSR1
Po odebraniu tegoż sygnału, init zamyka i ponownie
otwiera swoją kontrolkę fifo, /dev/initctl. Użyteczne
w przypadku skryptów startowych, gdy przemontowywany
jest katalog /dev.
SIGINT
Zwykle ten sygnał jest wysyłany z jądra by
powiedzieć, że wciśnięta została kombinacja klawiszy
CTRL-ALT-DEL. Powoduje to rozpoczęcie akcji ctrlalt
del.
SIGWINCH
Jądro wysyła ten sygnał jeśli wciśnięty został klaw
isz KeyboardSignal. Aktywuje to akcję kbrequest.
ZGODNE Z
Init jest kompatybilny z init obecnym System V. Działa
razem ze skryptami w katalogach /etc/init.d i
/etc/rc{poziom_działania}.d. Jeśli twój system używa tej
konwencji, to powinien być obecny plik README w katalogu
/etc/init.d wyjaśniający jak te skrypty działają.
PLIKI
/etc/inittab
/etc/initscript
/dev/console
/etc/ioctl.save
/var/run/utmp
/var/log/wtmp
/dev/initctl
UWAGI
Init zakłada, że procesy i ich procesy potomne pozostają w
tej samej grupie procesów, która była dla nich oryginalnie
stworzona. Jeżeli jakikolwiek proces zmienił swą przy
należność do grupy procesów, init nie może ich zabić i
może skończyć się na tym, że zostaną dwa procesy czytające
z jednej linii terminala.
DIAGNOSTYKA
Jeśli init zorientuje się, że wciąż powtarza namnażanie
zadanego procesu częściej niż 10 razy w ciągu 2 minut,
wtedy założy że gdzieś w wywołaniu komendy jest błąd,
wyśle wiadomość o błędzie na konsloę systemu, i przerwie
pomnażanie danego pola do upłynięcia 5u minut lub do ode
brania sygnału. Zapobiega to "zjadaniu" zasobów systemu
gdy ktoś popełni błąd typograficzny (bardziej po naszemu:
9 Marzec 1998 5
INIT(8) Podręcznik Administratora Systemu Linux INIT(8)
"literówkę") w pliku /etc/inittab lub gdy program normal
nie uruchamiany dla danego wpisu jest usunięty.
AUTOR
Miquel van Smoorenburg (miquels@cistron.nl), initial man
ual page by Michael Haardt (u31b3hs@pool.informatik.rwth-
aachen.de).
PATRZ TEŻ
getty(1), login(1), sh(1), who(1), shutdown(8), kill(1),
inittab(5), initscript(5), utmp(5)
9 Marzec 1998 6