Hlavní navigace

Bootovací ramdisky připravené v distribuci díky mkosi-initrd

21. 9. 2022
Doba čtení: 6 minut

Sdílet

 Autor: Depositphotos
Současné bootování Linuxu je postavené na inicializačních ramdiscích, které jsou vytvářeny pro každý stroj individuálně. To komplikuje jejich správu a znemožňuje kontrolu kvality. Změnit to má mkosi-initrd.

Jak to funguje teď

Většina dnešních linuxových distribucí uživateli dodává sestavené a připravené monolitické linuxové jádro, které nastartuje na široké skupině počítačů. Toto jádro obsahuje nejběžnější funkcionalitu potřebnou k základnímu rozběhu systému.

Nemůže ale obsahovat všechny dodávané moduly, protože takové jádro by bylo zbytečně obrovské a většina jeho funkcí by se stejně nikdy nevyužila. Navíc by mohlo docházet k různým problémům při snaze obsluhovat veškerý podporovaný hardware, který by v dané sestavě nebyl dostupný.

Proto Linux využívá takzvaných inicializačních ramdisků, což jsou předem připravené soubory, které se načtou do paměti společně s jádrem. Tyto ramdisky nejsou dodávány v operačním systému a nenajdete je tedy v žádném z balíčků. Vytvářejí se až na konkrétním stroji, podle jeho současné hardwarové a softwarové konfigurace.

Ramdisky obsahují doplňkové moduly pro linuxové jádro, potřebný software, skripty, konfiguraci a prostě vše, co bude potřeba pro zavedení samotného systému. Ten může být uložen na diskovém poli, může být šifrovaný nebo dostupný jen po síti. V takové situaci je potřeba prostředí pro boot připravit a právě k tomu slouží inicializační ramdisk. Ten je spuštěn z paměti, provede vše potřebné, připojí systémový disk a začne boot operačního systému.

V Linuxu existují dvě implementace inicializačního ramdisku: starší initrd a novější initramfs. Základem initrd je obraz se skutečným souborovým systémem, který je připojen do /dev/ram a připojen (mount) jako kořenový svazek. Initramfs místo toho používá komprimovaný archiv cpio a jádro tedy nepotřebuje mít pro jeho použití zaveden žádný ovladač souborového systému.

Proč to není dokonalé

Zmíněný inicializační ramdisk se sestavuje na cílovém stroji a je tedy pro každou instalaci unikátní. Při každé instalaci nového balíčku s jádrem je pak potřeba ramdisk znovu vygenerovat, stejně tak jako při větší změně konfigurace. Tato činnost je obvykle částečně automatizována balíčkovacím systémem, který příslušné skripty spouští při aktualizacích sám.

Nevýhodou takto individualizovaných ramdisků je pak to, že nemohou být podepsané distributorem, nedají se centrálně testovat na kvalitu a vývoj funkcí pro ně často duplikuje práci odváděnou v samotném systému. Nástroje pro sestavování ramdisků totiž dělají velmi podobnou práci jako balíčkovací systém při sestavování nového balíku nebo znovu implementují například zavádění polí RAID nebo LVM.

Takto sestavovaný ramdisk také vyžaduje poměrně složitou a komplexní infrastrukturu v každém nainstalovaném operačním systému, protože je potřeba výsledek sestavovat znovu a znovu. Kromě jiného to také zdržuje instalaci nových balíčků, protože sestavení ramdisku nějakou dobu trvá.

Výsledek také nemůže být reprodukovatelný, protože existuje obrovské množství variant, které mohou při sestavování vzniknout. Bylo by užitečné, kdyby mohl ramdisky distribuovat tvůrce distribuce, stejně jako to dělá s linuxovým jádrem.

Hotové ramdisky s mkosi-initrd

S řešením přišel Zbigniew Jędrzejewski-Szmek, vývojář z Red Hatu, který svůj projekt představil v rámci Linux Plumbers Conference. Jedním z cílů nového přístupu k inicializačnímu ramdisku je snížení komplexity, protože mkosi-initrd využívá běžný balíčkovací systém, již připravený init ze systemd a staví na standardním rozhraní systémových služeb. Vytvoříme tak úplně normální očekávané uživatelské prostředí s adresáři jako /proc nebo /sys, vysvětluje autor.

Sestavování obrazů pro ramdisky může díky novému přístupu probíhat přímo u dodavatele operačního systému, který takto vytvoří reprodukovatelné řešení, které bude možné společně s linuxovým jádrem podepsat jako jeden celek. K hlavnímu obrazu bude existovat sada dalších doplňkových, které budou také podepsané. Výsledek bude o něco větší než současný ramdisk, ale nebude to nic šíleného.

Zjednoduší se také správa chyb týkajících se bootu. Když dnes uživatel nahlásí vývojářům problém s bootováním, je potřeba celou věc analyzovat a zjistit, zda je problém v nástrojích pro sestavování ramdisku, nebo je chyba v konkrétním sestavení, nebo se problém týká nějaké další komponenty. Je to složité, proto se těmito chybami nikdo nechce zabývat.

