NAZWA¶
init, telinit - sterowanie procesu inicjującego
SKŁADNIA¶
/sbin/init [
-a ] [
-s ] [
-b ] [
-z
xxx] [
0123456Ss ]
/sbin/telinit [
-t SEKUNDY ] [
0123456sSQqabcUu ]
/sbin/telinit [
-e
ZMIENNA[
=WARTOŚĆ] ]
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 (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.
ROZRUCH¶
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ą.
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 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:
- F(AIL)
- Zawodzi zasilanie, UPS dostarcza mocy. Wykonuje wpisy powerwait i
powerfail.
- O(K)
- Zasilanie powróciło, uruchamia wpisy
powerokwait.
- L(OW)
- Zasilanie zawodzi, a UPS-owi wyczerpuje się bateria. Wykonuje wpisy
powerfailnow.
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.).
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 Ss0123456, 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.
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.
ŚRODOWISKO¶
Init ustawia następujące zmienne środowiskowe dla
wszystkich swoich dzieci:
- PATH
- /bin:/usr/bin:/sbin:/usr/sbin
- 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, S, single
- Rozruch 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.
- -a, auto
- Program ładujący LILO dodaje słowo "auto"
do linii poleceń, jeżeli uruchomił jądro z
domyślną linią poleceń (użytkownik jej
nie zmieniał). Jeżeli init znajdzie to słowo,
ustawi zmienną środowiskową "AUTOBOOT" na
"yes". Proszę zauważyć, że nie
można tego użyć jako środka
bezpieczeństwa - oczywiści użytkownik
mógł ręcznie w linii poleceń wpisać
"auto" użyć opcji -a.
- -z xxx
- Argument opcji -z jest ignorowany. Może być
użyta do wydłużenia linii poleceń, tak
żeby zajmowała więcej miejsca na stosie. Init
może wtedy manipulować linią poleceń, tak
żeby ps(1) pokazywało bieżący tryb
uruchomienia.
INTERFEJS¶
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.
SYGNAŁY¶
Init reaguje na następujące sygnały:
- SIGHUP
- Ma ten sam efekt co telinit q.
- SIGUSR1
- Po odebraniu tego sygnału, init zamyka i ponownie otwiera
swoją kontrolkę fifo, /run/initctl.
- 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
/var/run/utmp
/var/log/wtmp
/run/initctl
OSTRZEŻENIA¶
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.
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 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.
AUTOR¶
Miquel van Smoorenburg (miquels@cistron.nl), pierwszą wersję
strony podręcznika napisał Michael Haardt
(u31b3hs@pool.informatik.rwth-aachen.de).
ZOBACZ TAKŻE¶
getty(1),
login(1),
sh(1),
runlevel(8),
shutdown(8), kill(1),
inittab(5),
initscript(5),
utmp(5)
TŁUMACZENIE¶
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.