Hlavní navigace

Linux - pohled do nitra

Michal Krause

Možná, že některé z vás Root přesvědčil, že Linux stojí za vyzkoušení. Možná, že jste dokonce již k instalaci přikročili a jste spokojenými uživateli tohoto operačního systému. Pak je ale možná ten správný čas mrknout se, jak se říká, pod kapotu. Dnes se zaměříme na to, co se děje od spuštění počítače až po dotaz na uživatelské jméno pro přihlášení do systému.

Co se děje vzápětí po zapnutí počítače pro nás není až tak podstatné, ale ve zkratce a zjednodušeně: rozjede se vše důležité pro zobrazování na monitoru, poté BIOS provede inicializaci všeho možného podle uložené konfigurace. To, co nás zajímá, začíná až teprve když dojde na vlastní bootování. Pokud se bude systém zavádět z pevného disku, provede se následující: přečte se první sektor celého disku, takzvaný Master Boot Record (MBR). Ten obsahuje zavaděč, který zpravidla načte bootsector. Bootování z diskety je podobné, až na to, že disketa nedisponuje žádným MBR a je tedy přímo zaváděn bootsector.
V tomto okamžiku je čas pro lilo. Lilo, neboli LInux LOader, sestává ze dvou částí. První je linuxový program, který upravuje bootsectory, případně i MBR tak, aby se mohl nabootovat Linux (a konec konců klidně i další OS). Jeho druhá část je spustitelný kód, který se uloží do bootsectoru a je při startu vykonán. A to je právě ta část bootování, kdy se na obrazovce objeví nápis LILO: a vy můžete zvolit, který operační systém nebo které jádro se zavede (pakliže jich máte více), případně můžete jádru předat parametry a podobně.

Zde bych trochu odběhl od bootování a vysvětlil, co vlastně lilo-zavaděč dělá a jak to souvisí s lilem-programem. Lilo totiž musí v tuto chvíli zavést do paměti jádro. Ale jak na to, když ještě pochopitelně nejsou k dispozici ovladače pro přístup na ext2 filesystém? Kód zavaděče musí být poměrně malý a není možné, aby v něm byly rutiny pro přístup na filesystém implementovány. Lilo si musí vystačit s tím, co dokáží služby BIOSu, tedy se čtením na úrovni sektorů. A právě proto je zde lilo-program, které samozřejmě přístup k souborům má. Při spuštění pak vytvoří mapu toho, na kterých sektorech se soubor s jádrem nachází a uloží ji spolu se zavaděčem do bootsectoru. Tím je zajištěno, že lilo-zavaděč může jádro přečíst a nahrát do paměti.
Toto řešení má však jednu nevýhodu. Služby BIOSu bohužel mají určitá omezení, přičemž jedním z nich je, že dokáží pracovat pouze s prvními 1024 cylindry disku. Pokud se soubor s jádrem ocitne za touto hranicí, lilo jej nebude moci načíst a tedy ani nabootovat. Pokud tedy plánujete použití velkých diskových oddílů (u nových řadičů jde přibližně o 8 a více gigabajtů), doporučuji ponechat na začátku disku jeden malý oddíl pro jádro a mountovat ho jako /boot.

Tak, jádro je tedy v paměti. A co se děje dále? Nejdříve se jádro seznámí s počítačem, například si osahá BIOS, zjistí velikost paměti apod. Pak již dochází k zavádění jednotlivých ovladačů. V okamžiku, kdy jsou k dispozici ovladače diskového řadiče, se jádro pokusí přimountovat kořenový filesystém, který je zadán v jádře (více viz man rdev). Pokud se mu toto nepovede (kdysi jsem například z přílišné horlivosti zkompiloval jádro bez IDE ovladačů :), máte docela problém, který lze často napravit pouze s pomocí bootovací diskety.
Pokud se povede přimountovat root filesystém, spustí jádro první proces, init. To už je obyčejný program, který se postará o spoustu důležitých věcí. To, co má dělat se dozví ze souboru /etc/inittab (poznámka: nedoporučuji přílišné experimentování s tímto souborem, pokud nevíte, co děláte – může to mít nepříjemné důsledky, které se většinou řeší opět pomocí bootovacích disket). Nejdříve si z něj přečte tzv. runlevel, do kterého se má systém přepnout. Obvykle se používá šest runlevelů, které znamenají:

0 – halt
1 – jednouživatelský režim
2 – multiuživatelský režim bez NFS
3 – plný multiuživatelský režim
5 – X11
6 – reboot

Číslování runlevelů je do jisté míry jenom formální, chování v rámci jednotlivých úrovní je určené nastavením v souboru /etc/inittab. Nicméně je vhodné dodržet výše uvedené číslování, není důvod jej měnit.
Pak init provede všechny definované akce – některé z nich jsou nezávislé na úrovni a provedou se vždy. Důležité je, že init spustí startovací skripty a také vytvoří virtuální konzole. A tím už se blížíme k závěru dnešní části. Init totiž spustí pro každou konzoli program mingetty (případně mgetty, agetty nebo jiný getty program), který se zeptá na vaše uživatelské jméno a následně pak evokuje proces login pro přihlášení do systému.

Tjádydádydá a to je vše přátelé, jak říká jedno známé prase :)

Někdy příště se podíváme blíže na soubor /etc/inittab a také na strukturu startovacích skriptů.

Doporučená četba: dokumentace k lilu, man init, man inittab, Internet a samozřejmě zdrojáky jádra :)))))

Našli jste v článku chybu?