Start systemu - krok po kroku
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
# 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
# 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
# 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
# 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+opcje
ID
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.:
rc:2345:wait:/etc/rc.d/rc.M
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.
Diagram
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.