Über früher oder später wird Otto-Normal-Linuxer damit konfrontiert sein System upzugraden, es neu zu installieren oder auf andere Hardware umzuziehen. Das geht, wenn man es kann, immer problemlos. Mal einfach und schnell, mal etwas umständlicher und länger dauernd.
Mit diesem kleinen Tutorial will ich die Basics dazu vermitteln, diesen Job unter egal welchen Umständen sauber zu erledigen.
Dazu sollte man wissen,
wie das mit den Konfigurationen in Linux generell funktioniert
Und dafür wiederum, braucht man einen
Überblick über die verschiedenen Formate von Konfigurationsdateien unter Linux
Bis auf ganz wenige Ausnahmen sind alle Konfigurationsdateien in Linux reine Textdateien, die man mit jedem x-beliebigen Editor ändern kann. Dabei kommen viele verschiedene Formate zum Einsatz.
Während die Konfigs für die bash (oder viele andere Shells) nur gültige Shellanweisungen enthalten können, da sie schlicht "gesourced" werden, verwenden viele Programme auch das von Windows bekannte "ini"- Format. Also eine Zeile enthält eine [section] in eckigen Klammern, der dann beliebig viele Zeilen mit Konfigurationsanweisungen folgen, bis die nächste [section] auftaucht, oder die Datei endet.
Dann gibt es noch alte Klopfer, wie z.B. postfix, der Standard MTA (MailTransferAgent). Der verwendet das BDB Format (BerkeleyDataBase). Das ist im Prinzip -obwohl es auch ein zeilenorientiertes Format ist- eine Key-Value Datenbank. Tatsächlich ist das der Urahn der modernen Datenbanksysteme, wie Redis, nosql usw.. Dessen wesentliche Eigenschaft ist, dass am Anfang einer Zeile (ohne voranstehnde Leerzeichen) der Key steht, und nach einem trennenden Leerzeichen der Wert. Sollte eine Zeile nicht ausreichen, so kann man diese Zeile in der folgenden fortsetzen, aber dann MUSS am Anfang der folgenden Zeile mindestens ein Leerzeichen stehen.
Generell gilt die Syntax
<key><separator><value>
Natürlich gibt es noch andere Exoten und sogar wirklich binäre Konfigurationsdateien, die ohne entsprechendes Programm gar nicht gelesen werden können.
Die sind aber -Gott sei Dank- selten.
Unterkonfigurationen und alle möglichen Dateiendungen
Ein mächtigeres Programm hat meist auch enorm viele Konfigurationseinstellungen. Da das verwirrend und schwer lesbar ist, sind diese Konfiguration meist auch aufgesplittet in viele Dateien. Ein typisches Szenario für MeinRiesenProgramm wäre, dass es eine Hauptkonfigurationsdatei hat, die dann eben MeinRiesenProgramm.conf heißt. Oder .config als Extension hat.
In ganz alten Zeiten war so eine ewig lange Extension für eine Konfigdatei natürlich unmöglich. postfix verwendet .cf als Extension für seine Konfigdateien.
Und die bash schlicht rc (== RessourceControl )
Natürlich verwenden mache Programme für ihre Konfigurationsdateien auch die Extension .ini, was darauf hindeutet, dass es sich auch um dabi um das oben beschriebene Format handelt.
WENN sich die Programmierer an die Konvention gehalten haben.
Verlasst euch nicht auf das hier Geschriebene!
Linux ist ein breit gefächertes Sammelsurium guter Ideen, die in Code gegossen wurden. Zwar gibt es all diese Konventionen, aber es sind auch nur Konventionen. Nichts und niemand hindert dich daran, ein völlig neues, natürlich völlig revolutionäres und natürlich total viel besseres Schema zu ersinnen.
Verlasst euch lieber auf euren Instinkt. Finden sich in einer Extension die Buchstaben c und f, sollte bei euch der Possible-Konfig-File-Detected Alarm klingeln. Bei der Extension .ini natürlich ebenso. Findet ihr ein MeinRiesenProgrammrc (ohne Punkt zwischen Programmname und rc!!!) ist die Sache eh klar: Das muss eine Konfigurationsdatei von einem Programm sein, das sogar noch älter ist, als postfix, weil sie sich sogar den Punkt in der Extension gespart haben. Zu der Zeit kämpfte man um jedes Bit. Eine Extension, wie .config galt als teure Speicherplatzverschwendung.
Linux selbst kennt übrigens gar keine Extensions. Die dienen wirklich nur dazu uns das Leben leichter zu machen, im Gegensatz zu Windows, wo sie das System steuern. Es sind Dateien. Sonst nichts.
Wenn nun unser MeinRiesenProgramm enorme Netzwerkfähigkeiten mitbringt (was heute eigentlich jedes bessere Programm tut), dann haben wir verdammt viele Parameter zu konfigurieren. In einer einzigen Datei macht das überhaupt keinen Sinn und Spaß. Deshalb splittet man die Gesamtkonfiguration in einzelne Teile. Die dann durch Sourcen eingebunden werden.
Was ist "sourcen"?
Sourcen ist ein ganz einfacher Mechanismus, den viele Programme verwenden. Die Shell (bei uns also die bash) kenn dafür sogar einen eigenen Befehl source oder synonym dazu in Kurzform schlicht ein . bewirken nichts anderes, als dass diese "Source zeile", also source /pfad/zu/einer/Unterkonfig.datei.conf mit dem Inhalt die Unterkonfig.datei.conf ersetzt wird. Hilfe dazu gibt der Befehl help source oder wieder synonym dazu help .
(Die Hilfe für Shell- interne Befehle erhält man mit dem Befehl help, Hilfe für externe Befehle, also Befehle, die in /bin oder /sbin als echt ausführbare Programme liegen, mit man <befehlsname>.
Bestimmte interne Befehle wollen natürlich gequotet werden. So muss man z.B. zum Kommando [[ die Hilfe mit help "[[" aufrufen.)
Hat nun unser Programm MeinRiesenProgramm eine riesige Anzahl an Detailkonfigurationen, so macht man einfach ein Directory namens MeinRiesenProgramm.d. Dort liegen dann alle Subkonfigurationen und werden von der eigentlichen Konfigurations aus gesorced, mit einem Kommando, wie z.B. bei dem Webserver nginx include /Pfad/zu/MeinRiesenProgramm.d/*.conf
Ja: source und include tun genau das gleiche. include kennt man von vielen Programmiersprachen, wo sie einem ähnlichen Zweck dienen. Ein bekannter Mechansimus.
Natürlich braucht man bei komplexen Konfigurationen auch irgendeine Ordnung bzw. Reihenfolge. Die gewährleistet man (wenn man sie denn braucht), indem man den einzelnen Konfigurationsdateien eine meist zweistellige Zahl im Dateinamen voranstellt. Also in unserem Falle läge in MeinRiesenProgramm.d z.B. eine Datei namens 00-user.conf und eine 37-ssl.conf. Damit wird zuerst die 00-user.conf "gesourced", weil sie eben die niedrigere Nummer am Anfang im Namen trägt.
Mit diesem kleinen Vorspiel sind wir nun endlich beim eigentlichen Thema angelangt:
Wie passen all die verschiedenen Konfigurationen zusammen?
Da Linux von Haus aus ein Mehrbenutzersystem ist, hat sich eine bestimmte Reihenfolge erst eingebürgert, die dann zur Konvention wurde, und heute mehr oder weniger Gesetz ist. Damit viele verschiedene Unices zusammenarbeiten können, und die grundlegenden (GNU-) Tools auch überall, wie gewohnt, arbeiten, gibt es heute im Prinzip drei sehr wichtige Standards dazu, die man zumindest einmal gehört haben sollte.
- POSIX Standard
garantiert, dass ein Programm, das diesen Standard unterstützt, auch korrekt läuft.
POSIX == Portable Operating System Interconnect (and eXchange; das eXchange ist nicht gesichert, manche interpretieren es als Ziffer x, die die damalige IEEE Spezifikation steht)
Die bash kann man im POSIXLY_CORRECT Modus laufen lassen, sie verhält sich dann, wie eine reine Posixshell. (Ein POSIX Shell- Script kann etwas weniger, kennt keine modernen Shell Syntax- Konstrukte, ist dafür aber auf jedem posixkompatiblen System ausführbar. Und ja: Es gibt Systeme, die nicht einmal eine Bash haben. ) - LSB, die Linux Standard Base
das ist der Versuch der Linuxfoundation ein Regel- und Normenwerk zu schaffen, die alle möglichen Schnittstellen definiert, so dass verschiedene Linuces problemlos miteinander arbeiten können. - FHS, der FileHierarchyStandard
der beschreibt, was in welches Verzeichnis gehört. Es wird dort also genau der Zweck der gängigen Verzeichnisse definiert, und was dort liegen soll, was nicht.
Dieser Standard gilt als Gesetz und wird von der LSB auch als solches vorausgesetzt.
Die ersten zwei mögen für Otto-Normal-Linuxer eher von akademischen Interesse sein, den FHS sollte man aber lesen, oder zumindest mal überfliegen.
Was passiert nun,
wenn ein Programm seine vollständige Konfiguration liest:
- Zuallererst kommen so genannte "hardcoded" Einstellungen zum Zuge. Wer schon mal programmiert hat, weiß, dass jedes Programm (falls es nicht völlig dilettantisch programmiert wurde) intern für alle relevanten Variablen Default- Werte hat, die zum Zuge kommen, wenn (später) nichts anderes angegeben wird.
- Danach werden - so vorhanden- Einstellungen aus /etc gelesen.
Das /etc- Verzeichnis ist laut FHS für die hostweite Konfiguration zuständig. Also für alle Einstellungen, die für alle User dieses Systems gelten.
Damit kann root bestimmte Vorgaben durchsetzen, die von Usern zu verwenden sind (oder eben doch überschrieben werden können). - Die Konfiguration im $HOME des jeweiligen Users wird gelesen.
- Erst jetzt beginnt das Programm mit seiner Arbeit.
Oder auch nicht.
Bevor wir endlich zum Umziehen eines Homes kommen, werfen wir noch einen kurzen Blick darauf, was ein Home eigentlich ist, und was passiert, wenn auf einem Host ein neuer User angelegt wird.