
Každý používateľ musí raz za čas vyriešiť nejaký problém a problémy sa omnoho lepšie riešia, keď aspoň približne viete ako to, čo používate, funguje. Cieľom tohto textu je poskytnúť informácie a tom, čo kde čo robí a s čím spolupracuje a umožniť tak lepšiu diagnostiku problému.
Bootloader
Linux (myslené jadro) neobsahuje tzv. zavádzač.. Na to je potrebná externá aplikácia, ktorá dokáže zaviesť operačný systém, napr. GRUB alebo LILO. Keďže všetky moderné distribúcie (okrem Slackware) používajú GRUB, budeme sa zaoberať tým, zatiaľ len verziou 1.
GRUB pracuje v istých etapách, po anglicky "stages".
Stage 1
Keď BIOS skontroluje všetko, čo má, predá riadenie kódu uloženému v MBR (Master Boot Record) zariadenia (disk, disketa, usb, ...), ktoré ma nastavené ako "First boot device". MBR označuje prvých 512 bajtov v tomto zariadení. Vzhľadom na nedostatok miesta kód v MBR len predá riadenie do stage1.5, ktorá opäť len zavedie stage2.
Keďže Windows po inštalácií prepisuje MBR, je dobré mať aktuálnu zálohu MBR. Najjednoduchšie je použiť príkaz dd a to nasledovne:
dd if=/dev/hdx of=zaloha.mbr bs=512 count=1
V súbore zaloha.mbr teraz máte zálohu. Po prepísaní MBR potom vrátite pôvodný stav nasledovne:
dd of=/dev/hdx if=zaloha.mbr bs=512 count=1
Pozor, MBR obsahuje aj tabuľku partícií! Pri každej zmene usporiadania disku si urobte novú zálohu. Ak ste to z nejakých príčin neurobili, nasledovaný príkaz vynechá obnovu tabuľky partícií a obnoví len bootloader.
dd of=/dev/hdx if=zaloha.mbr bs=446 count=1
Stage 2
V tejto etape GRUB nájde konfiguračný súbor (väčšinou /boot/grub/menu.lst) a na základe neho vytvorí tabuľku s výberom operačných systémov. Ak žiadny nenájde, tak zobrazí len príkazový riadok, z ktorého sa dá spustiť ľubovoľný systém a pracuje s rovnakými príkazmi ako konfiguračný súbor. Potom, čo užívateľ zvolí OS, ten sa zavedie tak, ako je uvedené v konfiguračnom súbore, resp. ako užívateľ určil v príkazovom riadku. Tu končí práca GRUB-u a riadenie už prevezme zvolený kernel (jadro).
Jadro
Aj bootovanie jadra sa dá rozdeliť do dvoch častí.
Načítanie
Jadro sa v prvom rade musí "rozbaliť", lebo je skomprimované (zlib, bzip2, lzma). Potom, čo sa rozbalí, obraz sa nahrá do pamäti a predá sa mu riadenie.
Ak ste sa pozreli do svojho konfiguračného súboru /boot/grub/menu.lst, zrejme ste zazreli aj riadok začínajúci initrd. Skratka označuje "Initial Ramdisk".
Initrd je akýsi základný root filesystem (súborový systém, ďalej ako fs), ktorý existuje len v pamäti. Takýto fs sa potom používa na zavedenie modulov potrebných na to, aby bol systém schopný naštartovať. Napr. povedzme, že máte IDE disk, ale ovládače na IDE máte zakompilované ako modul. Potom systém naštartujete len s pomocou initrd, ktorý bude obsahovať insmod a nevyhnutné knižnice a zavedie potrebný modul. Initrd sa nespúšťa hneď, zavedie sa do pamäti spolu z rozbaleným jadrom, kde čaká kým ho jadro spustí.
Štart
Potom, čo je rozbalené jadro nahraté v pamäti spolu z voliteľným ramdiskom kernel v prvom rade inicializuje všetky veci spojené s pamäťou a jej správou a deteguje CPU. To bola tá hardwarovo najzávislejšia časť. Potom nasledujú tie hardwarovo menej závislé veci a tých je naozaj mnoho (stačí sa pozrieť do zdrojových kódov ./init/main.c), preto vyberám len niektoré.
- analyzuje parametre, ktoré mu boli dané pri boote (v /boot/grub/menu.conf)
- inicializuje prerušenia používané na komunikáciu s hardware
- inicializuje plánovač procesov
- inicializuje VFS (virtual filesystem - rozhranie ku všetkým fs v systéme)
- ak je použitý initrd, pripojí ho ako rootfilesystem (/)
- inicializuje signály
- inicializuje súborový systém proc, ak je použitý
- inicializuje všetky ovládače
Práca jadra končí pri vytvorení procesu init (/sbin/init).
Init
Init je prvý spustený proces a má PID 1. Po spustení initu mu jadro predá všetko riadenie. Init je samozrejme proces ako každý iný, takže sa mu dajú posielať signály, teda sa dá aj zabiť. Chová sa podľa vopred určených pravidiel, ktoré mu nastavíme v konfiguračnom súbore /etc/inittab. Môže bežať v 7 úrovniach. V poradí od 0 do 6 sú to:
- Vypnutie systému,
- jednoužívateľský režim,
- 3 úroveň sa nepoužíva
- viac užívateľský režim
- 4 sa opäť nepoužíva
- režím X11 (grafický)
- reštartovnie systému.
Konfigurácia
Spomínaný súbor /etc/inittab určuje aká úroveň behu bude východzia a aké skripty sa majú spúšťať pri prechode do jednotlivých úrovní. Vyplatí sa poznať jeho formát aj keď je celkom intuitívny. Každý riadok v ňom má nasledujúci formát
id:úroveň behu:akcia:proces
id je jednoznačný identifikátor danej položky, do poľa úroveň behu môžeme za sebou napísať čísla úrovní, pre ktoré táto položka platí, akcia definuje, čo sa má robiť s procesom danom v poslednom poli. Akcií je mnoho (vyskúšajte man inittab).
Najpoužívanejšie sú:
- initdefault - definuje východziu úroveň behu
- sysinit - proces sa spúšťa vždy pri štarte systému, nie je potrebné definovať úroveň behu
- wait - proces sa spustí raz pri prechode danej úrovne a init počká, kým sa skončí
- respawn - proces sa spustí a znova bude spustený vždy, keď skončí
- once - proces sa spustí raz pri prechode do danej úrovne
Ak stále nerozumiete, o čo sa ide, nasledujúci príklad konfiguračného súboru vám to ozrejmí (jedná sa o defaultný súbor archlinuxu) Riadky začínajúce # sú komentáre.
# východzia úroveň behu 3 (Multiužívateľský režim)
id:3:initdefault:
# pri štarte spusti skript /etc/rc.sysinit
rc::sysinit:/etc/rc.sysinit
# pri prechode do úrovne 1 (môže sa označiť aj ako S - Single user mode) spusti /etc/rc.single a počkaj, kým skončí
rs:S1:wait:/etc/rc.single
# pri prechode do úrovne 2, 3, 4 alebo 5 spusti /etc/rc.multi a počkaj, kým # skončí
rm:2345:wait:/etc/rc.multi
# pri prechode do úrovne 0 (vypnutie systému) alebo 6 (reštart systému) spusť /etc/rc.shutdown a počkaj, kým skončí
rh:06:wait:/etc/rc.shutdown
# pri prechode do úrovne 1 spusti /sbin/sulogin -p
su:S:wait:/sbin/sulogin -p
# pri prechode do úrovní 2345 spusť /sbin/agetty -8 38400 tty* linux (alternative getty) a po jeho ukončení ho spusť znova
c1:2345:respawn:/sbin/agetty -8 38400 tty1 linux
c2:2345:respawn:/sbin/agetty -8 38400 tty2 linux
c3:2345:respawn:/sbin/agetty -8 38400 tty3 linux
c4:2345:respawn:/sbin/agetty -8 38400 tty4 linux
c5:2345:respawn:/sbin/agetty -8 38400 tty5 linux
c6:2345:respawn:/sbin/agetty -8 38400 tty6 linux
# pri stlačení ctraltdel pockaj, restartuj pocitac
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
# Pri prechode do úrovne 5 (X11) spusť vybraného login managera a po jeho ukončení ho spusť znova
#x:5:respawn:/usr/sbin/gdm -nodaemon
#x:5:respawn:/usr/bin/kdm -nodaemon
#x:5:respawn:/usr/bin/slim >& /dev/null
Úrovne init sa dajú prepínať aj za behu. Použijeme na to program telinit (v skutočnosti je to len link na init). Telinit berie jeden povinný argument a to úroveň behu, do ktorej má init prejsť a voliteľný argument -t, ktorým nastavíme počet sekúnd, za ktoré sa má akcia vykonať. Napr. počkáme 5 sekúnd a prejdeme do úrovne 0. Pozor! Toto vám vypne systém :).
telinit -t 5 0
Takto priamo sa systém vypína málokedy, väčšinou sa používa program shutdown. Výsledok je ale viac menej rovnaký. Pri prechode z úrovne do úrovne init najprv spustí skript definovaný v /etc/inittab (alebo nič) a neukončeným procesom pošle signál SIGTERM (požiada ich, aby sa ukončili). Neukončené procesy potom zabije signálom SIGKILL.

Trojfázový štart OS Linux.
Záver
Sme na konci. Dúfam, že tieto informácie vám budú užitočné a zas o niečo lepšie poznáte svoj systém. Články "Ako to funguje" sa budem snažiť písať častejšie a pridať sa môže ktokoľvek, ide o to, ja tebe, ty mne. Dovtedy však ostávam s pozdravom.







