Od BIOS-u po init

Keď štartuje systém, tak prvý kód, ktorý sa dostáva k slovu je boot loader - zavádzač. V angličtine sa mu za starých čias hovorilo aj bootstrap loader. To preto, že postupne sa dostávajú k slovu zložitejšie a zložitejšie moduly. Postupnosť je takáto.

  1. BIOS nahrá do pamäti prvú časť zavádzača, ktorá sa nachádza v MBR (Master Boot Record) - prvých 512 bytoch na disku
  2. Prvá časť zavádzača zvládne akurát tak nahrať do pamäti zvyšok zavádzača. Týmto zavádzačom môže byť lilo, grub, boot-manažér MS Windows, alebo niektorý z mnohých iných programov.
  3. Keď už je zavádzač kompletný, môže do pamäti zaviesť jadro. Bootovacie manažéry tiež často ponúkajú možnosť vybrať jadro, ktoré má byť nahraté, z niekoľkých možností.
  4. Jadro sa nahráva do pamäti, prebieha detekcia HW, rozbiehajú sa jednotlivé ovládače - tie, ktoré sú zakompilované priamo do jadra. Moduly budú musieť ešte chvíľu počkať.
  5. Na funkčnom systéme je nahraný ovládač pre disk a súborový systém hlavného diskového zväzku (tak sa učene hovorí partícii na ktorej sídli hlavný adresár /). Po rozbehnutí všetkých ovládačov, jadro nájde na disku program init (/sbin/init), nahrá ho do pamäte a spustí.

Init

Každý program, ktorý bol nahraný do pamäti sa stáva procesom a dostane svoje číslo. Pretože init je prvý, dostane číslo 1. Program init, sa pozrie do súboru /etc/inittab. Tento súbor definuje, ktoré ďalšie programy treba pospúšťať a pospúšťa ich. Mnohé z nich sú skripty, napríklad tie, ktoré sú zodpovedné za pripojenie ďalších súborových systémov, nahrávanie modulov, nakonfigurovanie siete, odštartovanie sieťových služieb a podobne. Unix-u podobné systémy majú viacero takzvaných úrovní behu (runlevel). Sú číslované a pre každú úroveň súbor /etc/inittab definuje, ktoré skripty budú spustené.

Moje skúsenosti s inými distribúciami sú vlastne mizivé. To čo používam už asi od roku 1996 je Slackware. Vždy, keď sa v nejakom webovom fóre rozbehne debata o tom, akú distribúciu odporučiť nováčikovi, tak Slackware je vždy označovaný za distribúciu pre pokročilých či masochistov. Nesúhlasím s tým. Možno je to tým, že ju používam už tak dlho. Každopádne je to distribúcia jednoduchá a priamočiara. Má svoju logiku. Popis zavádzania systému uvedený vyššie je, podľa môjho presvedčenia, nezávislý od distribúcie. Vlastne myslím, že je platný aj pre iné Unixu-podobné systémy. Pridáme teraz ešte pár slov k tomu, čo sa deje na Slackware-i. (To ale neznamená, že tu nenájdete zopár informácií, ktoré sa vám zídu aj, pri iných distribúciách.)

Init a úrovne behu

Ako som už spomínal, program init spúšťa skripty, ktorých mená nájde v /etc/inittab. V Slackware-i to sú skripty z adresára /etc/rc.d. Význam jednotlivých úrovní behu je závislý od distribúcie. Slackware definuje

# 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

Ale napr. Redhat používa úroveň 5 pre X11.

Init a štartovacie skripty

Pre úroveň 3 sa spúšťa skript /etc/rc.d/rc.M. Písmeno M je od slova multiuser - mnohoužívateľský. Tento skript spúšťa ďalšie skripty.

V starších verziách Slackware-u, sa napr. konfigurácia IP adries či smerovania robila priamo v /etc/rc.d/rc.inet1. Vo verzii 9.1 sa už prejavuje snaha o napodobnenie systému používaného v iných distribúciách, BSD či iných Unix-u podobných systémoch. Bol vytvorený súbor /etc/rc.d/rc.inet1.conf, do ktorého boli vybraté časti rc.inet1, v ktorých sa nastavujú premenné s IP adresou sieťových kariet či gateway. To znamená, že administrátor by mal zasahovať len do /etc/rc.d/rc.inet1.conf. Podobne rc.inet2 prešiel zmenou. V minulosti priamo štartoval apache, NFS služby, mailový server či DNS. V posledných verziách spúšťa samostatné skripty. Napr. pre NFS server bol vytvorený /etc/rc.d/rc.nfsd, pre web server súbor /etc/rc.d/rc.httpd, pre ssh server súbor /etc/rc.d/rc.sshd a tak ďalej. Tieto skripty umožňujú spúšťať, zastavovať či reštartovať jednotlivé služby podobne ako v iných systémoch: /etc/rc.d/rc.httpd restart zastaví a opätovne naštartuje webový server.

Slackware a iné distribúcie versus štartovacie skripty

Niektoré distribúcie používajú termín service - služba. Slackware je distribúcia, pri ktorej je vhodné vedieť, čo sa deje pod pokrievkou. Mnohé iné systémy ponúkajú nadstavby, ktoré skrývajú fungovanie týchto štartovacích skriptov v snahe uľahčiť užívateľom či menej zdatným administrátorom správu systému. Záver je taký, že iné distribúcie prichádzajú so zložitejším systémom štartovania, väčším počtom menej zrozumiteľných skriptov, ale skrývajú ich pod nástrojmi ako je YaST či Drakconf. Slackware má systém štartovania jednoduchý. Hoci sa štartovacie skripty štiepia a ich počet v posledných verziách narastá, stále sú jednoduché a prehľadné a zaobídu sa bez nadstavbových programov.

