[[Vorlage(Getestet, jammy, focal)]] {{{#!vorlage Wissen [:Terminal: Ein Terminal öffnen] [:Editor:einen Editor öffnen] [:mit Root-Rechten arbeiten:] }}} [[Inhaltsverzeichnis()]] [:systemd:] kennt eigene [:Umgebungsvariable:Umgebungsvariablen], welche entweder systemweit für alle von systemd gestarteten Prozesse verfügbar sind oder nur für eine von systemd ausgeführte [:systemd/Units:Unit]. = Syntax der systemd Umgebungsvariablen = Alle Umgebungsvariablen von systemd - egal ob systemweit oder nur für eine Unit - werden in der Form von Schlüssel-Werte Paaren angegeben. So würde bei `Foo=Bar` die Umgebungsvariable `Foo` den Wert `Bar` haben. Ein einzelnes Schlüssel-Werte Paar muss nicht in Anführungszeichen gesetzt werden, wenn der Wert kein Leerzeichen enthält. Anführungszeichen sind aber Pflicht, wenn der Wert ein Leerzeichen enthält, wie z.B. `"Gruss=Hallo Welt"` . = systemweite Umgebungsvariablen anzeigen = Die systemweiten Umgebungsvariablen lassen sich über [:systemctl:] anzeigen: {{{#!vorlage Befehl systemctl show --property Environment }}} = systemweite Umgebungsvariablen setzen = Zum Setzen von systemweiten Umgebungsvariablen gibt es drei Möglichkeiten. 1. das Verzeichnis '''/etc/systemd/system.conf.d''' und darin eine Datei wie z.B. '''10-default-env.conf''' mit Umgebungsvariablen anlegen 1. das Editieren der Datei '''/etc/systemd/system.conf''' 1. über eine [:Bootoptionen:Bootoption] == Verzeichnis system.conf.d == Alternativ kann zum Editieren von '''system.conf''' kann auch in '''/etc/systemd''' mit Root-Rechten das Verzeichnis '''system.conf.d''' angelegt werden und darin eine Datei wie z.B. '''10-default-env.conf'''. In dieser Datei fügt man eine Sektion `[Manager]` ein, dann eine Zeile beginnend mit `DefaultEnvironment=` ein, wo man dann wie in der Datei '''systemd.conf''' ein oder mehrere Schlüssel-Werte Paare hinterlegen kann: {{{ [Manager] DefaultEnvironment=Foo=Bar Spam=Egg }}} Die Notation mit mehreren Gleichheitszeichen sieht zwar komisch aus, ist aber so korrekt. Der Name der Datei muss nicht '''10-default-env.conf''' lauten, er kann beliebig gewählt werden. Die Endung muss aber '''.conf''' sein. Gibt es im Verzeichnis mehrere '''.conf''' Dateien, werden diese nach ihrem Namen in lexikalischer Reihenfolge abgearbeitet. == Datei systemd.conf == In der Datei '''/etc/systemd/system.conf''' gibt es in der Sektion `[Manager]` eine Zeile `DefaultEnvironment=`, welche standardmäßig mit dem Rautezeichen `#` auskommentiert ist. Hier kann man systemweite Umgebungsvariablen hinzufügen. Dazu öffnet man die Datei mit einem Editor mit Root-Rechten[2][3], entfernt das Rautezeichen und fügt ein oder mehrere Schlüssel-Werte Paare hinzu, also z.B. {{{ DefaultEnvironment=Foo=bar }}} Bei einem Update von systemd könnte es vorkommen, dass die Datei '''system.conf''' überschrieben wird, von daher ist der weiter oben beschriebene Weg über ein eigenes Verzeichnis mit einer '''.conf''' Datei der bevorzugte Weg. == Bootoption == Fügt man die Option `systemd.setenv=SCHLUESSEL=WERT` in der Kernel-Kommandozeile hinzu, wird die systemd Umgebungsvariable `SCHLUESSEL` systemweit auf `WERT` gesetzt. Benötigt man mehrere Umgebungsvariablen, kann die Option mehrfach angegeben werden. = Umgebungsvariablen für eine Unit setzen = Benötigt man ein oder mehrere Umgebungsvariablen nur für eine Unit, dann lässt sich das über zwei alternative Direktiven realisieren: 1. Mit der Direktive `Environment=` können ein oder mehrere Umgebungsvariablen gesetzt werden. 1. Mit der Direktive `EnvironmentFile=` kann angegeben werden, in welcher Datei die Umgebungsvariablen hinterlegt sind. Allerdings sind diese Direktiven nicht in allen Unit-Typen zulässig, sondern nur in Service-, Mount-, Socket- und Swap-Units. Die in Units gesetzten Umgebungsvariablen sind nur innerhalb der Prozesse verfügbar, die von der Unit gestartet werden, also auch deren Kindprozesse. In anderen Prozessen, die von anderen Units und vom Nutzer gestartet wurden, sind diese Umgebungsvariablen nicht sichtbar. == Environment Direktive == Innerhalb der für die Unit spezifischen Sektion, wie z.B. die Sektion `[Service]` bei Service-Units, kann die Direktive `Environment=` eingefügt werden, gefolgt von ein oder mehreren Umgebungsvariablen: Beispiel: {{{ ... [Service] ... Environment=Foo=Bar "Gruss=Hallo Welt" ... }}} Die Direktive kann auch mehrfach angeben werden. Das folgende Beispiel ist äquivalent zum vorherigen: {{{ ... [Service] ... Environment=Foo=Bar Environment="Gruss=Hallo Welt" ... }}} == EnvironmentFile Direktive == Alternativ kann man Umgebungsvariablen für die Unit auch in einer separaten Datei angegeben werden. Der Name kann beliebig gewählt werden, ebenso der Speicherort. Die Datei muss lediglich lesbar sein. In der Datei werden die Umgebungsvariablen zeilenweise hinterlegt, wie z.B.: {{{ Foo=Bar "Gruss=Hallo Welt" }}} In der Unit wird diese Datei dann über die Direktive `EnvironmentFile=` eingebunden: {{{ ... [Service] ... EnvironmentFile=/home/BENUTZER/conf/meine_variablen.conf ... }}} Hier wird aus dem Verzeichnis '''/home/BENUTZER/conf/''' die Datei '''meine_variablen.conf''' gelesen, welche die zu setzenden Umgebungsvariablen enthält. = Umgebungsvariablen in systemd-Containern = Wird über systemd eine Containerumgebung über [https://www.freedesktop.org/software/systemd/man/systemd-nspawn.html] {en} angelegt, wird in den Units, die im Container gestartet werden, zusätzlich die Direktive `PassEnvironment=` benötigt, damit die Units auf Umgebgungvariablen zugreifen können. Wenn man z.B. einen Container mit systemd-nspawn mit dem Argument `--setenv=Foo=Bar` startet, kann man auf die Umgebungsvariable `Foo` in einer Unit im Container nur zugreifen, wenn man die Direktive `PassEnvironment=Foo` in der entsprechenden Unit verwendet. = Umgebungsvariablen in Units ansprechen = Der Zugriff auf Umgebungsvariablen von systemd erfolgt für Skripte auf dem üblichen Weg. So würde die Service Unit {{{ ... [Service] Environment="Gruss=Hallo Welt" ExecStart=/bin/bash /home/NUTZER/mein_skript.sh ... }}} mit '''mein_skript.sh''' {{{#!code bash echo ${Gruss} }}} `Hallo Welt"` als Ausgabe haben. Umgebungsvariablen können auch direkt in der Unit genutzt werden, der Aufruf erfolgt mit einem Bash-ähnlichen Syntax: {{{ ... [Service] ... Environment=PORT=8080 ExecStart=/home/BENUTZER/code/start_server.py -p ${PORT} ... }}} Hier würde dem Skript '''start_server.py''' der Wert `8080` für die Option `-p` mitgegeben. = Links = * [https://www.freedesktop.org/software/systemd/man/systemd.service.html#Command%20lines Erklärung] {en} zu Umgebungsvariablen in der systemd Doku #tag: System, systemd, Shell