System Extensions na scéně

Nový mkosi-initrd bude stavět na už existujících System Extensions (systemd-sysext), což jsou obrazy disků, které umožňují za běhu doplnit do systémového disku další soubory. To se hodí u neměnných systémů, na jejichž oddíl není možné zapisovat. Extensions umožňují zavést další obraz disku a pomocí OverlayFS přidat do hierarchie další položky. Jakmile je obraz deaktivován, položky zase zmizí.

Soubor pro sysext je vlastně obraz disku používající GPT (GUID Partition Table) se třemi oddíly: samotný souborový systém tvořený komprimovaným SquashFS, dm-verity pro ověření konzistentnosti dat a podpis těchto dat ve formátu JSON. Není to nic složitého a jádro tomu rozumí. Připojí se to jako loopback a můžete to rovnou používat.

Uživatelé například často chtějí, aby se při problémech s bootem spustil SSH server, ke kterému se pak je možné vzdáleně připojit a začít situaci řešit. Můžete si tak představit Extension, která bude obsahovat třeba soubory pro záchranný režim, dokáže nastavit síť a spustit sshd. Stejně tak je možné vytvořit sadu modulů pro nestandardní úložiště, ze kterého je potřeba bootovat: iSCSI, NFS, RAID, Clevis a podobně.

V takovém prostředí je pak možné snadno vytvořit například plně grafické rozhraní nebo spustit plnohodnotný zvukový subsystém. Vypadá to šíleně, ale má to své důvody. Hodí se to například uživatelům se zrakovým postižením, kteří musejí i v záchranném režimu počítače používat silně upravené uživatelské prostředí.

Současný stav

V současné době už funguje nástroj mkosi-initd, který vytváří zmíněné obrazy z běžných distribučních balíčků. Automaticky stáhne vše potřebné, nainstaluje a vytvoří obraz. Ten může být buď ve zmíněném formátu GPT určeném pro System Extensions nebo je možné vytvořit klasický archiv cpio.

V současné době funguje integrace pro distribuci Fedora, autor přislíbil doplnění možnosti využití v dalších distribucích. Utilita umí na pozadí použít libovolný balíčkovací systém jako dnf, apt, pacman, zypper nebo cokoliv dalšího. V současné době podporujeme Fedora, CentOS, RHEL, Mageia, OpenMandriva, Debian, Ubuntu, Arch, openSUSE a Gentoo. Není problém přidat další. Celou infrastrukturu je možné sdílet napříč distribucemi.

Sestavování je možné snadno řídit pomocí konfiguračních souborů a úpravou používaných skriptů. Vývojáři distribuce tak mohou cíleně měnit, jak bude výsledný obraz vytvořen. Nástroj také podporuje vytváření přírůstkových obrazů, takže je možné už existující souborový systém rozšiřovat o další moduly. Můžete sestavit první obraz s initrd a pak pokračovat tvořením dalších vrstev se System Extensions.

Podle autora nakonec nebylo vytvoření nového nástroje tak pracné, jak to na začátku vypadalo. Myslel jsem, že to bude spousta práce, ale mnohem složitější se ukázala úprava ostatních nástrojů a integrace, aby bylo možné to snadno používat.

Jádrem projektu je především sada konfiguračních souborů pro utilitu mkosi, seznam balíčků pro sestavení základního initrd, skript mkosi.finalize pro nastavení obsahu /etc/initrd-release a konfigurační soubory pro sysext. V současné době se obrazy zatím nesestavují centrálně, ale u každého uživatele zvlášť. Součástí nástrojů je také integrace do balíčkovacího systému, která při instalaci nového jádra spustí celý proces sestavování.

speciál kyberútoky

Výhodou tohoto nového přístupu je jeho jednoduchost, protože používá už existující balíčkovací systém včetně závislostí. Balíčky jsou podepsané a mají kontrolní součty pro každý soubor, který obsahují. Devadesát procent veškeré práce pro nás odvede balíčkovací systém, nepotřebujeme tahat soubory z hostitelského systému. Výsledkem je také běžný operační systém v paměti, takže se uživatelé nemusejí učit používat speciální prostředí opatřené nestandardními utilitami a skripty.

Výsledné obrazy jsou reprodukovatelné a všichni uživatelé mají možnost používat stejný inicializační ramdisk. Když se objeví chyba, víme přesně, co uživatel v danou chvíli spouštěl. Zodpovědnost za chyby je jasně dána, protože obrazy budou mít svého tvůrce, který se může chybou zabývat, stejně jako je to u jiných balíčků.

Odkazy

Autor článku

Petr Krčmář pracuje jako šéfredaktor serveru Root.cz. Studoval počítače a média, takže je rozpolcen mezi dva obory. Snaží se dělat obojí, jak nejlépe umí.