Getty

Vrátim sa ešte k tomu, čo sa spúšťa z /etc/inittab. Nájdete tam ešte položky zodpovedajúce programom z rodiny getty (v Slackware-i je to agetty). Tento program dostane medzi parametrami meno terminálu a prihlasovacieho programu. Meno terminálu je často tty1, tty2, tty3 a podobne. Linux (ale napríklad aj SCO Unix) používa takzvané virtuálne terminály. Prepínať sa dá medzi nimi stlačením kombinácie kláves Alt+Fn, kde n je poradové číslo. Teda Alt+F1 prepne na tty1, Alt+F2 prepne na tty2. Keď sa pozriete do /etc/inittab. Zistíte, že pri štarte sa spúšťa niekoľko procesov getty a tiež zistíte, na ktorých virtuálnych termináloch sú spustené. Tiež môžete povedať, že ich chcete viac, alebo naopak, nejaké nechcete pretože používate grafické prostredie.

Login

Ako som už spomínal, ďalším parametrom programu getty je prihlasovací program - login. Je to program, ktorý vypisuje dobre známu výzvu:

ras login: rastos
Password:
Linux 2.6.4.
Last login: Sat Mar 27 16:45:27 +0000 2004 on pts/3 from ras.rastos.org.
You have mail.

/home/rastos>

Po zadaní mena si program login vypýta heslo a tieto údaje porovná s údajmi v /etc/passwd. (Ok, nie celkom, moderné distribúcie používajú /etc/shadow a prípadne PAM (Pluggable Authentication Modules), ale to je mimo rozsah tohoto dokumentu.) Ak sú správne, spustí prihlasovací shell daného užívateľa.

Shell

Shell je program, ktorému getty odovzdá vstup z terminálu, aby mohol preberať príkazy od vás. Ale prv než vás začne shell počúvať, najprv vykoná inicializačné skripty. Najprv tie, ktoré sa nachádzajú v /etc. Tam sa robia nastavenie, ktoré ovplyvňujú všetkých užívateľov. Potom sa vykonajú nastavenia špecifické pre užívateľa - tie sa nachádzajú v jeho domovskom adresári. Mená štartovacích skriptov sú rôzne pre pre rôzne shelly. Najčastejšie používané shell-y sú asi bash (Väčšina systémových skriptov je písaná v bash-i, preto sa ho oplatí poznať.) a csh/tcsh. Pre csh inicializačné skripty majú mená /etc/csh.cshrc, /etc/csh.login, ~/.cshrc a ~/.login. Pre bash je to spravidla /etc/profile, ~/.bash_profile a ~/.bashrc (ten posledný môže mať zmenené meno nastavením premennej prostredia BASH_ENV)

Kde ešte stretneme getty?

Keď už vieme, ako funguje proces prihlásenia, oplatí sa spomenúť ešte jednu vec. Okrem virtuálnych terminálov môže getty obsluhovať aj terminály pripájané cez sériové porty. Vlastne to bola pôvodná úloha programu getty. Preto môže dostať medzi parametrami napríklad aj prenosovú rýchlosť terminálu a iné parametre. V súčasnosti sa už s takýmito terminálmi často nestretnete, ale stretnúť sa môžete s modemom. Áno; stačí mať getty pustené na porte s pripojeným modemom a tento modem môže fungovať ako terminál. Ok. Možno ani to sa vám možno nezdá také časté. Ale keď namiesto programu login použijete pppd, dostanete PPP server. Celkom podobný tomu, na aký sa pripájate k svojmu ISP.

Grafické prostredie

Posledný skript, ktorý spomeniem je ten, ktorý spúšťa grafické prostredie. V drvivej väčšine prípadov je to X Window System - implementovaný projektom XFree86. X Window Systém je založený na rozdelení grafickej funkcionality medzi X server a klientov. X server je to, čo spravuje grafickú kartu a dostáva požiadavky o vykreslenie okien a prvkov v nich (angl. widget) od klientov. Komunikácia medzi serverom a klientami funguje pomocou sieťových volaní, následkom čoho môže byť server na inom stroji ako klienti.

Grafické prostredie možno v princípe spustiť dvoma spôsobmi. Buď systém naštartuje do znakového prostredia a po prihlásení spustíte program startx. Startx je skript, ktorý v konečnom dôsledku spustí program xinit. Druhá varianta, ako sa dostať do grafického prostredia je, keď init naštartuje priamo do grafického prostredia a ako prvé spustí takzvaný display manažér. Existuje viacero druhov takých manažérov. XFree86 prichádza s X Display Manager (XDM), ak máte nainštalované prostredie KDE môžete používať KDE Display Manager (kdm), ak máte nainštalované prostredie GNOME môžete používať GNOME Display Manager (gdm). Display manažér plní funkciu prihlasovacieho programu - login. Vypýta si meno a heslo a po ich overení spustí - xinit. Xinit je skript, ktorý má svoj inicializačný súbor /usr/X11R6/lib/X11/xinit/xinitrc resp. ~/.xinitrc. Tam sa rozhodne o spustení správcu okien - Window Manger. Správca okien spravuje okná. Hovorí, ako bude vyzerať okraj okna, ako budú okná reagovať na kombinácie kláves, je zodpovedný za operácie ako je minimalizovanie, maximalizovanie, presun okien. Preto tieto operácie fungujú nezávisle od toho či funguje aplikácia (hoci, tá tiež môže dostávať o týchto operáciách správy a reagovať na ne). Existuje mnoho druhov správcov okien. Výber zvyčajne závisí na náročnosti daného manažéra na hardware a rôznych drobnostiach v správaní.