Linux documentation Project (CS) / Průvodce správce operačního systému Linux
Previous Content Next Up

 

7. Proces init

Uno on numero yksi

    Tato kapitola popisuje proces init, jenž je vždy prvním procesem uživatelské úrovně, který spouští jádro systému. Proces init má mnoho důležitých povinností. Spouští například program getty umožňující uživatelům přihlásit se do systému, implementuje úrovně běhu systému, stará se o osiřelé procesy atd. V této kapitole bude vysvětleno, jak se proces init konfiguruje a jak se zavádí různé úrovně běhu systému.

7.1 Proces init přichází první

    Proces init je jedním z programů, jenž jsou sice absolutně nezbytné k tomu, aby operační systém Linux fungoval, ale kterým obvykle nemusíte věnovat přílišnou pozornost. Součástí každé dobré distribuce systému je i předem nastavená konfigurace procesu init, která vyhovuje většině systémů. Správce pak už obvykle nemusí kolem procesu init nic dělat.

    O proces init většinou "zavadíte" jenom pokud připojujete nové sériové terminály, modemy pro příchozí volání, tzv. "dial-in" (nikoliv tedy modemy, pomocí kterých se budete připojovat do jiných systému, tzv. "dial-out") a když potřebujete změnit implicitní úroveň běhu systému.

    Když se zavede jádro systému (načte se do paměti, spustí se, inicializuje ovladače zařízení, datové struktury atd.), ukončí svou roli v proceduře zavádění operačního systému tím, že spustí první program uživatelské úrovně - proces init. Takže program init je vždy prvním spuštěným procesem, má tedy vždy číslo procesu 1.

    Jádro systému hledá (z historických důvodů) proces init na několika místech. Jeho správné umístnění v systému Linux je /sbin/init. Nenajde-li jádro program init, pokusí se spustit program /bin/sh a pokud neuspěje, skončí neúspěšně i celá procedura startu systému.

    Když proces init startuje, ukončí se proces zavedení systému tím, že se provede několik administrativních úkolů, například kontrola souborových systémů, "úklid" v adresáři /tmp, start obsluhy různých služeb a spuštění procesu getty pro každý terminál nebo virtuální konzolu, prostřednictvím nichž se uživatelé mohou přihlašovat do systému atd. (viz kapitola 8).

    Po správném zavedení systému proces init po každém odhlášení uživatele restartuje procesy getty pro příslušný terminál. Umožní tím případné další přihlášení jiných uživatelů. Program init si také osvojuje všechny "osiřelé" procesy. Když některý z procesů spustí další proces (svého potomka) a později ukončí svou činnost dřív, než některý z potomků, sirotci se okamžitě stanou potomky procesu init. Adopce sirotků má význam především z různých technických důvodů, je ale dobré o tom vědět, protože je pak snadnější pochopit význam položek seznamu procesů a grafů hierarchického stromu běžících procesů.

    Správce systému má na výběr několik verzí programu init. Většina distribucí operačního systému Linux používá program sysvinit (autorem programu je Miquel van Smoorenburg), jehož předlohou je program init pro Unix System V. Unix verze BSD používá odlišný program init. Primárním rozdílem mezi uvedenými verzemi programů jsou úrovně běhu systému. Unix System V je implementuje, kdežto verze BSD nikoliv (alespoň pokud jde o jejich tradiční verze). Tento rozdíl není podstatný, a tak se podíváme pouze na program sysvinit.

7.2 Konfigurace procesu init pro spouštění programu getty - soubor /etc/inittab

    Když proces init startuje, načítá konfigurační soubor /etc/inittab. Když pak systém Linux běží, proces init tento konfigurační soubor opakovaně načítá pokaždé, když přijme signál HUP

Tato vlastnost umožňuje měnit konfiguraci programu init a zajistit, aby se takováto změna projevila i bez toho, že by bylo nutné znovu zavést systém.

    Soubor /etc/inittab je trochu složitějií. Začneme tedy s jednoduchým příkladem konfigurace řádku programu getty. Jednotlivé řádky souboru /etc/inittab sestávají ze čtyř polí oddělených dvojtečkou:

id:úrovně_běhu:akce:proces

