Nebojte se systemd 5: cíle

Jak jsme si již řekli, cíle (target) jsou typem jednotky, které nahrazují běhové úrovně. Cíl je jakási virtuální služba, která má definované závislosti, ale při spuštění neobsluhuje žádný program.

Při startu počítače se „spustí“ cíl, což znamená, že se spustí všechny jeho závislosti. Poté, co jsou spuštěné, je cíl považován za dosažený.

K dosažení daného cíle slouží příkaz isolate. Toto je jeden z mála příkazů, který doplňuje příponu .target místo .service, protože konfigurační soubory cíle se vytvářejí s touto příponou.

Při spuštění systemctl isolate graphical.target se vypnou všechny jednotky, které graphical.target (sloužící pro spuštění grafického prostředí) nemá nastaveny jako závislosti. Poté se spustí všechny závislosti (ve výchozím nastavení mají všechny jednotky zároveň nastavený parametr After, tedy musí být všechny považované za spuštěné, než je dosažen daný cíl). Pozor na to, že zastaveny budou opravdu všechny nepotřebné jednotky, tedy může být zastaven i shell, ze kterého je příkaz isolate spuštěn.

Konfigurační soubory

Cíle nemají žádné speciální konfigurační volby. Jejich odlišení je hlavně z důvodu přehlednosti. Je teoreticky možné vytvořit službu, která se bude chovat stejně jako cíl. Proto neexistuje speciální sekce Target. V sekci Unit je důležitý parametr AllowIsolate, který musí být nastaven na true, aby bylo možné dosáhnout daného cíle příkazem isolate. Kromě toho je možné nastavit cestu k dokumentaci, konfliktní jednotky a závislosti stejně, jako tomu je u služeb. Jen pozor na to, že při selhání libovolné závislosti nastavené parametrem Require, příkaz isolate selže a daný cíl nebude dosažen.

V sekci install nedává smysl použít parametr WantedBy pro instalaci. Tato sekce se používá především pro vytvoření aliasů. V systemd je např. cíl ctr-alt-del.target, který se spustí v případě stisknutí této klávesové zkratky. Standardně má cíl poweroff.target nastaven v sekci Install parametr Alias=ctrl-alt-del.target a tedy při stisku klávesové zkratky Control+Alt+Delete dojde k vypnutí počítače.

Speciální cíle

Systemd má několik speciálních jednotek (jejich seznam viz man systemd.special). Speciální jednotky mají definováno, co přesně dělají. Tyto definice se vztahují ke jménům, proto nemohou být přejmenovány. Některé jsou virtuální – nemají žádný konfigurační soubor, ale přesto je s nimi možné pracovat jako se standardními jednotkami (včetně nastavování takových jednotek jako závislosti, jejich pouštění…). I virtuální jednotky je samozřejmě také možné přepsat vlastní konfigurací, či ji jen pozměnit vytvořením složky jmeno.d, jak jsme si ukázali ve třetím dílu.

Všechny cíle, které si představíme, jsou považovány za speciální, protože mají pevně definovaný neměnný název. Příkladem je jednotka ctrl-alt-del.target. Pomocí konfiguračních souborů by bylo velmi obtížné zajistit, aby se tato jednotka spustila právě při stisku Ctrl+Alt+Delete, proto má systemd v sobě zadrátovanou obsluhu této události jako dosažení speciálního cíle. Důležité cíle jsou představeny níže, další jsou v  man systemd.special:

poweroff.target
Cíl sloužící pro vypnutí počítače, aliasem tohoto cíle je runlevel0.target.
reboot.target
Restartování počítače – alias runlevel6.target
runlevel2–5.target
Tyto cíle existují z důvodu zpětné kompatibility se SysV. Jsou spouštěny pouze z důvodu zpětné kompatibility pro starší software. Je doporučeno, aby byly vytvořeny jako aliasy pro ostatní cíle (2–4 multi-user a 5 graphical). Rozhodně ale nemusí existovat (např. na autorově Arch Linuxu).
suspend.target, hibernate.target
Jsou cíle, jak název napovídá, pro uspání počítače do operační paměti a na disk.
basic.target
Tento cíl má na starosti základní nastartování počítače. Zajistí připojení lokálních disků, swapu, /tmp. Dále spustí časovače (timers – náhrada cronu, viz následující díly) a nějaké další akce nutné ke spuštění počítače.
default.target
Tento cíl je dosažen po nastartování počítače. Typicky tedy bývá nastaven na graphical.target nebo multi-user.target. Příkazem systemctl get-default je možné zjistit, kam tento cíl míří. Přikaz systemctl set-default cil pak výchozí cíl změní. Dočasně je možné výchozí cíl změnit při spuštění linuxového jádra s parametrem systemd.unit.
emergency.target
Z názvu je patrné, k čemu slouží. Je vytvořena jako speciální, aby pro dosažení tohoto cíle byla potřebná jen základní funkcionalita systému. Standardně pouze nastartuje systémový manažer (proces s PID 1) a shell. Zde se může hodit nastartovat počítač přímo do emergency módu pomocí parametru kernelu systemd.unit=emergency.target (popř. jen systemd.unit=emergency).
rescue.target
Podobné jako emergency.target, s tím rozdílem, že spustí základní systém včetně připojení disků. Alias této jednotky je runlelevel1.target
local-fs.target
Tento cíl má jako závislosti nastaveny všechny připojované disky. Je tedy možné jej nastavit jako závislost, pokud potřebujeme pracovat se všemi disky.

Pro uspání počítače můžeme zavolat příkaz systemctl isolate suspend. Systemd kromě toho ještě nabízí speciální příkazy pro některé cíle. Např. systemctl suspend aktivuje cíl suspend. Pro vypnutí a restart slouží příkazy systemctl poweroff a systemctl reboot, ty kromě samotné aktivace cíle ještě vypíší do shellu informaci o vypínání/restartu počítače a zajistí, aby tento cíl nemohl být konfliktní se žádným jiným a opravdu tak došlo k požadované operaci. Stejně tak fungují příkazy default, emergency, rescue, hibernate.

Inhibitory

Při spouštění některých operací může být nežádoucí dosáhnout nějakého cíle (kupříkladu při vypalování CD nechceme vypnout počítač). K ošetření tohoto slouží tzv. inhibitory. Spuštěný program může vytvořit zámek, který bude blokovat aktivaci definovaných cílů. Zámky jsou dvojího typu – delay, který odloží aktivaci (to se může využít např. k vyprázdnění cache, aby uspání počítače netrvalo tak dlouho). Druhým je block, který když je nastaven, aktivace daného cíle okamžitě selže s chybou. Systemd kromě samotného API nabízí i program systemd-inhibit. Typ zámku nastavíme přepínačem --mode={block,delay}, informace o tom, který program a proč blokuje, přepínači --who --why, které operace chceme blokovat pomocí --what (nejdůležitějšími jsou shutdown a sleep) a nakonec napíšeme svůj příkaz. Vypnutí při aktualizaci můžeme blokovat příkazem:

systemd-inhibit --what=shutdown --mode=block --who="pacman" --what="Update of system" pacman -Syu

Pokud bychom chtěli inhibitory z nějakého důvodu ignorovat, přidáme do příkazu pro aktivaci cíle přepínač -i (např.  systemctl suspend -i).

Tím jsme vyčerpali dnešní téma. Příště si představíme zbylé typy jednotek.

Zdroj: https://www.root.cz/clanky/nebojte-se-systemd-cile/