JustPaste.it

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 #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+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

  1. boot - proces zostanie uruchomiony przy starcie systemu. Pole określające runlevel zostanie zignorowane.
  2. bootwait - jak powyżej z tym że proces init poczeka aż zakończy się wykonywanie programu podanego w części proces.
  3. initdefault - ustawia domyślny runlevel.
  4. 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.
  5. off - nie robi nic.
  6. once - proces zostanie uruchomiony tylko raz przy przechodzeniu do danego runlevel.
  7. 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.
  8. powerfail - to samo co powerwait z tym że init nie będzie czekać na zakończenie procesu.
  9. powerfailnow - proces zostanie uruchomiony gdy init otrzyma sygnał, że bateria UPS jest na wyczerpaniu.
  10. 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.
  11. 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.
  12. 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.
  13. 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.

 

Źródło: http://slackware.asmonet.net