Nebojte se systemd: zbývající konfigurace

18. 7. 2016
Doba čtení: 4 minuty

Sdílet

Další článek ze série odhalující vnitřnosti systemd. Dnes dokončíme povídání o jádru systemd, představíme si generátory, obecnou konfiguraci a nakonec ještě dodatečné možnosti některých typů jednotek.

Generátory

Minule jsme zmínili generátory, které mají v systemd široké použítí. Nejčastěji slouží ke čtení konfiguračních souborů. Pokud používáme rozdělení disků GPT, můžeme jednotlivé oddíly označit jejich funkcí (pole GUID). Systemd je pak automaticky najde a připojí bez nutnosti konfigurace, např. nalezne oddíl pro domovský adresář a připojí jej do /home. Další podporované jsou boot oddíl, root, swap a serverová data určená k připojení do  /srv.

Další použití je pro aktualizace, které se nainstalují při dalším startu. Pokud existuje složka /system-update, Generátor systemd-system-update-generator spustí místo cíle default.target cíl system-update.target. Podobně generátor systemd-hibernate-resume-generator v případě nastavení parametru jádra resume=cesta k uložené hibernaci spustí službu systemd-hiberante-resume@.service, která po hibernaci uvede systém do původního stavu.

Pokud bychom chtěli jednotky vygenerovat znovu (např. po úpravě generátoru), stačí spustit systemctl daemon-reload, který mimo jiné spustí generátory znovu. Samozřejmě v případě disků se změny neprojeví na připojených discích, ale pouze u jednotek. Pokud bychom kupříkladu změnili připojení na pouze ke čtení, musíme oddíl odpojit a připojit, aby se změny projevily.

Obecná konfigurace systemd

Výchozí konfiguraci systemd mohou změnit nainstalované programy umístěním konfiguračního souboru do /usr/lib/systemd/system.conf.d/. Mechanismus přepisování funguje stejně jako v případě přepisu konfigurace jednotek v adresáři jmeno.d. Ještě vyšší prioritu pro konfiguraci má soubor /etc/systemd/system.conf, který je určen pro administrátora. Pokud chceme měnit konfiguraci uživatelského režimu (uživatelský režim je přepnut přepínačem --user), můžeme použít soubor /etc/systemd/user.conf. Možných umístění konfiguračních souborů je ještě více, podrobný popis může čtenář nalézt v  man systemd-system.conf.

Formát konfiguračního souboru je stejný jako ten u jednotek. Parametry nastavujeme v sekci Manager ve formátu na jednu řádku název=hodnota. Ukázkový soubor  /etc/systemd/system.conf:

[Manager]
DefaultTimeoutStartSec=10s
DefaultTimeoutStopSec=10s
DefaultEnvironment=machine=desktop

Níže je popis několika nejdůležitějších parametrů, ostatní jsou opět v manuálové stránce.

DefaultTimeoutStartSec, DefaultTimeoutStopSec
Nastavení maximální doby, po kterou se může jednotka aktivovat/deaktivovat. Poté bude příslušná činnost ukončena. Toto nastavení je možné změnit pro konkrétní službu volbou TimeoutStartSec, resp. TimeoutStopSec. Výchozí hodnota je 90s.
DefaultRestartSec
Prodleva mezi deaktivací a následnou aktivací při restartu jednotky. Výchozí 100ms.
DefaultEnvironment
Nastavení proměnných, které budou mít všechny jednotky. Hodnotou je seznam oddělený mezerami ve tvaru jmeno=promenna. Tedy např.  DefaultEnvironment="PROMENNA1=hodnota s mezerou" PR2=hodnota2
RuntimeWatchdogSec
Při použití této volby se při startu hardwarový watchdog (pokud je k dispozici na daném stroji) nastaví na stanovený interval. Systemd pak alespoň jednou za polovinu této doby watchdog kontaktuje. Pokud během intervalu ke kontaktu nedojde, watchdog restartuje počítače.
LogLevel
Nastavení úrovně logování. Hodnota může být buď číslo nebo jedna z hodnot: emerg, alert, crit, err, warning, notice, info, debug. Logovány budou všechny události, které mají alespoň takovou prioritu, jako je hodnota tohoto nastavení. Výchozí je info.

Doplňující konfigurace typů služba, socket, mount, swap

Pro tyto typy existuje ještě další konfigurace týkající se spouštění jednotek (uvedená v man systemd.exec). První je parametr WorkingDirectory. Hodnotou je absolutní cesta, popř. vlnka (~), která zastupuje domovský adresář uživatele, s jehož právy jednotka běží. S tím souvisí User a Group . Jejichž hodnotou je buď jméno, nebo ID. Pokud není určena skupina, použije se výchozí daného uživatele.

Volbou StandardInput můžeme nastavit, kam bude připojen file deskriptor 0 spuštěného procesu. Možné hodnoty jsou null, v tomto případě bude přesměrován do /dev/null. Pokud je služba spouštěna socketem a je nastaven právě jeden socket, můžeme nastavit StandardInput=socket a na stdin bude přesměrován tento socket. Příklad služby move2tmp.service z minula bychom tedy mohli napsat následovně:

move2tmp.service

[Service]
ExecStart=/bin/sh -c "cat >> /tmp/ab"
StandardInput=socket

move2tmp.socket

ListenFIFO=/tmp/socket

Pokud nastavíme parametr TTYPath, kde hodnotu je terminál. Můžeme standardní vstup nastavit na tty, tty-force, tty-fail, které v různých obměnách nastaví terminál z TTYPath jako stdin.

Co se týče StandardOutput a StandardError mimo výše zmíněných jsou možné hodnoty inherit, který jen přesměruje stdin na stdout. Hodnotami journal, syslog, kmsg můžeme nastavit výstup do logů journalctl, syslog, kmsg. Analogicky funguje i parametr StandardError.

Dalším zajímavým nastavením je parametr PrivateTmp. Když je nastavený na true, jednotka dostane připojený vlastní /tmp a /var/tmp, což se může hodit například při riziku kolize dočasných souborů. Pomocí parametrů ReadOnlyDirectories a InaccessibleDirectories můžeme specifikovat, které složky bude mít jednotka pouze pro čtení a které jí budou nedostupné. Nastavením ReadOnlyDirectories=/home/knezi tak zabráníme změně dat uživatele knezi.

bitcoin_skoleni

Také je možné omezovat systémové zdroje jednotek. Např. parametrem MemoryLimit=2G nastavíme, že jednotka může alokovat maximálně 2 GB paměti RAM. Podobně CPUQuota=20% říká, že daná jednotka bude mít k dispozici maximálně dvacet procent procesorového času. Další typy omezení jsou v man systemd.resource-control  a jsou společné pro typy slice, scope, služba, socket, mount a swap.

Tím jsme probrali celou konfiguraci systemd. Příště si představíme některé nástroje (jako např. journal), které jsou součástí systemd.

Autor článku

Autor studuje na Matematicko-fyzikální fakultě. Ve svém volném čase se kromě Linuxu věnuje také vlastní 3D tiskárně.