Od-zapnuti-do-promptu Od zapnutí do promptu bash-e: Krátký popis toho, co se stane v Linux systému na platformě Intel 386+ kompatibilních PC od zapnutí napájení do doby přihlášení a výpisu promptu bash-e (nejobvyklejšího Linux shell-u)
 
Pozn: Činnosti prováděné do vysokoúrovňové inicializační fáze (viz níže) jsou specifické pro platformu Intel i386 kompatibilní a na jiných architekturách se liší.

Základní kroky:
  1. BIOS vybere zaváděcí zařízení
  2. Ze zaváděcího zařízení BIOS zavede zaváděcí sektor (boot sektor)
  3. Boot sektor zavede spouštěcí a dekompresní rutiny a komprimované jádro Linuxu
  4. Jádro je dekomprimováno (v chráněném - protected módu)
  5. Nízkoúrovňová (low-level) inicializace kódem v assembleru
  6. Vysokoúrovňová (high-level) inicializace kódem v C
  7. Spuštění procesu init
  8. odpověď na přihlašovací prompt getty předána úloze login, ten spustí bash
Hardware:
Po zapnutí se počítač sám testuje - to se nazývá "Power On Self Test" neboli POST. Běhen této fáze se detekuje HW, přidělují se zdroje PNP ISA a PCI zařízením, detekují se disky a aktivují se BIOSy některých periferií: Video karta, řadiče SCSI, ale i např. BOOT ROM síťové karty. Pak program zvaný bootstrap loader, umístěný v ROM BIOSu, hledá boot sector. Boot sector je první sektor na disku a obsahuje malý program, který může zavést operační systém. Boot sectory jsou označeny "magickým číslem" 0xAA55 = 43603 na offsetu 0x1FE = 510. To jsou poslední dva byte 512 B dlouhého sektoru. Touto značkou HW (disk) říká, zda sektor je boot sektor nebo ne.
Bootstrap loader má seznam míst, kde hledá boot sektory. U moderních PC je toto pořadí konfigurovatelné v SETUP programu BIOSu PC, typicky lze volit mezi floppy disketou (-ami), pevným (-i) diskem, CD-ROM a případně ZIP mechanikou, USB diskem a zavedením systému ze sítě např. Intel PXE protokolem. Pokud bootstrap loader nalezne boot sektor, zavede jej do paměti a předá mu řízení. Tento program pak zavede OS. Na typickém Linuxu sytému to bude první část programu LILO (Linux LOader) nebo novějšího GRUB (GRand Unified Bootloader) - viz např. "LILO", "Multiboot-with-LILO", "Multiboot-with-GRUB" mini-HOWTO. Může to ale být i boot sektor Linuxového jádra - tato varianta se většinou používá pouze při zavádění systému z diskety n. CD-ROM, protože použití specializovaného zavaděče (LILO,GRUB) má několik výhod:
- Možnost výběru mezi různými Linuxovými jádry a/n. různými OS.
- Možnost předat jádru parametry na příkazové řádce (až 2 kB).
- Možnost počátečního RAM disku (initrd), takže jádro může být bez většiny ovladačů.
- Možnost zavést větší komprimované (bzImage) jádro - až 2.5 MB oproti 1 MB.
- Možmost použít počáteční RAMdisk (initrd) pro zavedení potřebných obladačů

