init, telinit - sterowanie procesu inicjującego
/sbin/init [
-a ] [
-s ] [
-b ] [
-z
xxx] [
0123456Ss ]
/sbin/init [
--version ]
/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/inittab.
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ą.
After it has spawned all of the processes specified,
init waits for one
of its descendant processes to die, a powerfail signal, or until it is
signaled by
telinit to change the system's runlevel. When one of the
above three conditions occurs, it re-examines the
/etc/inittab file.
New entries can be added to this file at any time. However,
init still
waits for one of the above three conditions to occur. To provide for an
instantaneous response, the
telinit Q or
q command can wake up
init to re-examine (reload) the
/etc/inittab file.
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.
Usage of
SIGPWR and
/etc/powerstatus is discouraged. Someone
wanting to interact with
init should use the
/run/initctl
control channel - see the
initctl(5) manual page for more documentation
about this.
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:
-
0, 1, 2, 3, 4, 5
lub 6
- mówią procesowi init by
przełączył w odpowiedni poziom działania.
-
a, b, c
- tell init to process only those /etc/inittab
file entries having runlevel a, b or 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 3 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:
- 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.
Jest możliwe by przekazać pewne flagi do procesu
init z
monitora startowego (np. LILO lub GRUB).
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.
- --version
- This argument, when used on its own, displays the current
version of init to the console/stdout. It is a quick way to
determine which init software and version is being used. After the
version information is displayed, init immediately exits with a
return code of zero.
init nasłuchuje wiadomości na łączu
fifo w /dev,
/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:
- SIGHUP
- Ma ten sam efekt co telinit q.
- SIGUSR1
- On receipt of this signals, init closes and re-opens
its control fifo, /run/initctl. Useful for bootscripts when
/dev is remounted.
- SIGUSR2
- When init receives SIGUSR2, init
closes and leaves the control fifo, /run/initctl, closed. This may
be used to make sure init is not holding open any files. However,
it also prevents init from switching runlevels. Which means
commands like shutdown no longer work. The fifo can be re-opened by
sending init the SIGUSR1 signal.
- SIGINT
- Normally the kernel sends this signal to init when
CTRL-ALT-DEL is pressed. It activates the ctrlaltdel action.
- SIGWINCH
- Jądro wysyła ten sygnał jeśli
wciśnięty został klawisz KeyboardSignal.
Aktywuje to akcję kbrequest.
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 , pierwszą wersję strony podręcznika
napisał
Michael
Haardt
getty(1),
login(1),
sh(1),
runlevel(8),
shutdown(8),
kill(1),
initctl(5),
inittab(5),
initscript(5),
utmp(5)