Uvedené položky budou popsán níže. Soubor /etc/inittab může kromě řádkových záznamů obsahovat i prázdné řádky a ty, jež začínají znakem "#". Ty program init ignoruje.

Chcete-li spustit programu getty pro první virtuální terminál (/dev/tty1) ve všech běžných víceuživatelských úrovních běhu (2-5), vložte do souboru /etc/inittab tento řádek:

1:2345:respawn:/sbin/getty 9600 tty1

    První pole identifikuje řádek pro zařízení /dev/tty1. Druhá položka určuje, že proces uvedený v posledním poli lze spouštět na úrovni běhu systému číslo 2, 3, 4 a 5. Třetí pole znamená, že tento příkaz by měl být vždy opakovaně spuštěn poté, co se ukončí (aby se po odhlášení uživatele mohl přihlásit kdokoliv jiný). v posledním poli je příkaz, který spouští proces getty pro první virtuální terminál.

    Když budete potřebovat přidat do systému další terminály nebo modemové linky pro příchozí volání (dial-in), měli byste rozšířit soubor /etc/inittab o další řádky, vždy jeden pro každý terminál, resp. modemovou linku. Více informací najdete v manuálových stránkách init(8), inittab(5) a getty(8).

    Nespustí-li se úspěšně příkaz uvedený v souboru /etc/inittab a je-li v konfiguraci procesu init nastavený jeho restart (akce respawn), bude proces zabírat značnou část systémových zdrojů. Proces init totiž tento proces spustí, ten se neprovede úspěšně a ukončí se, init jej opakovaně spustí, proces se ukončí, init jej spustí, proces se ukončí a tak dál, až do nekonečna. Této situaci se předchází tím, že si proces init vede záznamy o tom, jak často se pokoušel určitý příkaz spustit. Je-li frekvence opakovaných pokusů o spuštění procesu příliš vysoká, init před dalším pokusem o provedení příkazu vyčká pět minut.

7.3 Úrovně běhu systému

    Úrovní běhu systému se rozumí určitý stav procesu init i celého systému. Tento stav určuje, které ze služeb se nabízí. Jednotlivé úrovně se rozlišují čísly, uvedenými v tabulce 7.1. Pokud jde o uživatelsky definované úrovně (2 až 5), neexistují obecně platná pravidla pro jejich používání. Někteří správci systémů pomocí těchto úrovní určují, které subsystémy se spustí, zdali například poběží X, jestli bude systém připojený k síti atd. Jiní dávají přednost inicializaci všech subsystémů na všech uživatelsky definovaných úrovních, popřípadě některé ze subsystémů spouští a zastavují samostatně bez toho, že by se měnily úrovně běhu systému.

    To proto, že počet úrovní je poměrně malý a řízení konfigurace takovýchto systémů pomocí jednotlivých uživatelsky definovaných úrovní běhu systému je tedy příliš hrubé. Správce systému se v této otázce musí rozhodnout sám, avšak nejjednodušší bude řídit se způsobem, jenž implementuje distribuce, ze které byl systém Linux instalován.

Čísla úrovní běhu

0 Zastavení systému.

1 Jednouživatelský režim (pro zvláštní úkoly, spojené s administrací systému).

2-5 Běžný provoz (uživatelsky definovaný).

6 Znovuzavedení systému.

Úrovně běhu systému se konfigurují v souboru /etc/inittab řádkem podobným tomuto:

l2:2:wait:/etc/init.d/rc 2

    v prvním poli je uvedeno libovolné návěstí, druhé pole znamená, že se tento záznam (řádek) uplatní při úrovni běhu systému číslo 2. Třetí položka (pole wait) říká procesu init, aby spustil příkaz uvedený ve čtvrtém poli jenom jednou, a to při startu dané úrovně běhu systému a pak vyčkal, než se příkaz provede. Samotný příkaz /etc/init.d/rc spustí všechny procesy a příkazy, které jsou potřebné pro spuštění a ukončení služeb, jimiž se implementuje úroveň běhu číslo 2.

    Všechnu "dřinu" spojenou s nastavováním určité úrovně běhu dělá samotný příkaz, uvedený ve čtvrtém poli záznamu. Spouští sadu služeb, které zatím neběží, a pozastaví obsluhu těch, které by na nové úrovni běhu již neměly být poskytovány. Záleží na konkrétní distribuci operačního systému Linux, který z příkazů bude v posledním políčku souboru /etc/inittab přesně uveden a které úrovně běhu budou v této konfiguraci implementovány.