LILO/GRUB:
Když počítač zavede boot sektor na normálním Linux systému, to co zavede je pouze část z LILO/GRUB zavaděčů zvaná "zavaděč první etapy" ("first stage boot loader" to nazývají Amíci). Je to malý program jehož jediným úkolem je zavedení a spuštění "zavaděče druhé etapy" ("second stage boot loader"). Dělení na dvě části je proto, že zaváděcí jeden sektor disku je malý na uchování kódu celého zavaděče.
Zavaděč druhé etapy vypíše prompt (pokud tak byl nainstalován) a následně zavede vybraný/implicitní operační systém. Pokud je jím Linux, zavede přímo vybrané Linuxové jádro - obvykle soubor "/boot/vmlinuz-x.y.z", kde x.y.z je verze jádra. "Z" na konci vmlinuz znamená, že soubor obrazu jádra je komprimovaný /programem gzip/. LILO/GRUB také umožňují předat jádru "příkazový řádek" - seznam parametů např. o počtu a konfiguraci řadičů a portů, APM, rezervaci ISA PNP zdrojů (přerušení, DMA, I/O portů), zavedení počátečního RAM disku s ovladači nutnými pro start systému, max. počtu používaných procesorů u SMP systémů, umístění NFS souborového systému pro bezdiskové počítače, co má jádro provést v případě detekce neobnovitelné chyby, umístění a způsob připojení kořenového souborového systému (ro, rw), požadavek na start v jednouživatelském (single-user) módu apod.
LILO příp. GRUB mají své konfigurační soubory na Linux filesystému, a sice /etc/lilo.conf resp. /boot/grub/menu.lst (u RedHat distribucí je /boot/grub/menu.lst symbolický link na /boot/grub/grub.conf).
Činnost LILO/GRUB zavaděče končí předáním řízení na tzv. "setup" rutinu jádra. Ta připraví přechod na protected mód, dekomprimuje jádro a předá mu řízení.
Po inicializaci registrů a kontrole typu procesoru následuje vysokoúrovňová inicializace. Během ní se mj. provádí inicializace poplatné architektuře, inicializace datových struktur, inicializuje se systémová konzole, podpora dynamického zavádění modulů, počítá BogoMips, inicializace VFS (Virtual File System), VM (Virtual Memory manager), vyrovnávací cache, IPC (InterProcess Communication), quota (SubSystém limit a využití disků uživateli), provádí se kontroly na chyby HW a dělají protiopatření (např. f00f chyba P5), připraví se start plánovače "na příští chvíli", odstartuje vlákno (thread) pro start procesu init a přejde do čekací smyčky (idle loop).
Jádro Linuxu - stručně řečeno, pomocí HW dělá to, co programy potřebují a očekávají ke svému běhu, rychle a efektivně. Procesor může najednou provádět pouze jednu instrukci, ale Linux systém se chová jako by prováděl řadu věcí současně. Jádro to realizuje rychlým přepínáním a přidělováním procesoru mezi úlohami. Interval tiku hodin a tím i nejmenší interval přepínání se nazývá "jiffie" a je na i386+ systémech 1/100 sec (závisí na HW architektuře - např. na procesorech Alpha je to 1/1024 sec.) Nejlepší využití procesoru je dáno tím, že sleduje, co jaký program/proces provádí - který je připraven k běhu a který na něco čeká; např. na vstup z klávesnice nebo zapsání/přečtení záznamu z disku. Tato úloha jádra se nazývá plánování (scheduling). Pokud program nic nedělá, pak není nutno, aby byl v RAM. A také program, který něco dělá, může mít část/části, které nedělají nic. Adresní prostor každého procesu je dělen do stránek. Jádro si udržuje informace o tom, které stránky kterých procesů jsou nejvíce užívány. Stránky, které tak často užívány nejsou, mohou být přesunuty do odkládací (swap) diskové oblasti. Jiné nepoužité stránky mohou být vysunuty a udělají jim místo, když jsou opět potřeba v RAM. Tento mechanismus se nazývá "správa virtuální paměti" (virtual memory management, VM).
Jádro obsahuje ovladače (drivers) pro mnoho specifických zařízení. Jejich ovládání prezentuje v jednotné formě aplikačním programům. Jádro také spravuje systém souborů, interprocesové komunikace, a mnoho síťových věcí. Většina konfigurace jádra je dána při jeho sestavení - je možné nastavit architekturu, typ procesoru, podporované sběrnice, souborové systémy, periférie, APM, ACPI, PNP, SW RAID, typy sítí a síťových protokolů a další.

