Kiedy bootujesz komputer, masa wiadomości przewijających się przez konsole ukazuje wykonywane automatyczne inicjalizacje i konfiguracje. Czasami chcesz nieco wpłynąć na działanie tego etapu, co oznacza, ze musisz go dobrze zrozumieć. To jest właśnie celem tej części książki.
Po pierwsze, BIOS kontroluje komputer, wykrywa dyski, ładuje główny sektor rozruchowy i uruchamia bootloader. Bootloader przejmuje kontrole, znajduje jądro systemu na dysku, ładuje i uruchamia je. Jądro systemu jest następnie inicjalizowane i rozpoczyna poszukiwanie i montowanie partycji zawierającej główny system plików i w końcu uruchamia pierwszy program-init
. Często, ta główna partycja i init
są, tak naprawdę, ulokowane w wirtualnym systemie plików, który istnieje tylko w pamięci RAM(stąd jego nazwa,“initramfs”, dawniej zwany “initrd” lub "inicjalizacja dysku RAM").Ten system plików jest ładowany do pamięci przez bootloader, często z pliku na dysku twardym lub z sieci. Zawiera absolutne minimum wymagane przez jądro systemu do wczytania "prawdziwego" głównego systemu plików: mogą to być moduły sterowników dla dysku twardego lub inne programy, bez których system nie może się zbootować albo jeszcze częściej skrypty inicjalizacyjne i moduły do kompletacji RAID, tworzenia zaszyfrowanych partycji, aktywacji LVM itd. Kiedy główna partycja jest już zamontowana, initramfs oddaje kontrolę rzeczywistemu initowi i maszyna wraca do standardowego procesu bootwania.
"Rzeczywisty init " jest obecnie dostarczany przez sysv-rc (“System V”) i ten fragment stanowi jego dokumentację.
Init uruchamia kilka procesów, następujące polecenia z pliku
/etc/inittab
. Pierwszy uruchamiany program(który nawiązuje do kroku
sysinit ) jest to
/etc/init.d/rcS
, skrypt, który uruchamia wszystkie programy w
/etc/rcS.d/
.
Wśród nich możesz znaleźć kolejno programy odpowiedzialne za:
konfigurowanie klawiatury konsoli;
wczytywanie sterowników: większość modułów jądra systemu jest wyczytywana przez nie samodzielnie jak przy wykryciu dysku twardego; następnie automatycznie wczytywane są dodatkowe sterowniki, a lista nawiązujących modułów tworzona jest w /etc/modules
;
sprawdzanie integralności systemu plików;
montowanie lokalnych partycji;
konfigurowanie sieci;
montowanie sieciowego systemu plików(NFS).
Po tym etapie, init
przejmuje kontrolę i uruchamia programy włączone w domyślny poziom działania(którym jest zazwyczaj poziom 2). Uruchamia /etc/init.d/rc 2
, skrypt, który włącza wszystkie usługi wymienione w /etc/rc2.d/
i których nazwa zaczyna się na literę "S". Dwucyfrowy numer, który wystąpił, był kiedyś używany do definiowania kolejności, w której usługi muszą być uruchomione, ale obecnie domyślny system bootujący używa insserv
, który planuje wszystko automatycznie bazując na zależnościach skryptów. Tak więc każdy butujący skrypt deklaruje warunki, które muszą być spełnione aby uruchomić bądź zatrzymać usługę(na przykład, czy musi być uruchamiana przed lub po innej usłudze); następnie init
uruchamia je w kolejności, która spełnia podane warunki. Statyczne numerowanie skryptów nie jest już dlatego brane pod uwagę(ale zawsze muszą zaczynać się na literę "S", po której następują 2 cyfry i prawdziwa nazwa skryptu używanego do określenia zależności). Ogólnie, podstawowe usługi(takie jak przetwarzanie logów przez rsyslog
lub przypisywanie portów przez portmap
) są uruchamiane pierwsze, a po nich włączane są standardowe usługi i środowisko graficzne (gdm
).
System bootowania oparty na zależnościach sprawia, że możliwe jest zautomatyzowanie ponownego numerowania, które potrafi być uciążliwe, jeśli trzeba je przeprowadzić ręcznie, oraz zmniejsza prawdopodobieństwo ludzkiego błędu, ponieważ planowanie odbywa się według wskazanych parametrów. Inną korzyścią jest to, że usługi mogą być uruchomione równolegle, jeśli są od siebie niezależne, co przyśpiesza proces bootowania.
init
wyróżnia kilka poziomów działania, więc może przełączać się między nimi komendą telinit new-level
. init
natychmiastowo uruchamia/etc/init.d/rc
z nowym poziomem działania. Następnie ten skrypt uruchamia brakujące usługi i zatrzymuje te, które nie są już pożądane. Aby to zrobić, wskazuje na zawartość /etc/rcX.d
(gdzie X reprezentuje nowy poziom działania). Skrypty zaczynające się na "S"(jak "Start") są usługami do uruchomienia; te zaczynające się na "K"(jak "Kill") są usługami, które należy zatrzymać. Skrypt nie uruchomi żadnej usługi, która jest już aktywna w poprzednim poziomie działania.
Domyślnie, Debian korzysta z czterech różnych poziomów działania:
Poziom 0 jest używanym tylko tymczasowo, podczas wyłączania się komputera. Dlatego zawiera wiele skryptów "K".
Poziom 1, znany także jako tryb dla pojedynczego użytkownika( single-user mode), odpowiada systemowi w trybie awaryjnym; zawiera tylko podstawowe usługi i powstał do wykonywania konserwacji, tak więc interakcje ze zwykłym użytkownikiem nie są pożądane.
Poziom 2 służy do wykonywania zwyczajnych operacji, w skład których wchodzą usługi sieciowe, środowisko graficzne, loginy itd.
Poziom 6 jest podobny do poziomu 0, pomijając to, że jest używany podczas fazy zamykania, która poprzedza ponowne uruchomienie.
Istnieją inne poziomy, szczególnie od 3 do 5. Domyślnie są skonfigurowane tak, by działać identycznie jak poziom 2, ale administrator może je zmodyfikować(dodając lub usuwając skrypty w /etc/rcX.d
) aby przystosować je do szczególnych potrzeb.
Wszystkie skrypty zawierające się w różnych /etc/rcX.d
directories are really only symbolic links — created upon package installation by the update-rc.d
program — pointing to the actual scripts which are stored in /etc/init.d/
. The administrator can fine tune the services available in each runlevel by re-running update-rc.d
with adjusted parameters. The update-rc.d(1) manual page describes the syntax in detail. Please note that removing all symbolic links (with the remove
parameter) is not a good method to disable a service. Instead you should simply configure it to not start in the desired runlevel (while preserving the corresponding calls to stop it in the event that the service runs in the previous runlevel). Since update-rc.d
has a somewhat convoluted interface, you may prefer using rcconf
(from the rcconf package) which provides a more user-friendly interface.
Finally, init
starts control programs for various virtual consoles (getty
). It displays a prompt, waiting for a username, then executes login user
to initiate a session.