Vitajte späť pri seriáli o systemd, kde sa snažíme skúmať hlbšie, ako funguje táto centrálna časť vášho systému Fedora. V tejto časti si povieme o unit súboroch.

Ako dlhoročný užívateľ systému Fedora som až donedávna veľmi nepremýšľal o tom, ako vlastne systemd funguje. Systemd je rozčlenený tak, aby komponenty vášho systému mohli byť jednoduchšie spravované. Systemd používa unit súbory na konfiguráciu a spravovanie systémových prostriedkov ako sú procesy a váš súborový systém. Používaním týchto súborov môžete donútiť službu systemd, aby spravovala váš systém Fedora spôsobom, ako to chcete vy.

Unit súbory: čo vlastne sú?

Unit súbory vo vašom systéme určujú, ako bude systemd štartovať a bežať. Každý korešponduje s jednou činnosťou alebo komponentom - alebo unit v terminológii systemd. Každý unit súbor je jednoduchý textový súbor opisujúci unit; to čo robí, čo potrebuje pre spustenie predtým alebo potom a iné detaily.

Unit súbory môžu byť uložené na niekoľkých miestach vo vašom systéme. Systemd hľadá system unit súbory v tomto poradí:

1. /etc/systemd/system
2. /run/systemd/system
3. /usr/lib/systemd/system

Unit súbory zo starších adresárov sú prepisované novšími. Toto je užitočná schéma, pretože vám umožní uskutočňovať zmeny v adresári /etc, kde je nastavovanie očakávané. Mali by ste sa však vyhnúť zmenám v /usr. Váš systém tam inštaluje dáta z balíčkov, ktoré by sa nemali meniť.

Systemd môže tiež bežať v kontexte užívateľa a spravovať tak prostriedky na úrovni užívateľa mimo systémovej úrovne. Unit súbory pre užívateľské units sú uložené podobne v /etc/systemd/user, /run/systemd/user a /usr/lib/systemd/user. Poradie priority funguje podobne.

Môžete preskúmať niektoré podrobnosti o týchto unit súboroch použitím príkazu systemctl. Ak chcete vidieť zoznam všetkých unit súborov nainštalovaných v systéme, spustite tento príkaz:

systemctl list-unit-files

Každý unit súbor obsahuje voľby vo forme OptionName=value, rozdelené do sekcií označených ako [SectionName]. Tieto voľby popisujú, ako unit pracuje a ako ho systemd vybavuje.

Existuje mnoho typov units, ktorým systemd rozumie. Dva najbežnejšie na vybavenie pre vlastníkov systému sú servisné units a cieľové units. Pre vypísanie všetkých týchto typov unit súborov na vašom systéme použite príkaz systemctl:

systemctl list-unit-files --type service
systemctl list-unit-files --type target

Servisné units

Jedná sa o units, ktoré popisujú proces, ktorým sa systemd môže naštartovať a monitorovať. Servisné units sú najbežnejšie units, ktoré budete denne používať. Sú riadené použitím systemctl ako pod účtom root:

sudo systemctl [command] NAME.service

Typické príkazy zahŕňajú:

start: spustí systemd jednotku
stop: pokúsi sa o "slušné" zastavenie služby
status: poskytuje podrobné informácie o službe
restart: reštartuje (zastaví a opätovne spustí) špecifickú službu
enable: pripojí (nalinkuje) jednotku na rozličné miesta, napríklad spustenie pri bootovaní
disable: rozpojí (odlinkuje) jednotku, takže nie je aktivovaná

Nasledujúci príklad je unit súbor sshd.service. Umožňuje, aby systemd mohol riadiť sshd démon, ktorý povoľuje vzdialený prístup k vášmu systému cez SSH (Secure Shell).

