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
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 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).
PATRZ 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.