INIT(8) | Podręcznik administratora systemu Linux | INIT(8) |
init, telinit - sterowanie procesu inicjującego
/sbin/init [ -a ] [ -s ] [ -b ] [
-z xxx] [ 0123456Ss ]
/sbin/telinit [ -t SEKUNDY ] [ 0123456sSQqabcUu ]
/sbin/telinit [ -e
ZMIENNA[=WARTOŚĆ] ]
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.
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 (inaczej 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 S, 0, 1, oraz 6 są zarezerwowane. Tryb S jest używany do zainicjowania systemu, podczas jego rozruchu. Gdy uruchamiany jest tryb pracy S (w czasie rozruchu) lub tryb pracy 1 (przełączanie się z trybu wielu użytkowników), system jest wprowadzany w tryb pracy jednego użytkownika ("single-user mode"), po którym bieżącym poziomem pracy jest S. Tryb 0 jest używany, by zatrzymać system; tryb 6, by przeładować system (reboot).
Po zakończeniu rozruchu w poziomie S, system jest automatycznie wprowadzany w jeden z trybów wielu użytkowników, od 2 do 5, chyba że wystąpił problem, który musi zostać naprawiony przez administratora, w trybie jednego użytkownika. Po przejściu w tryb jednego użytkownika administrator zwykle zajmuje się konserwacją, a następnie przeładowuje system.
Aby uzyskać więcej informacji na ten temat, proszę zapoznać się ze stronami podręcznika shutdown(8) i inittab(5).
Tryby pracy 7-9 również są poprawne, choć niezbyt dobrze udokumentowane. Wynika to z faktu, że "tradycyjne" warianty Uniksa nie używają ich.
Poziomy S i s są w rzeczywistości takie same. Wewnętrznie są to tylko zastępcze nazwy dla tego samego trybu pracy.
Po tym jak init jest wywołany w ostatnim kroku sekwencji rozruchowej 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 wcale 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 inicjuje ustawienia stty konsoli na bezpieczne wartości. Ustawiany jest tryb clocal. Prędkość sprzętu i handshaking nie są zmieniane.
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ą.
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 zmiany poziomu 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 (SIGPWR), czyta plik /etc/powerstatus. Następnie uruchamia polecenie zależne od zawartości tego pliku:
Jeżeli plik /etc/powerstatus nie istnieje lub zawiera cokolwiek innego niż jedną z liter F, O lub L, init zachowa się tak, jakby przeczytał F.
Używanie SIGPWR i /etc/powerstatus nie jest zalecane. Jeżeli ktoś chce współdziałać z initem, powinien użyć kanału kontroli /run/initctl - proszę przeczytać kod źródłowy pakietu sysvinit po więcej dokumentacji dotyczącej tego kanału.
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.).
/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:
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.
telinit -e mówi procesowi init, aby zmienił środowisko procesów, które mnoży. Argumenty do -e mogą mieć postać ZMIENNA=WARTOŚĆ, która ustawia zmiennej ZMIENNA wartość WARTOŚĆ lub postać ZMIENNA (bez znaku równości), która usuwa zmienną ZMIENNA.
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.
Init ustawia następujące zmienne środowiskowe dla wszystkich swoich dzieci:
Jest możliwe by przekazać pewne flagi do procesu init z monitora startowego (np. LILO). Init dopuszcza stosowanie następujących flag:
Init nasłuchuje wiadomości na łączu fifo w /run, /run/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.
Init reaguje na następujące sygnały:
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ą.
/etc/inittab /etc/initscript /dev/console /var/run/utmp /var/log/wtmp /run/initctl
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 jednego wiersza terminala.
W systemie Debian, wejście w poziom pracy 1 powoduje zabicie wszystkich procesów z wyjątkiem wątków jądra i skryptu który wykonuje zabijanie oraz innych procesów w jego sesji. W konsekwencji, powracanie z poziomu 1 do poziomu pracy trybu wielu użytkowników nie jest bezpieczne: demony, które zostały uruchomione w poziomie S i są wymagane do normalnego działania nie są dłużej uruchomione. System powinien zostać uruchomiony ponownie.
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 5 minut lub do odebrania sygnału. Zapobiega to "zjadaniu" zasobów systemu gdy ktoś popełni literówkę w pliku /etc/inittab lub gdy program normalnie uruchamiany dla danego wpisu jest usunięty.
Miquel van Smoorenburg (miquels@cistron.nl), pierwszą wersję strony podręcznika napisał Michael Haardt (u31b3hs@pool.informatik.rwth-aachen.de).
getty(1), login(1), sh(1), runlevel(8), shutdown(8), kill(1), inittab(5), initscript(5), utmp(5)
Tłumaczenie opisuje tradycyjną wersję init z SystemV, używaną domyślnie przez Debiana. W przypadku korzystania z init udostępnianego przez wywodzący się z Ubuntu upstart, proszę wydać polecenie man --locale=C 8 init, aby zapoznać się z właściwym opisem w języku angielskim.
Autorami polskiego tłumaczenia niniejszej strony podręcznika man są: Paweł Wilk (PTM) <siewca@dione.ids.pl>, Robert Luberda (PTM) <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>.
Polskie tłumaczenie jest częścią projektu manpages-pl; uwagi, pomoc, zgłaszanie błędów na stronie http://sourceforge.net/projects/manpages-pl/. Jest zgodne z wersją 2.88 oryginału.
29 lipca 2004 |