GNU C knihovna:
Následující věc, která se stane s počítačem při startování je, že je zatažen a spušten program init. Nicméně, program init, téměř jako všechny programy, používá funkce z knihoven. Jádro tedy musí být schopno před startem programu init potřebné knihovny zavést a připravit k použití, a to jak pro starý formát spustitelných programů, tzv. a.out (Assembler OUTput), tak pro nový ELF (Executable and Linking Format) formát. Nejznámější jsou standartní C knihovny - na GNU/Linux systémech se nazývá glibc (Gnu LIBrary C). Jsou v ní stovky standartních funkcí: matematické, práce s řetězci, datové/časové, alokace paměti atd. Všechno v Unixu (a Linuxu) je psáno v jazyce C, takže všechno užívá tyto funkce. Adresář "/usr/lib" obsahuje velké množství souborů většinou pojmenovaných libněco.so nebo libněco.a atd. Jsou to knihovny těchto funkcí. Glibc je jenom GNU implementace těchto funkcí.
    Tyto knihovní funkce mohou programy použít dvěma způsoby. Jestliže je program sestavován staticky, knihovní funce jsou kopírovány z knihoven lib něco.a do vytvářeného spustitelného obrazu. Jestliže je program sestavován dynamicky (což je náhradní hodnota), pak když je program spušten a potřebuje knihovní kód, ten je volán ze souboru libněco.so.
    Program ldd vypíše jaké sdílné knihovny daný program ke svému běhu potřebuje. Například, zde jsou knihovny, které užívá program bash:
  franta:~$ ldd /bin/bash
