Start systemu, Co się dzieje podczas startu systemu Linux


Co się dzieje podczas startu systemu Linux?

2001-11-06 10:27 by Michał Sajdak

Gdy uruchamiamy naszego Linuksa zwykle widzimy dużo różnych, czasami dość skomplikowanych, komunikatów. Podczas startu system 'rozmawia' z nami wyrzucając na ekran informacje o wykonywanych operacjach oraz ewentualnych sukcesach bądź błędach przy uruchamianiu programów.

Dla Deweloperów

Tekst napisany jest w oparciu o Debiana 2.2 (potato). W niektórych innych dystrybucjach (np. Slackware) zastosowano odmienną, od opisanej poniżej, filozofię skryptów startowych.

Przy starcie linuksa można wyróżnić dwie zasadnicze fazy: fazę inicjalizacji jądra (nie będziemy się nią zajmować tym tekście - zainteresowani tematem wszystkie, wysłane podczas startu, komunikaty kernela mogą zobaczyć wyświetlając plik /var/log/dmesg) oraz faza uruchamiania programów.
Charakterystyczny komunikat rodzielający te dwa etapy wygląda mniej więcej tak: INIT: version 2.78 booting
W tym momecie uruchamiany jest proces o nazwie init (/sbin/init). Jest on rodzicem wszystkich procesów działających w Linuksie.
Konfiguracja inita znajduje się w pliku /etc/inittab. Aby przejść do jego omawiania, należy znać pojęcie
runlevelu. Runlevel jest to konfiguracja, w której uruchamiane i/lub zatrzymywane są określone programy. Przykładem może być single-user mode, gdzie odpalane są jedynie konieczne do wykonania czynności administracyjnych usługi (wszystkie zbędne są wyłączane).
Poszczególne linijki pliku /etc/inittab mają następującą postać:

id:runlevele:flaga:proces_do_odpalenia
gdzie:
id jest unikalnym identyfikatorem danej linijki
runlevele: w których runlevelach opcja ma być aktywna
flaga: niektóre możliwości to (wszystkie opcje można znaleść w manualu do inittaba):

proces_do_odpalenia: zostaje uruchomiony podany proces.

Zobaczmy co znajdziemy w standardowym /etc/inittab:

id:2:initdefault:
defaultowy runlevel 2
si::sysinit:/etc/init.d/rcS
na samym początku zostaje odpalony /etc/init.d/rcS

l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
...
uruchomiony zostaje skrypt /etc/init.d/rc z parametrem określającym w który runlevel wchodzimy

ca:12
345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
następuje reboot systemu po naciśnięciu ctrl+alt+del w każdym runlevelu

1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
...
ustawienia konsol wirtualnych.

Z treści /etc/inittab wynika, że na początku uruchamiany jest plik /etc/init.d/rcS. Tutaj ustawiane są pewne zmienne zdefiniowane w /etc/default/rcS (warto wspomnieć, że /etc/default/rcS wykorzystywany jest także przez niektóre skrypty startowe uruchamiane później). Następnie wykonywane są wszystkie pliki postaci /etc/rcS.d/rcS??* wraz z parametrem 'start' (pytajnik to dowolny znak). (Tak naprawdę pliki znajdujące się w katalogach /etc/rc?.d/ są linkami symbolicznymi do odpowiedników znajdujących się w /etc/init.d/). Standardowo zamiast ?? występuje liczba, która determinuje kolejność wykonywania skryptów - te o najmniejszym numerze wykonywane są najwcześniej. Po wykonaniu wszystkich plików aż do /etc/rcS.d/rcS40* (włącznie) będziemy mieć zamontowane wszystkie partycje, skonfigurowaną sieć oraz załadowane odpowiednie sterowniki urządzeń.
Przyjrzyjmy się kilku plikom:

Po wykonaniu ostatniego skrytu S60* powinniśmy mieć już zamontowane systemy plików NFS (jeśli mamy takowe zdefiniowane) oraz sprawdzone (za pomocą fsck) zamontowane wcześniej partycje. Niektóre skrypty:

Teraz, zgodnie z naszym /etc/inittab, wchodzimy do runlevelu 2. W związku z tym uruchamiany jest skrypt /etc/init.d/rc 2. Jego działanie jest nieco podobne do omawianego już /etc/init.d/rcS. Będą wykonane wszystkie skrypty z katalogu /etc/rc2.d/ (dwójka, jak łatwo można się domyślić, oznacza pliki odpowiedzialne za runlevel 2). W piewszej fazie zostaną uruchomione skrypty zaczynające się literą K wraz z parametrem stop. Sprawi to, że wyłączone zostaną pewne usługi (akurat w katalogu /etc/rc2.d/ nie ma plików rozpoczynających się na K - istnieją one np. w /etc/rc6.d/ - runlevel o numerze 6 służy do zamknięcia systemu). Następnym krokiem jest wykonanie plików rozpoczynających się literą S z przekazaniem parametru start (jest to wykonywane jedynie dla takich skryptów, które nie były uruchamiane w poprzednim runlevelu, bądz zostały wyłączone przy odpalaniu plików K*). Wykonanie skryptów K* i S* następuje według takiej samej zasady jaka miała miejsce w /etc/init.d/rcS.
Tutaj pliki 'S' odpowiadają za typowe usługi. Np.:

Na samym końcu kasowany jest jeszcze plik /etc/nologin i /etc/nologin.boot (plik S99rmnologin), co umożliwia logowanie się użytkownikom.
Warto wiedzieć jak zarządzać systemem linków w katalogach /etc/rc?.d/. W ten sposób możemy wyspecyfikować jakie usługi powinny być uruchamiane w określonych runlevelach. Teoretycznie wszystko można robić ręcznie (tzn. dodawać oraz kasować pliki z /etc/rc?.d/) - wtedy całkowite wyłączenie obsługi drukarki mogłoby wyglądać np. tak:
find /etc/rc?.d -iname '*lpd*' -ok rm {} \;
Jednak można zrobić to o wiele lepiej i szybciej skryptem /usr/sbin/update-rc.d. Tutaj do dyspozycji mamy kilka możliwości:

Dla osób chcących tworzyć własne pliki startowe przydatny może być /etc/init.d/skeleton, który zawiera szkielet dla skryptów znajdujących się w katalogu /etc/init.d/. Oczywiście pliki będące we wspomnianym katalogu mogą być dowolnej postaci. Możemy zatem utworzyć coś na kształt pliku /etc/rc.d/rc.local obecnego w innych dystrybucjach (wpisujemy tutaj polecenia które chcemy wykonywać pod koniec startu systemu). Tworzymy plik local w katalogu /etc/init.d - touch /etc/init.d/local. Ustawiamy prawa do wykonywania: chmod 755 /etc/init.d/local. Dodajemy link: update-rc.d local 30 2 . Teraz, zależnie od potrzeb, edytujemy /etc/init.d/local.
Przydatną umiejętnością jest 'ręczne zmienianie' runlevelu. Można tego dokonać programem init. Np.:
init 1 przejdzie do single-user mode, a init 6 zamknie system.

Więcej informacji można znaleźć w:

Gorąco dziękuję Mai Królikowskiej za przeglądnięcie tekstu oraz poprawki.

Michał Sajdak <xterm@linuxnews.pl>



Wyszukiwarka