OpenRC: dvakrát rychlejší boot

29. 9. 2008
Doba čtení: 6 minut

Sdílet

Tímto článkem bych rád volně navázal na již existující seriál zabývající se distribucí Gentoo a uvedl pár tipů a triků, jak zrychlit bootování systému. K tomu potřebujeme Baselayout ve verzi 2.0.0, který využívá systém OpenRC. Bootovací čas se v některých případech sráží až na polovinu, a to stojí za vyzkoušení.

Bootování

Bootovací proces v Gentoo nebyl nejmodernější a nejrychlejší, ale vývojáři pracují (není ve stable) na novém init systému, který ledasco mění. Ale abych nepředbíhal. Vynecháme-li cestu od zmáčknutí tlačítka až po načtení Grubu/Lila, dostaneme se k nabíhání jádra. Tato procedura se napříč distribucemi moc neliší. Jádro se načte do pamětí, najde si ovladače, zpracuje initrd, najde disky a dostane se k části, kdy namountuje root systému (/) a spustí proces init. V tuto chvíli se distribuce začínají odlišovat.

Pokud proces zobecníme, tak se se init proces postará o spuštění několika programů „login“ na virtuálních konsolích nebo třeba i na sériovém portu. Dále uvede do chodu systém tzv. initskriptů. Ty nastaví prostředí operačního systému, tak aby nám co nejvíce vyhovovalo, spustí daemony (web severy, databázové servery, …) a také spustí Xka.

Tento poslední krok má v Gentoo velký potenciál s novým OpenRC init systémem. Nejmarkantnější výhodou je zmenšení času přibližně na polovinu. Velmi dobré porovnání s podrobnými grafy lze nalézt na tomto blogu.

Baselayout

S jiným init systémem se mění i jeden důležitý balíček s názvem Baselayout. Obsahuje prakticky základní strukturu systémových adresářů, bez kterých by systém nemohl pracovat.

  • /etc
  • /var
  • /usr
  • /home

Proč tomu tak je vysvětlím bodu níže.

OpenRC

Startem programu „/sbin/init“ začíná práce pro OpenRC. Původní init systém v Gentoo je napsaný v bashi. Na některých platformách se použití bashe začalo stávat nepohodlné. Proto Roy Marples začal vyvíjet OpenRC. Ten je napsaný v čistém C, plně kompatibilní se starými initskripty.

Jelikož se do OpenRC některé nekompatibility dostaly, musel se nahradit i baselayout. Soubory pro nastavení bootování se změnily. Například „/etc/conf.d/rc“ už neplatí a jeho funkčnost přešla na „/etc/rc.conf“. Dalším takovým důležitým souborem je „/etc/modules­.autoload.d/ker­nel-2.*“. Bez ohledu na jádro se teď moduly, které se mají zavést, uvádějí v „/etc/conf.d/mo­dules“.

Migrování za rychlejším bootem

Hned z kraje musím říct, že jakékoli selhání během instalace Baselayoutu nebo OpenRC vede k uvedení systému do nebootovatelného stavu.

Před samotným přechodem

Než začneme, je dobré mít po ruce bootovatelnou USB flashku nebo live CD, ze kterého budeme moci vrátit zpět, co se nepovedlo.

Přechod

Přechod uskutečníme odmaskováním OpenRC a Baselayout-2.0.0 a následnou instalací a kompilací.

echo "sys-apps/baselayout ~x86" >> /etc/portage/package.keywords
echo "sys-apps/openrc ~x86" >> /etc/portage/package.keywords
emerge -av baselayout openrc 

Na co si dát pozor

  • Na nastavení modulů.
  • Úprava závislostí služeb v /etc/rc.conf.
  • Změna /etc/hostname po nainstalování Baselayout 2.0.0.
  • Neodmaskovávat OpenRC pomocí .
  • Spustit po kompilaci dispatch-conf.
  • Kontrola nastavených initskriptů (rc-status).

Stručný popis /etc/rc.conf

Chování OpenRC se ovlivňuje v souboru „/etc/rc.conf“, který vychází z původního „/etc/conf.d/rc“. Většina voleb je podobná jejich starším variantám, některé jsou nové. Pár jich rozvedu podrobněji, protože jsou z pohledu budoucích uživatelů zajímavé a mohou být důležité při rozhodování o přechodu.

rc_parallel

Gentoo má systém závislostí initskriptů, takže umožňuje startovat služby paralelně. Tyto závislosti jdou dále upravovat (viz níže). Oznamující zprávy z OpenRC začínají vždy názvem initskriptu, takže při bootování lze hezky sledovat, jak se spouštění initskriptů míchá. Volba je ve výchozím stavu vypnuta, protože by mohla u některých služeb dělat problémy. Na čtyřech strojích, na které jsem OpenRC nasazoval, ale funguje bez problémů.

rc_depend_strict

Tato volba se nejvíce uplatní u sítí. Pokud máme dvě síťové karty a ke každé initskript (např. net.eth0 a net.eth1), tak s hodnotou YES nastartují služby závisející na síťovém spojení, pouze pokud nastartují obě tyto rozhraní. U hodnoty NO stačí pouze jedno z nich.