libtermcap.so.2 => /lib/libtermcap.so.2 (0x4002c000)
libdl.so.2 => /lib/libdl.so.2 (0x40030000)
libc.so.6 => /lib/libc.so.6 (0x40034000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Program init:
Většina linuxových systémů používá způsob "Systém V" inicializace. Obecně jádro po dokončení svého zavedení a své inicializaci spustí program /sbin/init . Úkolem init-u je, aby vše dále bylo správně spuštěno. Zařizuje připojení ("montování" - mount) a případnou kontrolu souborových systémů a swapovacích oblastí, nastavení hodin, jména systému, startuje systémové démony, síťové služby a procesy pro přihlášení do systémů (getty/mingetty/xdm). Základním konfiguračním souborem programu init je /etc/inittab. Tento soubor popisuje, které procesy jsou startovány během zavedení systému a během normalní činnosti.
    Init rozlišuje několik úrovní běhu (runlevel), každá úroveň může mít svojí množinu procesů, které v ní jsou startovány. Platné úrovně běhu jsou 0-6. Další povolené úrovně nejsou v systémech linux a unix využívány. Položky v souboru inittab mají formát:

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

id - je jednoznačná posloupnost 1-4 znaků, která definuje položku v inittab
úrovně běhu - je seznam úrovní pro ktere se bude provádět specifikovaná akce.
akce popisuje, která akce bude prováděna:
    respawn - pokud proces skončí, bude restartován (např. getty).
    wait - proces bude nastartován jednou při vstupu do dané úrovně běhu a init bude čekat na jeho ukončení.
    once - proces bude spuštěn jednou při vstupu do dané úrovně běhu.
    boot - proces bude spuštěn během zavádění systému, pole urovně běhu je ignorováno.
    bootwait - proces bude spuštěn během zavádění systému a i čeká na jeho ukončení (/etc/rc).Pole úrovně běhu je ignorováno.
    off - nedělá nic.
    ondemand - proces označen ondemand úrovní běhu bude spušten kdykoli je daná ondemand úrovně běhu (a,b,c) volána.
    initdefault - specifikuje úroveň běhu, do které by měl systém vejít po startu. Pole proces je ignorováno.
    sysinit - proces bude prováděn během zavádění systému, ještě před položkami boot nebo bootwait.
    powerwait - proces byde spuštěn při výpadku napětí (init je o tom většinou informován programen komunikujícím s UPS).Init bude čekat na ukončení procesu.
    powerfail - jako pro powerwait, ale init nečeká na ukončení procesu.
    powerokwait - proces bude spuštěn, když je init informován o obnovení napájení.
    powerfailno - proces bude spuštěn, když se init dozví, že záložní baterie na externí UPS jsou téměř vybité.
    ctrlaltdel - proces bude spuštěn, když init přijme signál SIGINT - typicky stiskem kombinace kláves ctrl-alt-del na systémové konzoli
    kbrequest - proces bude spuštěn, když init přijme signál od ovladače konzolové klávesnice, že byla stisknutá speciální kombinace kláves.
proces specifikuje prováděný proces. Ukončení spuštěného procesu spolu s příčinou zastavení init zaznamenává do souborů /var/run/utmp a /var/log/wtmp. Pokud ale pole procesu začíná znakem "+", init účtování nebude zaznamenávat.

Příklad souboru /etc/inittab:
# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:

# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

# Things to run in every runlevel.
ud::once:/sbin/update

# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -h now

# When our UPS tells us power has failed, assume we have a few minutes
# of power left. Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"

# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty --noclear tty1
2:2345:respawn:/sbin/mingetty --noclear tty2

# Run xdm/gdm/kdn in runlevel 5
# xdm is now a separate service
x:5:respawn:/etc/X11/prefdm -nodaemon

Změna úrovně běhu
Poté co init spustil všechny specifikované procesy, čeká na ukončení některého svého spuštěného procesu, na signál výpadku napájení nebo na signál úlohy telinit ke změně úrovně běhu systému. Při výskytu jedné z těchto tří podmínek znovu načítá soubor /etc/inittab.
    Znovunačtení můžeme programu init vnutit příkazem telinit Q nebo q. Příkaz telinit také může říci programu init, abych přepnul do jiné úrovně běhu. Init pak vyšle signál SIGTERM všem procesům, které nejsou v nové úrovni běhu definovány, pak čeká 5 vteřin (dobu možno změnit příkazem telinit) a pak neukončené procesy zlikviduje signálem SIGKILL. V distribuci RedHat je inicializační script soubor /etc/rc.d/rc.sysinit. Následně je volán script, který spustí procesy pro defaultní úroveň běhu. Pro úrovně 0-6 existují adresáře /etc/rc.d/rcN.d, kde N je 0-6. V nich jsou scripty s názvy standartně ve tvaru SnnJméno_Služby a KnnJméno_Služby, kde nn je dvouciferné číslo 00-99. Script /etc/rc.d/rc při změně úrovně běhu spustí všechny KnnJméno_Služby scripty s parametrem stop a následně všechny scripty s SnnJméno_Služby s parametrem start.
    Poslední důležitá věc, kterou init provede, je start několika getty/mingetty procesů. Jsou označeny akcí respawned, což znamená, že pokud z nějakého důvodu skončí, inet je spustí znovu. Většina distribucí přichází s šesti virtuálními terminály, jejich počet je možný zmenšit i zvětšit. Je také možné mít textové terminály na sériových linkách nebo připojených modemech. Při startu v grafickém režimu (run-level 5) je ještě spuštěn proces xdm (X Display Manager), který provádí služby podobně jako getty a login na znakových terminálech: vyzve uživatele k zadání jména a hesla, ověří jej a spustí pro něj takzvaný "správce sezení" - session manager.
    Při přechodu systému do úrovně běhu 1 (jednouživatelský mód) init spustí rootův shell na zařízeni /dev/console, bez nutnosti zadání jména a hesla.

Systém souborů:
V tomto článku bude užito slovo souborový systém ve dvou různých významech. Jako souborové systémy na diskových oblastech a jiných zařízeních a jako souborový systém tak jak je prezentován běžícím linuxovým systémem. Na Linuxu se připojují ("montují" - viz povel mount) diskové souborové systémy do systémového souborového systému. Při startu jádro připojí kořenový souborový systém v read-only modu. Během startu je kořenový souborový systém zkontrolován programem fsck a následně znovu připojen (remount) v read-write modu. Po připojení root-fs v read-write módu jsou připojeny ostatní souborové systémy podle specifikace v /etc/fstab .

Příklad souboru /etc/fstab  :

LABEL=/ / ext3 defaults 1 1 none /dev/pts devpts gid=5,mode=620 0 0 none /proc proc defaults 0 0 none /dev/shm tmpfs defaults 0 0 LABEL=/var1 /var ext3 defaults 1 2 /dev/rd/c0d0p2 swap swap defaults 0 0 /SWAP swap swap defaults 0 0 /dev/cdrom /mnt/cdrom iso9660 noauto,owner,kudzu,ro 0 0 /dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0 /dev/cdrom1 /mnt/cdrom1 iso9660 noauto,owner,kudzu,ro 0 0 /dev/hda1 /mnt/C vfat defaults 0 0 /dev/hda5 /mnt/D vfat defaults 0 0

Démoni jádra:
Příkaz "ps aux" vypíše něco podobného následujícímu:
USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
root 1 0.0 0.5 1384 368 ? S Mar20 0:03 init
root 2 0.0 0.0 0 0 ? SW Mar20 0:01 [keventd]
root 3 0.0 0.0 0 0 ? SWN Mar20 0:01 [ksoftirqd_CPU0]
root 4 0.0 0.0 0 0 ? SW Mar20 0:11 [kswapd]
root 5 0.0 0.0 0 0 ? SW Mar20 0:00 [bdflush]
root 6 0.0 0.0 0 0 ? SW Mar20 0:00 [kupdated]
root 467 0.0 0.0 0 0 ? SW Mar20 0:00 [eth1]
root 551 0.0 0.6 1444 408 ? S Mar20 0:00 syslogd -r -x
root 556 0.0 0.5 2056 344 ? S Mar20 0:01 klogd -2
root 818 0.0 0.6 1612 408 ? S Mar20 0:00 crond
root 901 0.0 0.6 5156 412 tty1 S Mar20 0:00 login -- root
root 905 0.0 3.4 5184 2148 tty4 S Mar20 0:00 login -- franta
root 906 0.0 0.4 1356 276 tty2 S Mar20 0:00 /sbin/mingetty --
root 907 0.0 0.4 1356 276 tty3 S Mar20 0:00 /sbin/mingetty --
root 2174 0.0 2.0 2476 1308 tty1 S 14:30 0:00 -bash2
franta 2587 0.0 2.0 2476 1308 tty4 S 16:43 0:00 -bash2
Je to seznam všech procesů běžících v systému. Proces init je vždy proces číslo 1. Procesy 2,3,4,5,6 (keventd, ksoftirqd_CPU0, kswapd, bdflush, kupdated) jsou uzavřeny v hranatých závorkách "[]" a jejich velikost v operační paměti (pole VSZ a RSS) je 0. Je to proto, že tyto procesy jsou démoni jádra, i když většina jádra se obyčejně neukazuje na seznamu procesů. Démoni jádra jsou startováni po initu, takže mají čísla procesů jako normální procesy. Ale jejich kód a data jsou součástí paměti jádra. Závorky "[]" okolo položek ve sloupci "COMMAND" jsou proto, že souborový systém /proc neobsahuje informaci o příkazové řádce pro tyto procesy.
Některé činnosti jež "jaderní" démoni provádějí:
kswapd - přesouvá nepotřebné části běžících programů na swapovací oblasti pevných disků v případě nedostatku volné operační paměti nebo naopak do operační paměti potřebné části programu z disku (zapínaní/ vypínání swapovacích oblasti(-í)se provádí programy swap on/off)
bdflush a kupdated - vyprazdňují vyrovnávací paměti na disk(y)

Proces logování událostí systému (systém logger):
Jedny z prvních služeb, které jsou startovány procesem init, jsou démoni syslogd a klogd. Zapisují zprávy do systémových logů - zprávy jádra jsou obsluhovány démonem klogd, zatímco syslogd provádí logování zpráv z jiných procesů, a případně přes síť i z jiných systémů. Hlavní logovací soubor bývá /var/log/messages, ale konfigurace logovacího systému je řízena souborem /etc/syslog.conf, který určuje co se bude logovat a kam. Zprávy jsou identifikovány podle toho, od které služby přichází a jakou mají úroveň priority. Kofigurační soubor sestává z řádek, které v podstatě říkají, že zprávy od služby x s prioritou y a vyšší mají jít do z, kde z může být obyčejný soubor, pojmenovaná roura, terminál nebo konzole, vzdálený počítač nebo seznam uživatelů.

Getty a Login:
Getty je program který umožňuje připojit se přes sériové zařízení jako je virtualní terminál, textový terminál, nebo modem. Zobrazí přihlášovací prompt a když zadáte vaše uživatelské jméno, getty jej předá programu login, který se zeptá na heslo, ověří to a spustí shell. Je dostupných několik variant programu getty. Některé distribuce, včetně RedHat používají velmi malou verzi zvanou mingetty, která pracuje pouze s virtuálními terminály. Login je program z balíku util-linux (mkswap, fdisk, passwd, kill, setterm, mount, swapon, rdev, renice, more a další), který také obsahuje dobře pracující getty zvané agetty (Alternative linux GETTY).
Getty jsou obyčejně startovány v /etc/inittab procesem init. Zpráva která se vypíše na vrchu obrazovky před přihlašovacím promptem je ze souboru /etc/issue. Login kontroluje detaily ohledně přihlášení uživatele v /etc/passwd, a jestliže systém podporuje stínování hesel též v /etc/shadow. Moderní Unixové systémy včetně Linuxu podporují používání tzv. PAM (Pluggable Autentication Module), které umožňují obecnou kontrolu ověřování identity a oprávnění např. ze vzdálených serverů, podle adresy stroje, z níž se uživatel přihlašuje, jména uživatele, doby přihlášení apod. To lze využít nejen k přihlašování, ale k autorizaci (oprávnění) uživatele/procesu vykonávat nějakou činnost.

Bash:
 Po zadání správné kombinace přihlašovacího jména a hesla úloha login ověří v /etc/passwd který shell má spustit. Ve většině případů to na Linuxových systémech bude bash (Bourne Again SHell - vylepšený sh). Jeho úkolem je čtení uživatelských příkazů a jejich provádění. Bash je zároveň uživatelské rozhraní a interpret programovacího jazyka:
 Soubor /etc/bashrc řídí systémové chování bash-e. Příkazy zde napsané ovlivní každého kdo použije bash na tomto systému. Další globální soubor ovlivňující chování bash-e je /etc/profile. Když bash má po startu přečteny konfigurační soubory systémové úrovně (system-wide), hledá osobní konfigurační soubory. Ty jsou v domovském (home) adresáři pod jmény .bash_profile , .bash_login, .profile a .bashrc (tečka na počátku znamená, že jsou skryté - pro jejich výpis musíme v příkazu "ls" použít přepínač "-a" n. "-A"). Úpravou těchto souborů je možné přizpůsobit chování bash-e potřebám uživatele, např. nastavit proměnné prostředí, implicitní editor, parametry národního prostředí, spuštění úloh po přihlášení apod. Detaily viz v "man bash".
Soubor .bash_logout je bash-em čten a prováděn při ukončení přihlašovacího shellu - sem lze vložit příkazy, jež se mají provést při odhlášení uživatele ze systému.