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 oprogramowania 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 jednego 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 udokumentowane. 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ż inittab(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 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 pierwszy, 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 pozycje 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 stworzone 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 oryginalnie im utworzył. Jeżeli jakikolwiek proces zmienił swą przynależność do grupy procesów to nie odbierze tych sygnałów. Tego typu procesy muszą być kończone osobno (np. demony wszelakie - przyp. tłum.).

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żytkownika.

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 wszystkich swoich dzieci:

PATH
    /usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin

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 zmianie poziomów).

CONSOLE
    Konsola systemu. Tak naprawdę ta wartość jest przyjmowana od jądra; jednak jeśli nie jest ustawiona 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 procesem init. Ten interfejs nie jest zbyt dobrze udokumentowany 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 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 ctrlaltdel.

SIGWINCH
    Jądro wysyła ten sygnał jeśli wciśnięty został klawisz 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ą przynależ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 konsolę systemu, i przerwie pomnażanie danego pola do upłynięcia 5u minut lub do odebrania sygnału. Zapobiega to "zjadaniu" zasobów systemu gdy ktoś popełni błąd typograficzny (bardziej po naszemu: "literówkę" - przyp. tłum.) w pliku /etc/inittab lub gdy program normalnie uruchamiany dla danego wpisu jest usunięty.

AUTOR
Miquel van Smoorenburg (miquels@cistron.nl), initial manual 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)