rc_hotplug

Pokud tato volba obsahuje hodnotu YES, OpenRC reaguje na změny v hardwaru. Například při nahození síťového rozhraní spustí příslušný initskript. Hodnota NO toto chování vypne.

rc_plug_services

Hotplug se dá ovlivňovat za pomocí rc_plug_services. Například pokud při startu nevíme, které daemony budeme v průběhu práce potřebovat, tak tady můžeme zakázat automatické spuštění vybraných initskriptů hotplugem. Typické použití může být, když se připojujeme do sítě několika způsoby (WiFi, mobil, ethernet) a chceme si vybrat, který z nich to bude až po startu operačního systému. Gentoo totiž nahazuje ethernet a WiFi karty i v případě, že nejsou uvedeny v jednom z boot levelů. Toto nastavení lze provést například následujícím způsobem:

rc_plug_services="!net.eth0 !net.ppp0 !net.wlan0"
nebo
rc_plug_services="!net.* net.lo" 

Změna závislostí

Úprava initskriptů kvůli změně závislostí není nejčistší řešení, a proto OpenRC přichází s možností ovlivnit závislosti startovaných initskriptů.

rc_<initskript>_config         Konfigurační soubor pro OpenRC
rc_<initskript>_need           Které initskripty jsou nutné pro spuštění
rc_<initskript>_use            Které initskripty jsou dále používány
rc_<initskript>_after          Po kterých initskriptech se má initskript spustit
rc_<initskript>_before         Před kterými initskripty se má initskript spustit
rc_<initskript>_provide        Úprava závislostí v initskriptu 

Dokumentace pro tyto volby je dost chabá, proto vycházím z informací, které jsem různě posbíral po mailinglistech a fórech a ty nemusejí být úplně přesné.

Tečka v názvu initskriptu se nahrazuje v zápisu volby podtržítkem. Např. net.eth0 bude net_eth0.

rc_devices

V „/etc/rc.conf“ lze také nastavit, který způsob správy adresáře „/dev“ se má použít. Na výběr jsou 4 možnosti.

devfs    použít devfs
mdev     použít mdev z busyboxu
udev     použít udev
static   ruční správa nodů 

rc_device_tarball

Poslední volba, kterou zmíním je zapnutí komprese adresáře „/dev“ při vypnutí systému a následovném rozbalení při zapnutí systému. To se hodí u velkého množství vlastních nodů.

Měření

Měření jsem prováděl 3× a v tabulce jsou napsané průměrné hodnoty. Většina hodnot vycházela +-2 sekundy, takže jediné, čím byly hodnoty ovlivněny, byla rychlost mého prstu na stopkách. Grub byl nastaven na timeout 2 sekundy.

POST screen 17.89 sec.
Starý init systém (včetně POST) 42.5 sec.
Starý init systém (od Grubu) 25.38 sec.
OpenRC (včetně POST) 33.48 sec.
OpenRC (od Grubu) 13.13 sec.

Testovací stroj byl PIII a jeho POST screen nepatří k nejrychlejším, proto je výsledný celkový boot rychlejší přibližně pouze o jednu čtvrtinu. Novější stroje mají POST screen maximálně několik sekund, takže tam už je rozdíl znát. Pokud vezmeme výsledky bez POST screenu, je zrychlení skoro dvojnásobné a na lepší desce můžeme mít prakticky do dvaceti sekund naběhnutý systém připravený pro přihlášení.

Na testovacím stroji nebyla nainstalována Xka, takže jsem stopky vypínal při zobrazení textového loginu. Výsledky se shodují s dalšími testy, které se dají najít na internetu. Taktéž uvádějí zrychlení přibližně dvojnásobné.

bitcoin_skoleni

Závěr

Gentoo se díky OpenRC řadí mezi distribuce s nejrychlejším bootovacím procesem. Nutno podotknout, že paralelní start služeb mají jiné linuxové systémy již delší dobu, a tak se ve světě bootování nejedná o žádný převratný nápad. Vývojářům Gentoo se ale implementace tohoto systému povedla; nezbývá než doufat, že se jim bude dařit i dál.

Čas bootování se často uvádí v testech nejrůznějších distribucí. Existují uživatelé, pro které to je důležité kritérium, a pak uživatelé, kteří svoje stroje vypínají jednou za čas. Každý z nich se na tento problém bude dívat z jiné strany a někdo bude jistě preferovat stabilitu před rychlostí. Přechod na OpenRC probíhá sice bezproblémově, ale každý podobný zásah znamená riskování systému a jak už jsem zmínil, velmi doporučuji si před tímto krokem připravit si bootovatelné live CD nebo USB flashku.

Další odkazy

Je pro vás rychlost bootu jedním z důležitých bodů pro výběr distribuce?

Autor článku

Adam Štrauch je redaktorem serveru Root.cz a svobodný software nasazuje jak na desktopech tak i na routerech a serverech. Ve svém volném čase se stará o komunitní síť, ve které je již přes 100 členů.