Když proces init startuje, hledá ten řádek v souboru /etc/inittab, jenž specifikuje implicitní, obecnou úroveň běhu systému:

id:2:initdefault:

Proces init lze také požádat o to, aby se spustil v jiné než běžné úrovni běhu, a to tak, že předáte jádru systému argument příkazové řádky single nebo emergency.

Tím si v podstatě vyberete jednouživatelský režim (1. úroveň běhu systému), jenž je popsán v odstavci 7.5.

    Když už systém běží, lze změnit aktuální úroveň běhu příkazem telinit. V případě, že se úroveň běhu systému mění, proces init spouští ten příkaz v souboru /etc/inittab, jenž odpovídá nové úrovni běhu systému.

7.4 Zvláštní konfigurace v souboru /etc/inittab

    Soubor /etc/inittab má některé zvláštní rysy, jež umožňují procesu init reagovat i na některé zvláštní situace. Tyto speciální vlastnosti procesu init určují zvláštní klíčová slova ve třetím poli záznamu konfiguračního souboru. Několik příkladů:

Výše uvedený seznam klíčových slov není úplný. Další možnosti i podrobnosti týkající se těch, o kterých se zmiňujeme, uvádí manuálová stránka souboru inittab(5).

7.5 Zavádění systému v jednouživatelském režimu

    Důležitou úrovní běhu systému je tzv. jednouživatelský režim (úroveň běhu číslo 1), v němž může počítač používat pouze správce systému. V tomto režimu běží jenom minimum systémových služeb (včetně možnosti přihlášení do systému). Jednouživatelský režim je nutný pro některé úlohy spojené s údržbou systému.

    Například kontrola konzistence svazku /usr programem fsck vyžaduje, aby byla disková oblast se Souborovým systémem odpojená. Toho ale nelze dosáhnout, pokud nejsou ukončeny téměř všechny systémové služby.

    Běžící systém lze přepnout do jednouživatelského režimu příkazem telinit a požadavkem na přechod do úrovně běhu 1. Při zavádění systému lze do jednouživatelského režimu přejít zadáním parametru single nebo emergency na příkazové řádce jádra systému. Jádro předá parametry příkazové řádky procesu init. Program init podle tohoto parametru pozná, že nemá použít implicitní úroveň běhu. (Způsob, kterým se zadává parametr příkazové řádky jádra systému, je podmíněn způsobem, jakým se zavádí operační systém.)

    Někdy je potřeba zavést systém v jednouživatelském režimu například proto, aby bylo možné ručně spustit program fsck dřív, než se systém pokusí připojit poškozený systém souborů /usr, nebo se s ním pokusí jiným způsobem manipulovat. Jakékoliv aktivity na defektním svazku jej s největší pravděpodobností poškodí ještě více, proto by se měla kontrola programem fsck udělat co nejdřív.

    Zaváděcí skripty, které spouští proces init, automaticky přechází do jednouživatelského režimu pokaždé, když automatická kontrola programu fsck při zavádění systému neproběhne úspěšně. Pokouší se tak zabránit systému použít Souborový systém, jenž je poškozený natolik, že jej nelze automaticky opravit zmiňovaným programem fsck. Takovéto poškození svazku je relativně málo frekventované a jeho příčinou bude pravděpodobně mechanické poškození pevného disku, případně nějaká chyba v experimentální verzi jádra systému. Bude ale lepší, když budete jako správce systému připraven i na tuto situaci.

    Správně nakonfigurovaný systém se před spuštěním shellu v jednouživatelském režimu zeptá na přístupové heslo superuživatele. Je to důležité bezpečnostní opatření, protože jinak by bylo možné jednoduše zadat vhodný parametr příkazové řádky zavaděči systému LILO a dostat se tak k účtu a oprávněním superuživatele. (Takto nastavený systém se samozřejmě nezavede, když bude důsledkem defektů na systémovém svazku soubor /etc/passwd poškozený. Pro tento případ je dobré mít někde po ruce zaváděcí diskety.)

Previous Content Next Up