Boot proces

UEFI → GRUB → initramfs → systemd.

Boot je cesta od stisku tlačítka po přihlašovací obrazovku — řetěz kroků, kde každý předá štafetu tomu dalšímu: firmware najde disk, bootloader vybere jádro, jádro rozjede hardware, initramfs najde a připojí tvůj kořenový oddíl a nakonec systemd nastartuje služby. Když počítač „nenaběhne", neselhal magicky celý — praskl jeden konkrétní článek toho řetězu. A přesně proto se vyplatí ho znát: pak neřešíš paniku, ale hledáš, který krok spadl a proč.


Pár pojmů na úvod

  • Firmware = program zadrátovaný v základní desce, který se spustí jako úplně první (dnes UEFI, dřív BIOS). Jeho úkol: rozběhnout hardware a najít, odkud bootovat.
  • UEFI vs BIOS = dvě generace firmwaru. UEFI je novější, rozumí souborovému systému a spouští soubory z tzv. ESP. BIOS je starý, čte jen prvních 512 bajtů disku (MBR).
  • ESP (EFI System Partition) = malý FAT oddíl (obvykle /boot/efi), kde leží bootloadery jako soubory .efi. UEFI si odsud vybere, co spustit.
  • Bootloader = program (typicky GRUB), který nabídne menu, vybere jádro a předá mu řízení.
  • Kernel (jádro) = to samotné srdce z minulé kapitoly. Při bootu se načte do paměti a převezme hardware.
  • initramfs = dočasný mini-systém v RAM. Existuje jen na pár vteřin, aby jádro dokázalo najít a připojit skutečný kořenový oddíl (odemknout LUKS, načíst ovladač disku).
  • systemd = první „normální" program, který jádro spustí (dostane PID 1). Odsud se rozjede všechno ostatní — služby, síť, přihlašovací obrazovka.
  • target = cíl, do kterého systemd míří (graphical.target s grafikou, multi-user.target bez ní).

Firmware — kdo drží štafetu jako první

Zmáčkneš tlačítko a procesor neví vůbec nic o „Linuxu". Spustí jediné, co má natvrdo: firmware na základní desce.

  • UEFI (dnešní standard) — umí číst souborový systém. Podívá se na ESP (malý FAT oddíl, obvykle připojený jako /boot/efi), tam najde bootloadery jako obyčejné soubory .efi a podle svého pořadí (efibootmgr) jeden spustí. Sem patří i Secure Boot — kontrola, že spouštěný kód je podepsaný důvěryhodným klíčem.
  • BIOS (starší) — souborovým systémům nerozumí. Přečte úplně prvních 512 bajtů disku (MBR), kde je kousek bootloaderu, a předá mu řízení. Postupně mizí, ale na starším železe na něj narazíš.

💡 Rozdíl si zapamatuj takhle: UEFI hledá soubor, BIOS hledá bajty na začátku disku. Proto se u UEFI dá mít víc systémů vedle sebe elegantně (každý svůj .efi), zatímco u BIOSu se peraly o jeden malý MBR.

Firmware je taky místo, kde volíš pořadí bootování (disk, USB, síť) a kde se dá zapnout heslo, Secure Boot nebo tamper detection. Do UEFI/BIOSu se dostaneš klávesou při startu (často F1, F2, Del nebo Esc — liší se výrobcem).


GRUB — bootloader, který vybírá jádro

Firmware spustil GRUB (GRand Unified Bootloader). To je ta obrazovka s nabídkou, kterou po zapnutí na chvíli vidíš (nebo probliknutí, když je timeout krátký).

Co GRUB umí a proč je důležitý:

  • Nabídne menu — víc jader (aktuální + starší jako záloha), případně jiné OS (dual-boot).
  • Vybere jádro a k němu odpovídající initramfs.
  • Předá jádru parametry (tzv. kernel cmdline) — třeba ro root=UUID=... rhgb quiet. Tohle je klíčová schopnost: dočasnou úpravou parametru se dá systém nabootovat jinak (do záchranného režimu, bez grafiky, s víc logy).

Kde GRUB bydlí:

# hlavní nastavení uživatele (odkud se generuje zbytek)
/etc/default/grub

# vygenerovaný konfig, který GRUB opravdu čte (needituj ho ručně) — cesta i příkaz se liší podle rodiny distra:
/boot/grub2/grub.cfg          # rodina RHEL/Fedora
/boot/grub/grub.cfg           # Debian/Ubuntu

# po změně /etc/default/grub konfig přegeneruj:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg   # rodina RHEL/Fedora
sudo update-grub                              # Debian/Ubuntu (totéž jinak zabalené)

