staging.inyokaproject.org

Konfigurationsverzeichnisse

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.

Statt Konfigurationen in nur eine Datei abzulegen, gibt es für verschiedene Programme und Dienste ein (oder mehrere) Verzeichnisse mit der Endung conf.d, in denen die Konfiguration auf mehrere (kleine) Dateien aufgeteilt werden kann. conf.d steht für die englischsprachige Bezeichnung configuration directory, zu Deutsch Konfigurationsverzeichnis.

Dies passiert einerseits aus der Notwendigkeit, dass Paketbetreuer eines Paketes B nicht den Inhalt der Konfigurationsdatei von Paket A verändern dürfen, selbst wenn es für den Gebrauch von Paket B unerlässlich ist.

Des Weiteren besteht damit die Möglichkeit, selber Änderungen an der Konfiguration eines Programms oder Dienstes zu machen, ohne das man die systemseitige Konfigurationsdatei ändern muss, Details dazu siehe Abschnitt Funktionsweise.

Außerdem ist ein wichtiger Vorteil, dass die Dateien in diesen Verzeichnissen bei einer Aktualisierung des Programms oder des ganzen Systems nicht überschrieben oder entfernt werden, d.h. die angepasste Konfiguration bleibt bestehen.

Einige Beispiele für Programme und Dienste, die conf.d Verzeichnisse nutzen (können):

Es kann auch vorkommen, dass der Verzeichnisname nur auf .d endet, wie z. B. /etc/apt/sources.list.d, wo eigene Paketquellen hinzugefügt werden können, oder /etc/udev/rules.d. Weiterhin gibt es Konfigurationsverzeichnisse, die nur conf im Namen haben, aber nicht das .d am Ende. Dazu gehören z. B. die Verzeichnisse conf-available und conf-enabled, wo für den Apache-Webserver Seiten- / Domain-spezifische Konfigurationen hinterlegt werden.

Wichtig ist noch, dass conf.d bzw. .d Verzeichnisse keine Pflicht sind, d. h. ein Programm / Dienst kann das auch auf andere Art und Weise regeln. Des Weiteren müssen die Verzeichnisse nicht unbedingt bereits existieren. Es kann auch sein, dass man sie selber anlegen muss. Unter Ubuntu wäre dies z. B. bei /etc/systemd/system.conf.d der Fall.

Funktionsweise

Es gibt zwei verschiedene Weisen, in der die Dateien in Konfigurationsverzeichnissen verarbeitet werden: in lexikographischer Ordnung oder in der Reihenfolge, in der sie in einer übergeordneten Konfigurationsdatei referenziert werden. Welches Vorgehen ein Dienst / Programm anwendet, sollte in der zugehörigen Dokumentation erklärt sein. Die lexikographische Ordnung ist das gängigere Vergehen.

lexikographische Ordnung

"Lexikographische Ordnung" bedeutet, dass die Dateien sortiert nach deren Namen eingelesen werden. Also erst alle Dateien, mit mit A beginnen, dann mit B usw. Beginnt der Dateiname mit einer Zahl, entscheidet die aufsteigenden Sortierung der Zahlen.

Für Konfigurationsdateien unter Linux ist es gängige Praxis, dass der Dateiname mit einer 2-stelligen Zahl zwischen 00 und 99 beginnt, gefolgt von einem Bindestrich und dann einem Namen. Damit hat man alleine durch die Sortierung der Zahlen 100 mögliche Konfigurationsdateien pro Dienst / Programm zur Verfügung, was in der Regel mehr als ausreichend ist. Programme / Dienste, wo dies so umgesetzt wird, sind z. B. udev, der NetworkManager oder networkd.

Werden die Dateien in lexikographischer Ordnung gelesen werden:

  • skalare Optionen überschrieben, d. h. später gelesene Werte überschreiben früher. Selbst bei widersprüchlichen Werten für die gleiche Option ist so klar definiert, welcher Wert am Ende „gewinnt“. "Skalare Werte" bedeutet, dass ein Parameter / eine Einstellung nur einen Wert haben kann, wie z. B. wahr / falsch oder eine einzelne Zahl oder einen einzelnen String

  • Optionen, die mehrere Werte haben können, ergänzt d. h. weitere Werte werden den bestehenden hinzugefügt

