Ogólnie mówiąc start systemu to wykonywanie w odpowiedniej kolejności plików znajdujących sięw katalogu /etc/rc.d. W tym artykule prześledzimy proces startu systemu od momentu włączenia komputera do momentu pojawienia się na ekranie zapytania o login.
POST
Komputer testuje się automatycznie za każdym razem gdy go włączymy. Proces ten nazywamy Power On Self Test w skrócie POST. Następnieprogram nazywany bootstrap loader, zawarty w ROM BIOS, poszukuje tzw. boot sector. Jest to pierwszy sektor dysku zawierający mały program pozwalający uruchomić system operacyjny. Bootstrap loader posiada listę urządzeń, z których może być ładowany system operacyjny. W nowszych systemach komputerowych prócz dysków twardych i dyskietek system może być załadowany z CD-ROMu a nawet urządzeń USB (Universal Serial Bus).
Jeśli bootstrap loader znajdzie boot sector to jego zawartość ładowana jestdo pamięci i uruchamiana.W systemie Linux programem takim z reguły jest LILO ( LInux LOader ) a w zasadzie program ładujący pierwszego etapu ( ang. first stage boot loader ). Jego jedynym zadaniem jest załadowanie programu ładującego drugiego etapu (ang. second stage boot loader). To właśnie on wyświetla nam zapytanie boot: lubmenu pozwalające nam na wybranie systemu operacyjnego - w zależności od tego jak skonfigurowaliśmy LILO w pliku /etc/lilo.conf.
init
Po wybraniu systemu operacyjnego LILO ładuje jądro (kernel). Jądro wykrywa (lub przynajmniej próbuje) sprzęt jaki mamy w komputerze i stara się załadować dla niego najodpowiedniejsze sterowniki. Następnie jądro uruchamia proces init(8). Jest to pierwszy programuruchamiany w systemie. Wszystkie inneprogramy są tzw. procesami potomnymi.
Zaraz po uruchomieniu proces initczyta plik konfiguracyjny /etc/inittab. Informacje w nim zawarte określają jakie skrypty startoweuruchomić i w jakiej kolejności.
Zanim zapoznamy się z przykładowym plikiem /etc/inittab wyjaśnimy pojęcie runlevel.
Runlevel jest to stan w jakim znajduje się,lub do którego przechodzi system. W Slackware istnieje 6 stanów runlevel:
0 = halt - zatrzymanie systemu
1 = single user mode - tryb jednego użytkownika
2 = unused (but configured the same as runlevel 3) - nie używany ale skonfigurowany jak runlevel 3
3 = multiuser mode (default Slackware runlevel) - tryb wielu użytkowników
4 = X11 with KDM/GDM/XDM (session managers) - tryb X Windows
5 = unused (but configured the same as runlevel 3) - nie używany ale skonfigurowany jak runlevel 3
6 = reboot - ponowne uruchomienie
Slackware domyślnie uruchamia się do runlevel 3 - tryb multiuser. Gdy wyłączamy lub ponownie uruchamiamy komputer (komendą reboot lub shutdown) to przechodzimy odpowiednio do runlevel 0 lub 6.
/etc/inittab.
Plik /etc/inittab to jak większość plików konfiguracyjnych w Linuksie plik tekstowy o bardzo prostej składni.
# inittab This file describes how the INIT process should set up
# the system in a certain run-level.
#
# Version: @(#)inittab 2.04 17/05/93 MvS
# 2.10 02/10/95 PV
# 3.00 02/06/1999 PV
# 4.00 04/10/2002 PV
#
# Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
# Modified by: Patrick J. Volkerding, <volkerdi@slackware.com>
#
# These are the default runlevels in Slackware:
# 0 = halt
# 1 = single user mode
# 2 = unused (but configured the same as runlevel 3)
# 3 = multiuser mode (default Slackware runlevel)
# 4 = X11 with KDM/GDM/XDM (session managers)
# 5 = unused (but configured the same as runlevel 3)
# 6 = reboot
# Default runlevel. (Do not set to 0 or 6)
id:3:initdefault:
# System initialization (runs when system boots).
si:S:sysinit:/etc/rc.d/rc.S #A# Skrypt uruchamiany jako pierwszy po załadowaniu programu init
# Script to run when going single user (runlevel 1).
su:1S:wait:/etc/rc.d/rc.K
# Script to run when going multi user.
rc:2345:wait:/etc/rc.d/rc.M
# What to do at the "Three Finger Salute".
ca::ctrlaltdel:/sbin/shutdown -t5 -r now #A# sposób reakcji na wcisniecie [ctrl]+[alt]+[del]
# Runlevel 0 halts the system.
l0:0:wait:/etc/rc.d/rc.0
# Runlevel 6 reboots the system.
l6:6:wait:/etc/rc.d/rc.6
# What to do when power fails.
pf::powerfail:/sbin/genpowerfail start
# If power is back, cancel the running shutdown.
pg::powerokwait:/sbin/genpowerfail stop
#A# Konsole
# These are the standard console login getties in multiuser mode:
c1:1235:respawn:/sbin/agetty 38400 tty1 linux
c2:1235:respawn:/sbin/agetty 38400 tty2 linux
c3:1235:respawn:/sbin/agetty 38400 tty3 linux
c4:1235:respawn:/sbin/agetty 38400 tty4 linux
c5:1235:respawn:/sbin/agetty 38400 tty5 linux
c6:12345:respawn:/sbin/agetty 38400 tty6 linux
# Local serial lines:
#s1:12345:respawn:/sbin/agetty -L ttyS0 9600 vt100
#s2:12345:respawn:/sbin/agetty -L ttyS1 9600 vt100
# Dialup lines:
#d1:12345:respawn:/sbin/agetty -mt60 38400,19200,9600,2400,1200 ttyS0 vt100
#d2:12345:respawn:/sbin/agetty -mt60 38400,19200,9600,2400,1200 ttyS1 vt100
#A# X Windows runlevel
# Runlevel 4 used to be for an X window only system, until we discovered
# that it throws init into a loop that keeps your load avg at least 1 all
# the time. Thus, there is now one getty opened on tty6. Hopefully no one
# will notice. ;^)
# It might not be bad to have one text console anyway, in case something
# happens to X.
x1:4:wait:/etc/rc.d/rc.4
# End of /etc/inittab
Wszystkie pozycje w tym pliku mająformę:
ID:runlevel:akcja:proces+opcjeID
jest to unikalna sekwencja dwóch znaków identyfikującawpis w pliku.
runlevel
numer lub numery runlevel przy którychinit uruchamia dany proces.
akcja
- boot - proces zostanie uruchomiony przy starcie systemu. Pole określające runlevel zostanie zignorowane.
- bootwait - jak powyżej z tym że proces init poczeka aż zakończy się wykonywanie programu podanego w części proces.
- initdefault - ustawia domyślny runlevel.
- kbrequest - proces oznaczony tą akcją zostanie uruchomiony gdy zostanie naciśnięta odpowiednie kombinacja klawiszy. Po szczegóły konfiguracji tej akcji odsyłam do manuala inittab and kbd.
- off - nie robi nic.
- once - proces zostanie uruchomiony tylko raz przy przechodzeniu do danego runlevel.
- ondemand - proces oznaczony taką akcją zostanie uruchomiony przy przechodzeniu do tzw. ondemand runlevel, które oznaczone są 'a', 'b', 'c'. Przy przechodzeniu do tych runlevel nie następuje zmiana obecnego runlevel.
- powerfail - to samo co powerwait z tym że init nie będzie czekać na zakończenie procesu.
- powerfailnow - proces zostanie uruchomiony gdy init otrzyma sygnał, że bateria UPS jest na wyczerpaniu.
- powerokwait - proces zostanie uruchomiony gdy init otrzyma sygnał SIGPWR i istnieje plik /etc/powerstatus zawierający słowo OK. Znaczy to, że zasilanie wróciło ponownie.
- powerwait - proces zostanie uruchomiony gdy init otrzyma sygnał SIGPWR, wskazujący na problemy z zasilaniem. Init poczeka na zakończenie procesu zanim podejmie jakąkolwiek inna akcje.
- respawn - po zakończeniu programu uruchamiany jest on po raz kolejny. Wykorzystywane jest to np. by jeszcze raz uruchomić proces agetty - tekst w ramce poniżej.
- sysinit - uruchamiane tylko podczas startu systemu.
proces
skrypt lub program, który należy uruchomić.
Tip: |
agetty to program pozwalający zalogować się przez modem, terminal wirtualny lub terminal tekstowy. Gdy podamy nazwę użytkownika agetty przekazuje kontrole do programu login, który pyta nas o hasło oraz przydziela nam powłokę (np. bash). Więcej informacji, z którymipowinieneś się zapoznać znajduje się w manualu. |
Pole runlevel może jak już wspomniałem zawierać kilka stanów runlevel np.:
oznacza, że skrypt /etc/rc.d/rc.M zostanie uruchomiony gdy system będzie przechodził do jednego z czterech runlevel 2, 3, 4, 5.
Katalog rc.d
Mając powyższe informacje jesteśmy w stanie prześledzić start systemu. Poniżej przedstawiam diagram w jakiej kolejności uruchamiane są skrypty startowe przy przechodzeniu systemu do runlevel 3. Jest to tylko poglądowy diagram (nie wszystkie uruchamiane pliki zostałyuwzględnione). Wpisy zaczynające się do '#'to skrypty, które domyślnie nie są uruchamiane, nazwy w nawiasach to pliki które wykorzystywane są wewnątrz skryptu. Niektóre ze skryptów uruchamiane są tylko gdy zajdą odpowiednie warunki - by dowiedzieć się więcej przeglądnij zawartość interesujących cię plików konfiguracyjnych.
Skrypty startowe
/etc/rc.d/rc.S
Skrypt ten zawsze uruchamiany jest jako pierwszy. Zawarte w nim polecania przygotowują system do prawidłowej pracy. Włączany jest swap, sprawdzane jest czy system został prawidłowo zamknięty a jeśli nie to przeprowadzane jest sprawdzanie dysków... itd.
Jak widać na diagramie z tego pliku wywoływany jest również skrypt /etc/rc.d/rc.modules oraz /etc/rc.d/rc.serial.
/etc/rc.d/rc.modules
Plik, w którym konfigurujemy jakie moduły jądra chcemy załadować przy starcie. Moduły jądra są jak sterowniki urządzeń. Warto przeglądnąć ten plik.
/etc/rc.d/rc.serial
Konfiguracja portów szeregowych.
/etc/rc.d/rc.M
Skrypt uruchamiany podczas przechodzenia do trybu "multi user" (runlevel 3). Z jego wnętrza uruchamiana jest przeważająca ilość skryptów. Jeśli chceszzaznajomić się dokładnie ze startem systemu powinieneś wnikliwie przeanalizować ten plik.
/etc/rc.d/rc.inet1
Konfiguracja i "podnoszenie" interfejsów sieciowych. Skrypt korzysta w tym celu z pliku konfiguracyjnego /etc/rc.d/rc.inet1.conf.
/etc/rc.d/rc.hotplug
Uruchamianie urządzeń hotplug (USB, PCI).
/etc/rc.d/rc.inet2
Startowanie usług sieciowych (http, ftp, ssh, nfs ...).
Po wykonaniu skryptu /etc/rc.d/rc.inet2 startują kolejne usługi sieciowe oraz inne programy potrzebne do prawidłowego działania systemu. W celu dogłębnego poznania startu systemu powinieneś przeglądnąć powyższe pliki oraz zapoznać się z komendami / poleceniami użytymi w każdym z nich.
Z własnego doświadczenia wiem że jest to również bardzo dobry sposób na przyswojenie języka skryptowego.
Źródło: http://slackware.asmonet.net