🚩 Nikdy needituj vygenerovaný grub.cfg ručně — příště ho grub2-mkconfig přepíše a tvoje změny zmizí. Trvalé věci patří do /etc/default/grub, jednorázové se dělají přímo v GRUB menu (viz níže).


Kernel + initramfs — rozjezd hardwaru a hledání kořenu

GRUB načte do paměti dvě věci: jádro a initramfs. Tady začíná ta zajímavá past: jádro sice umí spravovat hardware, ale kde je vlastně kořenový oddíl (/)? Může být na NVMe disku, přes RAID, na LVM, zašifrovaný LUKSem… a ovladač pro tohle všechno je uložený zrovna na tom disku, který teprve chce připojit. Klasické „vejce a slepice".

Řešení je initramfs (initial RAM filesystem) — malý dočasný systém, který GRUB nahraje do RAM hotový. Obsahuje jen to nejnutnější:

  • ovladače disku (NVMe, SATA, RAID…), aby jádro disk vůbec vidělo,
  • nástroje na odemčení LUKS (zeptá se tě na šifrovací heslo),
  • nástroje na sestavení LVM / RAID,
  • pak najde skutečný kořenový oddíl, připojí ho a předá mu řízení.

Jakmile je pravý / připojený, initramfs splnil úkol a mizí. Od téhle chvíle běží systém z disku.

# initramfs pro aktuální jádro se dá přegenerovat (rodina RHEL/Fedora: dracut; Debian/Ubuntu: update-initramfs -u)
sudo dracut --force

# pro konkrétní jádro
sudo dracut --force /boot/initramfs-$(uname -r).img $(uname -r)

💡 Proč tě to má zajímat? Když v initramfs chybí ovladač tvého disku (nebo modul pro LUKS), jádro naběhne, ale kořenový oddíl nenajde — a boot se zasekne. Většina „počítač nenaběhl po updatu" záhad bydlí přesně tady.


systemd (PID 1) — převezme řízení a rozjede služby

Kořenový oddíl je připojený, initramfs odešel. Jádro teď spustí první uživatelský proces — a ten dostane PID 1. Na dnešních distrech je to systemd. Je to rodič všech ostatních procesů: kdyby spadl, spadne systém.

Co systemd udělá:

  • Podívá se, jaký je výchozí cíl (default.target) — obvykle:
    • graphical.target — plná grafika s přihlašovacím manažerem,
    • multi-user.target — jen textová konzole (typické pro servery),
  • ten cíl závisí na dalších (síť, logování, disky z /etc/fstab…), a systemd je paralelně nastartuje ve správném pořadí (podle závislostí, ne jen odshora dolů).
# jaký target naběhne po startu
systemctl get-default

# přepnout výchozí target (např. server bez grafiky)
sudo systemctl set-default multi-user.target

Když je hotovo, spustí se přihlašovací manažer (u KDE třeba SDDM) nebo — bez grafiky — holá textová konzole (login:). Tady řetěz končí: vidíš přihlašovací obrazovku.


Celá boot sekvence odshora dolů

Každá šipka je předání štafety. Když boot spadne, spadl mezi dvěma konkrétními kroky — a znát ten řetěz znamená vědět, kde hledat.


Praktické — jak do boot procesu zasáhnout

Tohle jsou dovednosti, které tě jednou zachrání, až systém nenaběhne, jak má.

Vstup do GRUB menu. Když je menu skryté nebo probliká, drž při startu Shift (na BIOS/starším GRUBu) nebo tiskni Esc (na UEFI). Objeví se seznam jader.

Dočasná úprava parametrů jádra. V GRUB menu najeď na položku a zmáčkni e (edit). Dostaneš se do řádku začínajícího linux ... — to je cmdline předávaný jádru. Na jeho konec přidáš parametr a spustíš přes Ctrl+X (nebo F10). Změna platí jen pro tento boot, nic se neuloží.

Užitečné parametry na dopsání:

systemd.unit=rescue.target   # záchranný (single-user) režim — minimum služeb, jeden uživatel
systemd.unit=emergency.target   # ještě míň — jen holý shell, / připojený read-only
3                            # klasické "runlevel 3" = multi-user.target (bez grafiky)
single                       # jednouživatelský režim
init=/bin/bash               # úplně obejít systemd (krajní záchrana)
nomodeset                    # vypnout přepínání grafiky — když nenaběhne obrazovka

Výběr staršího jádra. Distra po updatu nechávají pár předchozích jader. Když nové jádro nefunguje (třeba mu chybí ovladač), v GRUB menu vyber v podnabídce „Advanced options" starší jádro — pravděpodobně nabootuje. Pak máš čas problém v klidu vyřešit z běžícího systému.

