Linux E X P R E S

Facebook

Jak startuje systém?

Znáte to - přijdete domů, zapnete počítač a jdete si pro něco na zub, abyste zabili čas, "než to naběhne". V následujícím článku se na počítač podíváme právě v tu dobu, kterou trávíte blouděním po lednici či spíži.


Tabulka runlevelů
0 vypnutí systému
1 jednouživatelský režim (všechny služby vypnuté, k dispozici pouze jedna virtuální konzole pracující pod superuživatelem
2 normální režim bez grafického prostředí a síťových služeb
3 normální režim bez grafického prostředí
4 rezervován - například pro vytvoření vlastního runlevelu
5 normální režim
6 restart systému

Virtuální konzole, vc, se přepínají pomocí [Alt+F1] až [Alt+F12]. Většinou na konzolích 1-6 běží procesy getty a na čísle 7 grafický správce přihlášení. Pro přepnutí z grafického prostředí je potřebné přidržet také [Ctrl] - například [Ctrl+Alt+F1].

Tabulka distribucí
distribuce Red Hat Ubuntu Slackware Gentoo
init styl System V System V BSD System V
init skript /etc/rc.d/rc.sysinit /etc/init.d/rcS /etc/rc.d/rc.S /sbin/rc
konfigurace /etc/sysconfig /etc/default /etc/rc.d /etc/conf.d

Na počátku byl a je BIOS

Po zmáčknutí vypínače se do počítače vžene elektrický proud a začne pracovat. Co musí udělat nejdřív, je otestovat, zda je vůbec v provozuschopném stavu. Toto se nazývá Power on self-test a většinou se dá částečně přeskočit - v BIOSu se zapne volba quick boot, případně vypne volba power on self-test, podle typu použitého BIOSu. Nejdůležitější je test operační paměti, grafické karty a procesoru. Jestli máme v základní desce alespoň tento hardware (a je v pořádku), je počítač funkční a teoreticky se dá použít (na obrazovce se objeví buď logo výrobce základní desky nebo textová obrazovka s testem paměti).

Dále pak následuje test pevných disků a detekce ostatních ATA/SATA/USB a podobných zařízení. Jestli vše proběhne bezchybně, spustí se z ROM paměti BIOSu zaváděcí program zvaný bootstrap loader, který podle našeho nastavení prohledá nejdřív boot sektor CD, diskety či pevného disku nebo jiných zařízení. Boot sektor je prvním sektorem disku, kde by měl být umístěn malý program (o velikosti 512 bajtů) - zavaděč systému (boot loader), který dokáže spustit operační systém. V některých případech spustí složitější zavaděč (např. GRUB). Boot sektory jsou značeny hexadecimálním "magickým" číslem 0XAA55 (43603 v desítkové soustavě) na pozici 0X1FE (510). Jedná se tedy o poslední dva bajty boot sektoru. Podle toho se dá poznat, zda-li se jedná o bootovací médium či nikoliv.

BIOS může odmítnout spustit počítač bez připojené klávesnice - v některých případech je toto chování nežádoucí (např. když máme pro uživatele k dispozici pouze touchscreen). Naštěstí se dá v nastavení BIOSu vypnout pomocí volby No keyboard error nebo podobné.

Zavaděč systému (LILO, GRUB)

Někteří méně šťastní uživatelé si užili problémů se systémem, který se nedá nabootovat - například když starší verze zavaděče LILO nedokázaly spustit systém, když byl soubor s jádrem nahrán za hranicí 8 GB. Tento konkrétní problém se už (naštěstí) v novějších verzích neobjevuje. Co se však může objevit kdykoliv, jsou případné problémy po přerozdělení disku. Onen 512bajtový program toho totiž opravdu mnoho neumí a v současné době není sám o sobě dostatečný pro spuštění Linuxu. (Jaderná řada 2.6 přímý boot vůbec nepodporuje.)

Možná se vám už někdy stalo, že místo zobrazení menu pro výběr operačních systémů se začne obrazovka plnit vzorkem 1010 a nic jiného už počítač neudělá. Tato chyba znamená, že stage1 zavaděče nedokáže najít stage2 a pokouší se spustit kód z úplně jiného místa na disku. Řešením je použít záchranné CD/DVD a přeinstalovat zavaděč.

Další chybou při startu, která je nepříjemná, je kernel panic - no init found. Může mít několik příčin, možná nejčastější je poškození root oddílu na disku, případně chybné zadání zařízení, ze kterého má systém startovat (parametr jádra root= - např. root=/dev/hda1). Také se může stát, že soubor /sbin/init skutečně neexistuje.

Zavaděče systému jako LILO a GRUB se proto skládají ze dvou nebo více stupňů (stage - u GRUBu totiž kromě stage1 a stage2 existuje také stage1_5), ze kterých každý toho umí o trochu víc. Program v boot sektoru je stage1, který pouze ví, kde je na disku uložen stage2 zavaděče a ten spustí. Proto se po přerozdělení disku může stát, že stage2 už není tam, kde byl předtím a v případě, že znovu nenainstalujeme zavaděč na disk, systém se při příštím restartu už nespustí. stage1 totiž není dostatečně chytrý, aby věděl, co je souborový systém, o jaký souborový systém se jedná, jak se v něm ukládají soubory atd. (ostatně, po 512bajtovém programu nemůžeme chtít zázraky). Proto i když je soubor se stage2 uložen například ve stejném adresáři jako předtím, ale fyzicky je na disku na jiném místě, stage1 jej už nenajde. Proto po jakémkoliv přerozdělení disku neuškodí znovu nainstalovat zavaděč systému - ať se už jedná o LILO či GRUB.

GRUB má výbornou možnost zasáhnout do konfigurace i přímo při startu systému, bez nutnosti měnit konfigurační soubor. Pomocí [e] můžeme editovat příkazový řádek pro námi zvolenou položku z menu, nebo pomocí [c] zobrazíme prázdný příkazový řádek, ze kterého můžeme nabootovat (téměř) cokoliv, co se nám právě zamane.

Nebudu zde podrobně srovnávat LILO a GRUB ani rozhodovat, který je lepší. Oba mají své výhody a nevýhody - například na domácím počítači používám GRUB (výhodou je zde možnost ručně upravovat parametry jádra při spouštění, podpora práce se souborovými systémy), na serveru používám zas LILO (jednoduchá instalace na RAID-1, možnost jednorázově zadat příkaz pro příští boot - v případě nefunkčního jádra se po tvrdém restartu spustí jádro staré). V obou případech zavaděč systému nahraje jádro do paměti a spustí ho.

Hlášky typu kernel panic - /dev/console does not exist se mohou vyskytnout v případě, že používáme statický adresář /dev, případně používáme špatně vytvořené initrd. Jádro ke svému spuštění potřebuje správně vytvořené speciální soubory zařízení: /dev/console, /dev/null, /dev/ram, /dev/systty, /dev/tty1 .

Linuxové jádro

Jádro Linuxu (přesněji řečeno "jádro GNU/Linuxu", neboť samo jádro se nazývá "Linux", název systému v časopise zkracujeme, pozn. red.) je komprimované, proto se musí před samotným spuštěním ještě dekomprimovat. Vzhledem k tomu, že samotné jádro se spustí velmi rychle, nestačíme přečíst všechno, co píše na obrazovku (nebo máme dokonce výpisy vypnuté parametrem quiet). Dobrým pomocníkem je program dmesg, kterým si poté, co systém nastartuje, můžeme nechat vypsat všechny zprávy jádra od okamžiku jeho spuštění. Vzhledem k množství textu je vhodné použít ještě stránkovač: dmesg | less a usnadnit si tak čtení.

Patří se také připomenout, že název "Linux" označuje pouze samotné jádro systému. Když mluvíme o systému jako celku, včetně knihoven a programů, je mnohem správnější toto označovat pojmem "GNU/Linux". Je tomu tak z toho důvodu, že Linus Torvalds je strůjcem samotného jádra, ale naprostá většina programů a knihoven, které jsou pod tímto jádrem spouštěny jsou z projektu GNU (GNU's Not Unix). Redakce zkracuje "GNU/Linux" na "Linux" z praktických důvodů. Více informací na toto téma naleznete na www.gnu.org.

Jádro (kernel) má několik hlavních úkolů. Jednak zprostředkovává hardware počítače programům, které pak nemusí přesně vědět, o jaký typ např. zvukové karty se jedná. Jádro poskytuje uniformní rozhraní, v případě zvuku je to například ALSA.

Při zadávání parametrů jádru nezapomeňte na parametr ro! Ten jádru říká, aby připojilo kořenový systém souborů pouze pro čtení, což je naprosto nutné pro jeho kontrolu pomocí programu fsck.

Druhým úkolem je zabezpečovat spouštění více programů najednou, tzv. multitasking. Protože procesor (v našem případě bereme jednoprocesorový počítač - v dnešní době je možná dobré dodat ještě i jednojádrový) dokáže vykonávat současně pouze jednu instrukci (když nebereme ohled na technologie jako HyperThreading v určitých případech), musí se jádro starat o přepínaní právě běžícího procesu a celkově přidělování procesorového času aplikacím podle jejich priority. Ve skutečnosti proto nikdy neběží víc než jeden program současně, ale protože rychlost lidské reakce se s rychlostí procesoru nemůže ani srovnávat, připadá nám, jakoby se dalo používat více aplikací najednou.

Dále se jádro stará o správu paměti - zejména povolování a kontrolu alokace a přístupu do paměti, ale také sleduje, které stránky v paměti se používají a které ne - nepoužívané stránky se v případě potřeby dají přesunout do odkládacího prostoru (swapu), čím se uvolní fyzická paměť pro jiné programy, které ji potřebují. V horších případech (nedostatek paměti) se přesouvají do swapu i stránky, které se používají relativně často. LEDky pak divoce blikají a systém se svou rychlostí řádově propadne o několik stupňů níž. Když je situace kritická (program chce alokovat paměť, ale už není žádná volná fyzická paměť ani swap), jádro proces vyžadující alokaci další paměti zabije (takto při výchozím nastavení jádra).

Prvním programem, který jádro spustí, je init. Standardně se jedná o program /sbin/init, parametrem init= můžeme toto chování ovlivnit, například zadáním parametru init=/bin/bash jádru řekneme, aby spustilo po své inicializaci náš oblíbený shell. A opravdu, při startu počítače jádro spustí bash s právy roota. Toto je někdy výhodné použít v případě, že vám spouštěcí skripty nedovolují systém normálně spustit (např. kvůli chybné konfiguraci, poškozenému souboru apod.). Samozřejmě byste měli mít bootovací záchranné CD nebo jiné médium, ale už se mi stalo, že jsem ho nemohl najít (což se často děje právě v situacích, kdy ho nejvíc potřebujete). V případě, že máte GRUB a většina systému (disku) je v pořádku, dá se zadat tento parametr jádru přímo při bootu. Pak můžete zkontrolovat disk, upravit konfiguraci atd.

Proces init

Jak jsem už zmínil, standardně spouští jádro program /sbin/init. V linuxových distribucích se veskrze jedná o System V (čtěte "systém pět" - zkráceně sysv) init. Existuje pak ještě BSD init, mezi zastánci těchto dvou alternativ většinou probíhají velmi živé diskuse, který styl že je lepší. Sysv init je složitější, má konfigurační soubor v /etc, takže se dá snadno přizpůsobit.

V případě použití initrd je naprosto nutné mít vytvořen adresář /initrd, který je potřebný při záměně kořenového adresáře při bootu. "Starý" root - tj. ramdisk - se po připojení skutečného root oddílu disku přesune do tohoto adresáře a následně je možné jej odpojit.

Naproti tomu BSD init je pouze jednoduchý shellový skript v /etc/rc, jehož výhodou je větší rychlost (i na mém starém PIII 700 byl boot FreeBSD 5.1 otázkou několika málo sekund), nevýhodou je nutnost velké opatrnosti při editaci spouštěcích skriptů. Vinou malé chybičky můžeme skončit se systémem, který nenabootuje. My se podíváme na klasický sysv init. Úkolem initu je připravit systém pro běžné použití - což se děje za pomoci mnoha spouštěcích skriptů, které podle našeho nastavení například kontrolují systém souborů, počítají závislosti jaderných modulů, spouští různé démony, servery a jinou havěť. Každá distribuce má mírně odlišný systém těchto skriptů a jejich spouštění. Já se zaměřím na Gentoo a Red Hat (Mandriva Linux má stejný systém jako RH, protože původně vycházela právě z této distribuce).

Init načte svůj konfigurační soubor /etc/inittab a podle něj postupuje dále. V obvyklém případě spustí inicializační skript. V Red Hatu je to /etc/rc.d/rc.sysinit, v Gentoo zas /sbin/rc. Podle nastavení výchozího runlevelu ze souboru /etc/inittab pak tento skript po vykonání základních úkonů přejde ke spouštění a vypínání služeb.

Runlevel je termín používaný v souvislostí se sysv initem. Vyjadřuje celkový stav systému s ohledem na spouštěné a zastavované služby. Existuje sedm runlevelů, z toho runlevel S je pouze alias runlevelu 1. Přepnutí systému do jiného runlevelu se dá provést mimo jiné pomocí programu telinit. Při normálním nastavení systému se dá funkce jednotlivých runlevelů charakterizovat podle tabulky.
Samozřejmě nic nebrání vaší fantazii a můžete si předělat systém tak, že úlohy jednotlivých runlevelů budou vzhůru nohama. Jestli se o to budete pokoušet, tak raději s připraveným záchranným CD/DVD a znalostmi, jak jej použít.

V případě Red Hatu se podívá do daného adresáře v /etc/rc.d pro daný runlevel, například pro standardní spuštění do grafického přihlášení je to /etc/rc.d/rc5.d. V tomto adresáři jsou pak uloženy symbolické odkazy na soubory z /etc/init.d, které mají svůj systém pojmenování - nejdříve písmeno S nebo K (S - start; K - kill), pak dvouciferné číslo určující pořadí a nakonec název služby. Například S05syslog znamená spustit službu syslog v pořadí 5 (stejné pořadové číslo může používat i více služeb). Parametry pro jednotlivé služby se nastavují v adresáři /etc/sysconfig. Gentoo dělá věci trochu jinak - nejdříve se spustí služby z runlevelu boot a pak z runlevelu default. V Gentoo není předem určené pořadí spouštění služeb, ale v inicializačním skriptu pro každou službu jsou zapsány závislosti na dalších službách, jejichž propočtením se určí výsledné pořadí spouštění. Například služba netmount (připojení síťových disků) má uveden parametr need net - pro své úspěšné spuštění potřebuje mít už spuštěnou službu net (spuštěná a nastavená síťová karta). Pro nastavení parametrů služeb slouží adresář /etc/conf.d.

Pro odpůrce příkazového řádku jsou k dispozici také utility pro KDE a GNOME, pomocí kterých se dají nastavit služby spouštěné v jednotlivých runlevelech. V GNOME se jedná o součást centra nastavení, program pro KDE se jmenuje KSysV. Pomocí těchto programů se jednoduchým zaškrtáváním políček nastaví požadované služby.

Getty

Po spuštění všech služeb podle nastavení v /etc/inittab spustí init zpravidla několik programů getty na virtuálních terminálech. Po ukončení procesu getty jednoduše spustí init novou instanci, aby se dalo opětovně přihlásit. Programů zabezpečujících getty je několik, z oblíbených vzpomenu mingetty a agetty. Po zadání uživatelského jména se spustí program login, jenž si vyžádá heslo, které pak zkontroluje podle databáze v /etc/passwd a /etc/shadow a když je správné, spustí váš shell (také podle záznamu v /etc/passwd). Grafické přihlašovací programy (např. XDM, KDM, GDM, Entrance) fungují podobně, místo shellu však spustí nějaké grafické prostředí. Tím start počítače a systému končí, následovat může už jen jeho vypínání.

Diskuze (1) Nahoru