[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

Tento unit obsahuje zároveň niektoré spoločné možnosti unit súboru a tiež špecifické možnosti servisnej unit. Spoločné možnosti, ktoré tu vidíme, zahŕňajú popis a kde je možné nájsť dokumentáciu. Samozrejme unit súbor obsahuje viac než je možné vysvetliť v tomto článku. Ale ako môžete pravdepodobne zistiť z voľby ExecStart, tento unit zabezpečuje beh sshd démona, keď sa naštartuje.

Procesy vlastnené službou

Zaujímavou vlastnosťou systemd je to, že monitoruje procesy, ktoré naštartuje spolu so service units. Pre zistenie, aké procesy sú monitorované, použite príkaz systemctl status. Napríklad tu je výstup z toho príkazu pre zistenie statusu sshd.service unit:

● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2015-10-20 14:51:24 EDT; 1 weeks 0 days ago
   Docs: man:sshd(8)
         man:sshd_config(5)
   Main PID: 1090 (sshd)
   CGroup: /system.slice/sshd.service
           └─1090 /usr/sbin/sshd -D

Môžeme tu vidieť, že proces spustený touto službou má process ID (PID) 1090. Tento proces bude aj naďalej monitorovaný prostredníctvom systemd.
Všimnite si tiež, že služba umiestnila tento proces do špeciálne pomenovanej control group. Control group (alebo "cgroup") umožňuje v systemd spravovať súvisiace procesy spoločne. V budúcich článkoch seriálu budeme skúmať, ako vám táto vlastnosť umožňuje optimalizovať výkon vzhľadom na limity zdrojov.
Vďaka poznaniu procesov, ktoré sú vlastnené touto službou, systemd vám tiež môže pomôcť spravovať blúdiace služby. Zvyčajne, keď zastavíte službu, použijete príkaz systemctl, ako to bolo spomenuté vyššie. Napríklad pre zastavenie služby webového servera:

systemctl stop httpd.service

Ale čo ak služba neodpovedá alebo nespolupracuje? V takom prípade má príkaz systemctl vstavaný prepínač kill:

systemctl kill http.service

Cieľové units

Cieľové units sa používajú na prepojenie a zoskupenie iných units dohromady na popísanie požadovaného stavu systému. Niektoré z týchto units môžu byť služby. Iné môžu byť doplnkové cieľové units s ich vlastnými units skupinami.

Tu je príklad, unit súbor multi-user.target.

[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes

Všimnite si, že tento cieľový unit súbor neobsahuje príkaz na spustenie. Ale naopak funguje čisto ako cesta pre pripojenie iných units dohromady (v tomto prípade hlavne cieľových). Čiže v tomto prípade:

multi-user.target vyžaduje úspešný beh basic.target počas behu multi-user.target.
Ak bežia rescue.service alebo rescue.target, spôsobia zastavenie tejto unit a naopak.
unit multi-user.target sa spustí až keď naštartuje basic.target a až keď bežia rescue.service a rescue.target, ak sú spustené.

Okrem toho tento cieľový unit obsahuje voľbu AllowIsolate. Táto voľba umožňuje vášmu systému zaobchádzať s multi-user.target unit ako bootavacím cieľom a to použitím príkazu systemctl isolate.

Cieľové units zoskupujú iné units dohromady a to nielen s ich obsahom unit súboru. Cieľ môže tiež mať .wants priečinok, ktorý odkazuje na units, ktoré budú štartovať spolu s cieľom. Napríklad súbor /usr/lib/systemd/system/multi-user.target má súvisiaci priečinok /usr/lib/systemd/system/multi-user.target.wants. Tento priečinok obsahuje linky k units (nielen služby ale taktiež aj iné ciele), ktoré budú spustené, keď bude bežať tento cieľ. Každý z nich môže mať svoje svoje vlastné závislosti, alebo tiež voľby unit súboru ako vyššie spomenuté Requires v príklade.

Užitočné odkazy

Pre hlbšie oboznámenie sa s problematikou spoločných volieb unit sekcie si môžete prečítať manuálové stránky súvisiace s units:

man systemd.unit

Existujú aj špecifické súbory s dokumentáciou pre service a target súbory. Môžete si ich prečítať zadaním týchto príkazov:

man systemd.service
man systemd.target

Ak by ste sa chceli dozvedieť viac o procesnom a control group manažmente v systemd, odkazujeme na tento užitočný príspevok na blogu.

Článek původně vyšel na webu fedoramagazine.org a autorem je Ryan Lerch.