Četl jsem, že existují dvě složky pro soubory jednotek (ne v uživatelském režimu).
/usr/lib/systemd/system/: units provided by installed packages
/etc/systemd/system/: units installed by the system administrator
V rozporu s tímto chápáním je odpověď na tuto otázku:Jak napsat spouštěcí skript pro Systemd. Může někdo doplnit chybějící informace, abych pochopil, co se děje? (AKTUALIZACE:Odpověď byla aktualizována a mé chápání s ní již není v rozporu. )
Také se zdá, že skripty jsou organizovány v podsložkách v /etc/systemd/system/
složka:
getty.target.wants
multi-user.target.wants
V jiné lokalitě jsem se dočetl, že existují další lokality. Zdá se, že se jedná o služby specifické pro uživatele.
/usr/lib/systemd/user/ where services provided by installed packages go.
/etc/systemd/user/ where system-wide user services are placed by the system administrator.
~/.config/systemd/user/ where the user puts its own services.
Aktualizace 2015-08-31:
V zájmu ostatních zde je odkaz na související otázku, kterou jsem nedávno položil:Kam mám umístit skripty spouštěné jednotkami systemd?
Přijatá odpověď:
Nejlepší místo pro umístění systému soubory jednotek: /etc/systemd/system
Nezapomeňte přidat cíl v části [Instalovat], přečtěte si „Jak to ví?“ pro detaily. AKTUALIZACE :/usr/local/lib/systemd/system
je další možností, podrobnosti si přečtěte v části „Šedá oblast“.
Nejlepší místo pro umístění uživatele soubory jednotek: /etc/systemd/user
nebo $HOME/.config/systemd/user
ale záleží na oprávněních a situaci.
Pravdou je, že systémové jednotky (nebo jak je nazývá úvodní věta „konfigurace jednotek“) mohou jít kamkoli —za předpokladu, že jste ochotni vytvářet ruční symbolické odkazy a jste si vědomi upozornění. Usnadňuje život umístění jednotky na místo systemctl daemon-reload
může to najít z několika dobrých důvodů:
- Použití standardního umístění znamená, že je generátory systemd najdou a usnadní jejich aktivaci při spouštění pomocí
systemctl enable
. Je to proto, že vaše jednotka bude automaticky přidána do stromu závislosti jednotek (mezipaměť jednotek). - Nemusíte přemýšlet o oprávněních, protože do určených oblastí mohou zapisovat pouze správní privilegovaní uživatelé.
Jak to ví?
A jak přesně systemctl enable
víte, kde vytvořit symbolický odkaz? Napevno jej zakódujete v
samotné jednotce pod [install]
sekce. Obvykle je tam řádek jako
[Install]
WantedBy = multi-user.target
které odpovídá předdefinovanému místu v souborovém systému.
Tímto způsobem systemctl
ví, že tato jednotka je závislá na skupině souborů jednotek s názvem multi-user.target
(„cíl“ je termín používaný k označení skupin závislostí jednotek. Všechny skupiny můžete vypsat pomocí systemctl list-units --type target
). Skupina souborů jednotek, které mají být načteny s cílem, je vložena do targetname.target.wants
adresář. Toto je jen adresář plný symbolických odkazů (nebo to pravé). Pokud váš [Install]
sekce říká, že je to WantedBy
multi-user.target
, ale pokud na něj neexistuje symbolický odkaz v multi-user.target.wants
adresář, pak se nenačte. Když generátory jednotek systemd přidají váš soubor jednotky do mezipaměti stromu závislostí při spouštění (generátory můžete spustit ručně pomocí systemctl daemon-reload
), automaticky ví, kam umístit symbolický odkaz – v tomto případě do adresáře /etc/systemd/system/multi-user.target.wants/
měli byste to povolit.
Klíčové body v příručce:
Další jednotky mohou být načteny do systemd (“propojené”) z
adresářů, které nejsou na cestě načítání jednotek. Viz příkaz link pro
systemctl(1).
V části systemctl vyhledejte Příkazy souboru jednotek
Cesta načtení souboru jednotky
Přečtěte si prosím první větu v následujícím citátu z man systemd.unit
a pochopte ji (protože to znamená, že všechny cesty, které zde zmiňuji, se na vás nemusí vztahovat, pokud byl váš systemd zkompilován s různými cestami):
Soubory jednotek se načítají ze sady cest určených během kompilace, které jsou popsány ve dvou tabulkách níže. Soubory jednotek nalezené v adresářích uvedených dříve přepíší soubory se stejným názvem v adresářích níže v seznamu.
Když je proměnná
$SYSTEMD_UNIT_PATH
je nastaven, obsah této proměnné přepíše cestu zatížení jednotky. Pokud$SYSTEMD_UNIT_PATH
končí prázdnou komponentou („:“), k obsahu proměnné bude připojena obvyklá cesta načtení jednotky.
Tabulka 1 a Tabulka 2 z man systemd.unit
jsou dobré.
Načíst cesty při spuštění v systémovém režimu (--system
).
/etc/systemd/system
Místní konfigurace/run/systemd/system
Runtime jednotky/usr/lib/systemd/system
Jednotky nainstalovaných balíčků (nebo/lib/systemd/system
v některých případech si přečtěteman systemd.unit
)
Načíst cestu při spuštění v uživatelském režimu (--user
)
Je rozdíl mezi na uživatele jednotky a vše/globálně uživatelských jednotek.
Závisí na uživateli
-
$XDG_CONFIG_HOME/systemd/user
Konfigurace uživatele (používá se pouze při$XDG_CONFIG_HOME
je nastaveno) -
$HOME/.config/systemd/user
Konfigurace uživatele (používá se pouze při$XDG_CONFIG_HOME
není nastaveno) -
$XDG_RUNTIME_DIR/systemd/user
Běhové jednotky (používá se pouze při$XDG_RUNTIME_DIR
je nastaveno) -
$XDG_DATA_HOME/systemd/user
Jednotky balíčků, které byly nainstalovány v domovském adresáři (používá se pouze v případě$XDG_DATA_HOME
je nastaveno) -
$HOME/.local/share/systemd/user
Jednotky balíčků, které byly nainstalovány v domovském adresáři (používá se pouze v případě$XDG_DATA_HOME
není nastaveno)
--global
(všichni uživatelé)
Jednotky, které se vztahují na všechny uživatele – což znamená, že také vlastní každý uživatel. Každý uživatel tedy může tyto služby zastavit, i když je správce povolí při spouštění.
/etc/systemd/user
Místní konfigurace pro všechny uživatele (systemctl --global enable userunit.service
)/usr/lib/systemd/user
Jednotky balíčků, které byly nainstalovány v celém systému pro všechny uživatele (nebo/lib/systemd/system
v některých případech si přečtěte man systemd.unit)/run/systemd/user
Runtime jednotky
Šedá oblast
Na jedné straně standard souborové hierarchie specifikuje /etc
je pro místní konfigurace, které nespouštějí binární soubory. Na druhou stranu
určuje, že /usr/local/
„je určeno pro správce systému při místní instalaci softwaru“. Můžete také argumentovat (pokud to není jen pro účely organizace), že všechny soubory systémových jednotek by měly být umístěny pod /usr/local/lib/systemd/system
, ale toto je určeno pro soubory jednotek, které jsou součástí „softwaru“, nikoli od správce balíčků.
Odpovídající uživatelské jednotky systemd, které jsou celosystémové, mohou být umístěny pod /usr/local/lib/systemd/user
.
Přechodná jednotka
Další zapomenuté místo není vůbec nikde! Možná méně známým programem je systemd-run
. Můžete jej použít ke spuštění přechodných jednotek za chodu. viz man systemd-run
.
Chcete-li například naplánovat restart na zítra ráno ve 4 hodiny ráno (možná budete potřebovat --force
abyste zajistili, že dojde k restartu):
systemd-run -u restart --description="Restarts machine" --on-calendar="2020-12-18 00:04:00" systemctl --force reboot
Tím vznikne přechodný soubor jednotky restart.service
a odpovídající časovač (kvůli --on-calendar
, označeno transient=yes
.
/run/systemd/transient/restart.service
# This is a transient unit file, created programmatically via the systemd API. Do not edit.
[Unit]
Description=Restarts machine
[Service]
ExecStart=
ExecStart="/usr/bin/systemctl" "--force" "reboot"
Všimněte si, že existuje také nebezpečnější možnost dvojité síly --force --force
, který říká jádru, aby se okamžitě zastavilo (a pokud nevíte, co děláte, není to bezpečné, protože je to téměř ekvivalentní vypnutí napájení).