Start Linuxu
Start Linuxu je v informatice vícefázový proces, který je prováděn během bootování nainstalovaného Linuxu. V mnoha ohledech se tento proces neliší od bootování BSD a jiných unixových systémů, ze kterých je odvozen. Fáze startu Linuxu zahrnují inicializaci firmwaru, spuštění zavaděče (boot loader), načtení a spuštění jádra Linuxu a spuštění různých spouštěcích skriptů a démonů. Jednotlivé fáze se mohou v různých distribucích Linux lišit, například zavaděčem může být GRUB, LILO, SYSLINUX nebo Loadlin; systém může být dále spuštěn pomocí tradičních skriptů a nástroje init, případně pomocí novějšího démona systemd nebo Upstart.
Přehled
Průběh jednotlivých fází spouštěcího procesu Linuxu závisí na architektuře (počítačové platformě) daného počítače. Počítače IBM PC kompatibilní jsou jednou z architektur, které se pro Linux běžně používají a kde základní roli hraje BIOS (nověji UEFI). BIOS/UEFI nemusí mít přesnou analogii v jiných systémech (např. mobilní telefony). V následujícím příkladu, který popisuje spouštěcí proces Linuxu na architektuře IBM PC kompatibilní se předpokládá, že:
- BIOS po nastartování nejprve určí, které periferie jsou k PC připojené. Poté, co je získán seznam hardware (enumerace), zjistí BIOS zda jsou komponenty nutné pro boot aktivní a pokud ano, načte a spustí zaváděcí kód z nastaveného bootovacího zařízení. Nejdůležitější je test operační paměti, grafické karty a procesoru. Pokud se v počítači nachází alespoň tento hardware (a je v pořádku), je počítač funkční a teoreticky je připraven k použití.
- Zavaděč (boot loader) ve většině případů uživateli nabídne menu s možnými variantami bootování. Toto menu má i svojí výchozí možnost. Pokud uživatel nevybere žádnou z dostupných možností, automaticky se po nějaké době vybere právě možnost výchozí. Jakmile je výběr učiněn, zavaděč načte jádro do paměti, předá mu potřebné parametry a poté veškerou kontrolu.
- Jádro dekomprimuje samo sebe, nastaví systémové funkce, dále nastaví nezbytný hardware a stránkování paměti, a zavolá funkci
start_kernel()
, která provede většinu systémového nastavení (přerušení, zbylá nastavení paměti, inicializaci komponent a ovladačů, atd.). Funkcestart_kernel
je spuštěna samostatně, dále je spuštěn idle_task, scheduler (plánovač) a nakonec ještě proces init, který běží v uživatelském prostoru. - Init se skládá buď ze skriptů, které jsou spouštěny shellem (sysv, bsd, runit), nebo z konfiguračních souborů, které jsou spouštěny pomocí binárních komponent (systemd, upstart). Init má specifické úrovně (sysv, bsd) nebo cíle (systemd), ty se skládají ze specifických služeb (démonů). Tyto úrovně či cíle poskytují struktury a různé neprovozní služby operačního systému a tvoří uživatelské prostředí. Typické prostředí serveru spustí webový server, databázové služby a vytváří počítačovou síť.
- Typické desktopové prostředí začíná spuštěním démona, který se nazývá display manager (XDM). Ten spustí grafické prostředí, které se skládá z grafického X Serveru, který poskytuje základní grafický balík (stack). XDM pak zobrazí přihlašovací okno, kde uživatel může zadat své přihlašovací údaje a vybrat si relaci (typ grafického prostředí). Poté, co uživatel zadá správné přihlašovací údaje, spustí správce sezení (session manager) danou relaci. Relace je sada programů, jako jsou prvky uživatelského rozhraní (panely, applety, atd.), které společně mohou vytvořit kompletní desktopové prostředí.
Při vypnutí je volán proces init
, aby kontrolovaným způsobem zavřel všechny funkce uživatelského prostoru. Init se poté ukončí a jádro provede vlastní vypnutí počítače.
Spuštění zavaděče
Průběh fáze spuštění zavaděče (anglicky Boot loader phase) závisí na architektuře počítače. Protože u předchozích fází není důležitý druh operačního systému, bootovací proces v BIOSu je u architektur x86 a x86-64 považován za spuštěný, jakmile je Master Boot Record (MBR) kód spuštěn v reálném režimu a u prvního stupně zavaděče bylo dokončeno nahrávání. V UEFI (Unified Extensible Firmware Interface) systémech může být přenos dat, například linuxového jádra, uskutečněn přímo, tudíž zavaděč není potřeba. Níže je uvedeno několik obecně rozšířených zavaděčů:
- LILO nerozumí struktuře systému souborů ani ho žádným způsobem neanalyzuje. Místo toho je v živém systému vytvořen konfigurační soubor (
/etc/lilo.conf
), který sepíše seznam umístění datových bloků jádra a RAM disků (initrd nebo initramfs). Tento soubor, jenž obsahuje data jako cesty diskových oddílů anglicky Boot partition a jádra či další jiné případně užitečné informace pro uživatele, je poté zapsán společně s kódem bootloaderu do MBR (Master Boot Record) sektoru. Když je tento bootovací sektor přečten a byla mu předána kontrola od BIOSu, LILO nahraje kód menu a zapíše ho. Poté využívá uchovávaných hodnot společně se vstupními daty uživatele k výpočtům a nahraje linuxové jádro či využije tzv. chain loadingu. - GRUB 1 využívá metody čtení souborových systémů za jejich běhu za účelem získání přístupu k jejich konfiguračním souborům. To, že čte příslušný konfigurační soubor přímo v souborovém systému bez nutnosti ukládání souboru do MBR, mu umožňuje za běhu provádět konfigurační změny a zobrazit disky a diskové oddíly ve formátu, který je pro uživatele srozumitelnější než v případě, kdy je odkázán na offsety. GRUB 1 rovněž obsahuje rozhraní příkazového řádku, což usnadňuje jeho změny a opravy v případě špatné konfigurace či jeho poškození.
- GRUB 2 se od GRUB 1 liší tím, že má dvě (případně tři) fáze a je schopný automatické detekce řady provozních problémů a automatické konfigurace. Zavaděč prvního stupně (anglicky stage1) je spuštěn BIOSem z MBR nebo jiným zavaděčem z bootovacího sektoru. Jeho práce je vyhledat a dostat se k různým souborovým systémům, z nichž může později přečíst konfiguraci. Je zde také jakýsi mezistupeň (anglicky stage1.5), který však není nezbytný. Je spouštěn prvním stupněm v tom případě, kdy zavaděč druhého stupně nepracuje souvisle nebo když souborové systémy či hardware vyžadují specifické ovládání pro přístup k druhému stupni. Zavaděč druhého stupně (anglicky stage2) je nahrán jako poslední a zobrazuje výchozí menu GRUBu, které umožňuje uživateli zvolit si operační systém či prozkoumat a upravit výchozí parametry. Po vstupu do menu a výběru parametru nahraje GRUB do paměti jádro a předá mu kontrolu. GRUB 2 je také schopen provést chain loading jiného zavaděče.
- SYSLINUX/ISOLINUX je zavaděč, který se soustředí na bootování úplných instalací ze souborových systémů FAT. Často je používán pro zavedení či záchranu pružných disků (disket), live USB a dalších bootovacích datových médií. ISOLINUX je obecně využíván linuxovými Live CD a bootovacími instalačními CD.
- Loadlin je zavaděč, který může nahradit bežící jádro DOSu či Windows 9x za jádro linuxové. To může být užitečné v případě hardwaru, který musí být spuštěn pomocí softwaru a jeho konfigurační programy jsou dostupné výhradně pro DOS. Tato zaváděcí metoda je v současnosti stále méně nutná, Linux již má v současnosti ovladače pro celou řadu zařízení, využití však má stále v oblasti například mobilních telefonů. Loadlin může být také využit v případě, kdy je Linux uložen na paměťovém zařízení, které není vhodné k bootování za pomoci BIOSu: DOS nebo Windows může nahrát vhodné ovladače pro doplnění mezer BIOSu a zavést Linux z tohoto zařízení.
Spuštění linuxového jádra
Jádro Linuxu (anglicky Linux Kernel) ovládá všechny operační systémové procesy, jako je správa paměti, plánování procesů, vstup/výstup (I/O, anglicky input/output), meziprocesová komunikace a celkové řízení systému. Toho je docíleno ve dvou fázích – v první z nich je jádro (jako komprimovaný image soubor) načteno do paměti a dekomprimováno. Spolu s ním je zavedeno i několik základních funkcí jako například základní správa paměti. Po té je řízení ještě jednou naposledy vráceno hlavnímu spouštěcímu procesu jádra. Když je jádro plně funkční, spustí proces init, který (zvlášť) nastaví uživatelský prostor a procesy potřebné pro uživatelské prostředí a konečné přihlášení. Jádro samotné pak přejde do nečinnosti.
Fáze načtení jádra
Jádro se typicky načítá jako image soubor, komprimované do formátu zImage nebo bzImage se softwarovou knihovnou zlib. Metoda Head udělá minimální nastavení hardwaru a zcela dekomprimuje image do fyzické paměti počítače (tzv. vyšší pamět; část paměti, která není přímo mapovaná tabulkou stránek).[1] Poté spustí inicializaci prostřednictvím ./arch/i386/boot/head
a proces startup_32()
(pro procesory založené na x86).
Fáze spuštění jádra
Funkce spuštění jádra (nazývaná také swapper nebo proces 0) vytváří správu paměti (stránkovací tabulky a stránkování paměti), detekuje typ procesoru a další funkce jako je matematický koprocesor a poté přepne na funkcionalitu jádra, která není závislá na architektuře procesoru, přes zavolání start_kernel()
.
start_kernel provádí širokou škálu inicializačních funkcí. Nastavuje řízení přerušení (IRQ), dále konfiguruje paměť, spouští proces Init (první proces uživatelského prostoru) a spustí úlohu nečinnosti pomocí příkazu cpu_idle()
. Dalším význačným krokem je také připojení počátečního RAMDisk ("initrd"), který byl během zaváděcí fáze načten jako dočasný kořenový souborový systém. Initrd umožňuje načítání modulů ovladačů přímo z paměti, bez spoléhání se na jiná zařízení (např. pevný disk) a ovladače, které jsou potřebné k jejich přístupu (např. ovladač SATA). Toto rozdělení některých ovladačů staticky kompilovaných do jádra a ostatní ovladače načteny z initrd umožňují, že jádro je tak menší. Kořenový souborový systém se později přepne přes zavolání pivot_root()
, který odpojí dočasný kořenový souborový systém a nahradí ho použitím skutečného souborového systému, jakmile je přístupný. Paměť používaná dočasným kořenovým souborovým systémem je pak obnovena.
Takto jádro inicializuje zařízení, připojí kořenový souborový systém určený zaváděcím zařízením určený pouze pro čtení a spustí Init (/sbin/init
), který je označen jako první proces spuštěný systémem (PID = 1).[2] Po připojení souborového systému jádro zobrazí hlášku, stejně tak po spuštění procesu Init. Může také volitelně spustit aplikaci Initrd, aby bylo možné před instalací kořenového souborového systému zpracovat záležitosti týkající se instalace a zařízení (disk RAM nebo podobně).[2]
Podle článku vydaného společností Red Hat, je spuštění jádra shrnuto následovně:[3]
- "Když je jádro načteno, okamžitě inicializuje a konfiguruje paměť počítače a konfiguruje různé hardwarové vybavení připojené k systému, včetně všech procesorů, podsystémů vstupu a výstupu (I/O) a paměťových zařízení. Pak vyhledá komprimovaný initrd image na předem určeném místě v paměti, dekomprimuje ho, připojí a načte všechny potřebné ovladače. Dále inicializuje virtuální zařízení související se systémem souborů, jako je například LVM (Logical Volume Manager) nebo software RAID (anglicky Redundant Array of Independent Disks – vícenásobné diskové pole nezávislých disků), před odpojením image initrd disku a uvolněním veškeré paměti, kterou image disku jednou obsadil. Jádro pak vytvoří kořenové zařízení, připojí kořenový oddíl pouze pro čtení a uvolní nepoužívanou paměť. V tomto okamžiku je jádro načteno do paměti a je funkční. Ale protože v tuto chvíli neexistují žádné uživatelské aplikace, které by umožňovaly smysluplné zadávání do systému, se s ním nedá moc pracovat." Initramfs boot je podobný, ale není identický s popsaným initrd boot.
V tomto okamžiku, s povolenými přerušeními, může plánovač převzít kontrolu nad celkovým řízením systému a proces init bude pokračovat v zavádění uživatelského prostředí v uživatelském prostoru.
Reference
V tomto článku byl použit překlad textu z článku Linux startup process na anglické Wikipedii.
- IBM description of Linux boot process [online]. [cit. 2007-04-03]. Dostupné v archivu pořízeném z originálu dne May 31, 2008. (anglicky)
- http://oldfield.wattle.id.au/luv/boot.html Linux Boot Process - by Kim Oldfield (2001)
- Product Documentation [online]. Redhat.com, 2013-09-30 [cit. 2014-01-22]. Dostupné online. (anglicky)