Konfigurationen mit großer Streubreite sollten daher am Anfang stehen, die dann durch nachfolgende Einstellungen erweitert oder überschrieben werden können.

Einige Programme haben mehrere Konfigurationsdateien und -verzeichnisse, z. B. verteilt auf /lib (Standardkonfiguration des Programms / des Dienstes), /run und auf /etc. Die grundlegenden Einstellungen unter /lib werden dann die in /run und /etc ergänzt oder überschrieben. Da das /run Verzeichnis zur Laufzeit des Systems angelegt wird, sind alle hier gemachten Änderungen flüchtig. Änderungen sollten man grundsätzlich immer in /etc vorzunehmen, wenn das Programm / der Dienst es ermöglicht.

Reihenfolge des Einbindens

Bei einigen Programmen / Diensten kann man die Reihenfolge, in der eigenen Konfigurationsdateien eingelesen werden, vorgeben. Dies ist z. B. beim Webserver nginx der Fall, wo in der Datei /etc/nginx/nginx.conf über die Reihenfolge der include Anweisungen die Einlesereihenfolge vorgegeben werden kann.

Ob bei diesem Vorgehen eine spätere Konfigurationsanweisung eine früher überschreibt oder dies zu einer Fehlermeldung führt hängt vom jeweiligen Programm / Dienst ab.

Vorgehen

Da man sich beim Einlesen mit lexikographischer Ordnung um frühere Werte nicht kümmern muss, wenn man seine Datei „ans Ende“ schiebt, braucht man nur die recherchierten Konfigurationselemente in einer Datei zusammen zu fassen und sie ins Konfigurationsverzeichnis unter /etc zu kopieren. Wenn man sicherstellen will, dass die eigene Datei auf jeden Fall zuletzt verarbeitet wird, sollte der Dateiname mit 99 beginnen, wie z. B. 99-benutzerdefiniert.conf bewährt.

Je nachdem wann das Programm die Einstellungen liest und verarbeitet, wird die Änderung der Konfiguration sofort gültig (z. B. bei APT) oder erst nach einem Neustart des Rechners (z.B. bei LightDM).

Problembehebung

Wenn mit einem Programm, welches das in diesem Artikel beschriebene Verfahren verwendet, etwas nicht funktioniert, ist ein sinnvoller erster Schritt, eine lesbare Übersicht der verstreut liegenden Konfiguration zu erzeugen. Dies gelingt mit einem Befehl, welcher hier exemplarisch für das Programm systemd-networkd gezeigt wird:

grep -r -e = -e ] /etc/systemd/networkd.conf /{lib,run,etc}/systemd/network/ 

Man filtert nach einem Suchbegriff (hier: „=“ oder „]“), der in allen Konfigurationszeilen, aber möglichst nicht in den Kommentarzeilen vorkommt und gibt die Konfigurationsdateien und -Verzeichnisse in der Reihenfolge an, nach der das jeweilige Programm diese durchsucht.

Eine Variante dazu ist, Leerzeilen und Kommentarzeilen nicht auszugeben:

grep -r -v -e '^$' -e '^#' /etc/systemd/networkd.conf /{lib,run,etc}/systemd/network/ 

Oft werden bei der Anwendung bisher unbekannte Konfigurationsdateien unter /lib/ auffallen, welche von der eigenen Konfiguration unter /etc/ nicht übersteuert werden. Bei Störungen durch solche zur Distribution gehörenden Dateien sollte man diese nicht löschen und nicht ändern, sondern sie durch eine gleichnamige, ggf. leere (!) Datei unter /etc/ überlagern.

Diese Revision wurde am 5. Februar 2022 08:02 von RudeUwe erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: System