Jak dlouho boot trval. Když systém běží, změříš boot takhle:

# celkový čas + rozpad na firmware / loader / kernel / userspace
systemd-analyze

# které služby braly nejvíc času (seřazené sestupně)
systemd-analyze blame

# kritická cesta — co na co čekalo (proč to trvalo)
systemd-analyze critical-chain

💡 systemd-analyze blame je první věc, po které sáhni, když „boot trvá věčnost". Ukáže ti, jestli žere čas síť, čekání na disk, nebo nějaká pomalá služba — a co má smysl řešit.


Failure modes — kde to nejčastěji praskne

  • Rozbitý GRUB po instalaci druhého OS. Nainstaluješ Windows/jiné distro vedle a ono přepíše bootloader — počítač najednou naběhne rovnou do toho druhého systému (nebo do prázdné grub> výzvy). Řeší se přegenerováním GRUBu z live/instalačního USB (grub2-mkconfig, případně grub2-install) nebo v UEFI přehozením pořadí přes efibootmgr.
  • Špatný /etc/fstab → boot uvázne (emergency mode). Napíšeš do fstab chybný řádek (překlep v UUID, disk, který už neexistuje) — systemd na něj při bootu čeká, nedočká se a shodí tě do emergency shellu. Řeší se přímo tam: přihlásíš se rootem, opravíš /etc/fstab (chybný řádek zakomentuj #) a rebootuješ. Nouzově se dá disk odchytit přidáním systemd.unit=emergency.target v GRUBu.
  • Chybějící ovladač disku v initramfs. Jádro naběhne, ale kořenový oddíl nenajde (typicky po neúplném dracut nebo výměně hardwaru) — boot se zasekne s „cannot find root device". Řeší se nabootováním staršího jádra z GRUBu (to má initramfs v pořádku) a přegenerováním: sudo dracut --force.
  • Plný /boot. /boot bývá malý oddíl. Po pár updatech jader se zaplní, nový initramfs se nevejde, a příští boot může selhat nebo se update rozbije v půlce. Řeší se úklidem starých jader balíčkovačem (většina distribucí drží posledních pár jader; přebytek smažeš přes svůj dnf/apt).
  • Špatný parametr jádra. Přidáš do /etc/default/grub chybný cmdline a systém přestane bootovat (černá obrazovka, panika). Řeší se v GRUB menu klávesou e — chybný parametr pro tento boot smažeš, nabootuješ, a pak opravíš /etc/default/grub natrvalo.

🚩 Společný vzorec: skoro každý boot problém má záchranný vstup — buď GRUB menu (parametry, starší jádro), nebo emergency/rescue shell. Panika a přeinstalace je skoro vždy zbytečná; systém ti dává nástroj, jak se dovnitř dostat a opravit to cíleně.


🛠️ Cvičení

  1. Změř svůj boot. Zjisti, jak dlouho trval poslední start a která služba brala nejvíc času. (Nápověda: systemd-analyze, systemd-analyze blame.) Který krok — firmware, loader, kernel, userspace — u tebe žere nejvíc?
  2. Najdi svůj výchozí target. Zjisti, jestli tvůj systém startuje do grafiky, nebo do textové konzole, a jak by ses přepnul na to druhé. (Nápověda: systemctl get-default.)
  3. Rozeber GRUB cmdline. Najdi, s jakými parametry se spustilo tvoje běžící jádro, a zkus u dvou z nich odhadnout, co dělají. (Nápověda: obsah /proc/cmdline.)
  4. Naplánuj si záchranu (bez rizika). Popiš krok za krokem, co uděláš, když se ti systém po updatu jádra zasekne na „cannot find root device". Kam sáhneš první? (Nápověda: GRUB → Advanced options.)
  5. Kde bydlí konfig. Najdi soubor, který se edituje pro trvalou změnu GRUBu, a soubor, který GRUB opravdu čte. Proč se ten druhý needituje ručně?
Náčrt řešení — rozbal, až si cvičení zkusíš sám
  1. Měření bootusystemd-analyze vypíše celkový čas rozpadlý na firmware, loader, kernel a userspace; systemd-analyze blame seřadí služby podle času sestupně. Nejpomalejší bývá čekání na síť nebo pomalá služba v userspace. Pozor: blame ukazuje jen dobu jednotlivých služeb, ne závislosti — pro „proč to čekalo" použij systemd-analyze critical-chain.
  2. Výchozí targetsystemctl get-default vrátí graphical.target (startuje do grafiky) nebo multi-user.target (textová konzole). Přepneš sudo systemctl set-default multi-user.target (a zpět graphical.target). Pozor: multi-user je typický pro servery — šetří paměť a plochu útoku tím, že nespouští grafiku.
  3. GRUB cmdline — běžící parametry vidíš v cat /proc/cmdline. Typicky tam bude root=UUID=... (kde je kořenový oddíl), ro (připojit read-only na start), rhgb quiet (skrytý grafický boot bez logů). Pozor: tenhle řádek jádru předal GRUB — trvale se mění v /etc/default/grub, jednorázově klávesou e v menu.
  4. Záchrana po updatu jádra — v GRUB menu jdi do Advanced options a vyber předchozí jádro (to má funkční initramfs) → systém nabootuje → z běžícího systému přegeneruj initramfs sudo dracut --force (a ověř, že disk/LUKS moduly tam jsou). Pozor: nové jádro nemaž, dokud nemáš opravené — starší jádro je tvoje záchranná síť.
  5. Konfig GRUBu — edituje se /etc/default/grub (a soubory v /etc/grub.d/); GRUB reálně čte vygenerovaný /boot/grub2/grub.cfg (u UEFI /boot/efi/EFI/fedora/grub.cfg). Po změně se generuje sudo grub2-mkconfig -o .... Pozor: grub.cfg needituj ručně — příští grub2-mkconfig (třeba automaticky po updatu jádra) ho přepíše a tvoje změny zmizí.

🧠 Otázky & odpovědi

Co se stane od stisku tlačítka po přihlašovací obrazovku

Řetěz předávek. Firmware (UEFI/BIOS) rozjede hardware a najde bootovatelné zařízení. Spustí bootloader GRUB, který nabídne menu, vybere jádro a předá mu parametry. Jádro se načte do paměti a s pomocí initramfs (dočasný systém v RAM) najde a připojí skutečný kořenový oddíl — včetně odemčení LUKS a načtení ovladače disku. Pak se spustí systemd (PID 1), nastartuje default.target a služby, a nakonec naskočí přihlašovací manažer nebo textová konzole. Každý krok předává řízení tomu dalšímu.

K čemu je initramfs a proč nejde bootovat bez něj

initramfs řeší problém vejce a slepice: jádro chce připojit kořenový oddíl, ale ovladač pro ten disk (nebo modul na odemčení LUKS, sestavení LVM/RAID) leží zrovna na tom disku, který ještě nevidí. initramfs je proto malý dočasný systém, který GRUB nahraje do RAM hotový — obsahuje jen ovladače disku a nástroje, aby jádro skutečný kořen našlo, odemklo a připojilo. Jakmile je pravý / připojený, initramfs splnil úkol a mizí. Bez něj by jádro na moderním železe (NVMe, LUKS, LVM) kořenový oddíl nenašlo a boot by se zasekl.

Jaký je rozdíl mezi UEFI a BIOS

Jsou to dvě generace firmwaru — programu, který se po zapnutí spustí jako úplně první. BIOS je starý: souborovým systémům nerozumí, přečte jen prvních 512 bajtů disku (MBR) a tam najde kousek bootloaderu. UEFI je novější: rozumí souborovému systému, takže si na malém FAT oddílu (ESP, obvykle /boot/efi) najde bootloadery jako obyčejné soubory .efi a jeden podle pořadí spustí. UEFI navíc přináší Secure Boot (kontrola podpisu) a elegantnější soužití víc systémů vedle sebe. Zkratka: UEFI hledá soubor, BIOS hledá bajty na začátku disku.

Systém se po startu zasekl v emergency módu, co s tím

Emergency mód nejčastěji znamená chybu v /etc/fstab — systemd čeká na disk, který podle fstab má existovat (překlep v UUID, odpojený disk), nedočká se a shodí tě do záchranného shellu. Přihlas se rootem, otevři /etc/fstab, chybný řádek oprav nebo dočasně zakomentuj (#) a rebootuj. Když se do systému nedostaneš vůbec, přidej v GRUBu (klávesa e) parametr systemd.unit=emergency.target, aby tě systém pustil k holému shellu. Princip: skoro každý boot problém má záchranný vstup — panika a přeinstalace jsou zbytečné.

Jak nabootuju starší jádro a proč by mi to pomohlo

V GRUB menu jdi do podnabídky Advanced options a vyber některé z předchozích jader — distra jich pár po updatu nechávají právě pro tenhle případ. Pomůže to, když nové jádro nefunguje: typicky mu chybí ovladač disku v initramfs (boot se zasekne na „cannot find root device") nebo dělá problém s grafikou. Starší jádro má funkční initramfs, takže nabootuje — a ty máš z běžícího systému čas problém vyřešit v klidu (např. přegenerovat initramfs přes sudo dracut --force). Nové jádro nemaž, dokud není opravené — je to tvoje záchranná síť.