Zum Einen ist es natürlich möglich Jails unter FreeBSD von Hand zu erstellen und zu verwalten wie es in dem Artikel Jail erstellen erläutert ist. Eine andere Möglichkeit ist die Verwendung von ezjail, einem Verwaltungswerkzeug für Jails. Mittels ezjail ist es möglich relativ schnell mehrere Jails zu erstellen und zu verwalten. Im Weiteren wird verkürzt die Funktionsweise von ezjail erklärt. Die Beschreibung stützt sich lediglich auf die Verwendung von Binärinstallationen und -updates und verwendet kein ZFS. Die Möglichkeiten von ezjail gehen deutlich über den Umfang dieser Anleitung hinaus und sind in den Manpages ezjail(7) und ezjail-admin(8) in voller Breite dargelegt (z.B. die Installation und das Updaten von Jail mittels Systemquellen, das Installieren in ZFS-Datasets, etc.).
Werden auf einem FreeBSD-System mehrere Jails von Hand verwaltet wird normalerweise in jeder einzelnen Jail ein (zumindest weitestgehend) komplettes FreeBSD-System installiert. Im nächsten Schritt bedeutet das, dass bei einem Systemupdate auch jede Jail aktualisiert werden muss (was in Arbeit ausarten kann). Der Ansatz den ezjail verfolgt sieht etwas anders aus. Beim ersten Einrichten von ezjail werden drei Bereiche erstellt die als Basis jeder neuen Jail verwendet werden. Die drei Bereiche sind die basejail, das newjail-Template und die flavours (genauer ein erstes example-Flavour).
Die Basejail ist ein Verzeichnis welches alle Binärdateien einer FreeBSD-Installation enthält. In jede später erstellte Jail wird die Basejail als real-only nullfs-mount enthalten. Somit sind die Binärdateien aller Jails in nur einem Verzeichnis. Die Vorteile hiervon sind, dass für ein Systemupdate aller Jails lediglich ein Ordner aktualisiert werden muss, egal wie viele Jails man erzeugen will, wird das Basis-System nur einmal (zusätzlich zum Host) auf der Festplatte abgelegt und das verändern von Systemprogrammen wird durch den read-only-mount erschwert. In der Basejail werden keine Änderungen von Hand vorgenommen.
Zusätzlich zu den Binärdateien enthält eine vollständige FreeBSD-Installation noch weitere Dateien, die zumeist auch veränderbar sein müssen, wie z.B. Konfigurationsdateien. Im Unterordner newjail hält ezjail genau diese Dateien vor. Die Kombination aus basejail und newjail ergibt eine komplette FreeBSD-Installation. Beim Erzeugen einer neuen Jail werden die Dateien von newjail in die neue Jail kopiert und stehen von da an Änderungen zur Verfügung. In newjail selbst werden keine Änderungen vorgenommen, da der Ordner bei einem Update neu geschrieben wird um die zu den Binärdateien passenden Daten bereit zu halten.
Ohne den Einsatz von flavours erzeugt ezjail in jeder neu erzeugen Jail eine blanke FreeBSD-Basisinstallation (durch nullfs-mount von basejail und dazukopieren von newjail). Im Allgemeinen hat man jedoch meist spezielle Dinge die man in jeder Jail haben möchte und entsprechend diese Einstellungen in jeder Jail von Hand einzeln vornehmen müsste. Um diese Arbeit zu vereinfachen gibt es falvours. Man kann beliebig viele flavours anlegen, jede neue Jail kann jedoch nur mit jeweils einem flavour angelegt werden. Die flavours können natürlich so oft verwendet werden wie man will. Ein Flavour ist wieder nur ein Ordner der genau die Dateien die man gerne geändert haben möchte enthält. Diese Dateien müssen entsprechend ihres Speicherorts in der späteren Jail in jeweiligen Unterordnern abgelegt werden. Erzeugt man nun eine neue Jail unter Verwendung von flavours werden nach Installation des Base-Systems in die Jail alle Dateien des Flavours über die Jail kopiert. Bereits bestehende Dateien werden somit ersetzt oder noch nicht vorhandene erzeugt. Die flavours enthalten sogar ein rc-Script welches beim ersten Start der Jail ausgeführt werden kann um noch weitere vorbereitende Arbeiten in der Jail durchzuführen, wie z.B. das Installieren von Paketen. Die flavours sind der einzige Ort an dem Änderungen in den Jail-Vorlagen durchgeführt werden dürfen.
Zunächst wird ezjail installiert und soweit eingerichtet, dass man direkt Jails erstellen lassen kann.
Um ezjail verwenden zu können muss es zunächst aus sysutils/ezjail installiert werden.
Unter /usr/local/etc/ezjail.conf wird eine Konfigurationsdatei angelegt die man entsprechend anpassen kann. Prinzipiell sind die Standardwerte in Ordnung und es können alle dort hinterlegten Einstellungen auch dem Komandozeilen-Programm ezjail-admin mitgegeben werden.
Nach Installation von ezjail kann mit der Einrichtung begonnen werden. Die Basejail und die restliche notwendige Infrastruktur wird mit folgendem Befehl installiert. Das -m bedeutet, dass die Manpages mit installiert werden sollen. Weitere Parameter sind der Manpage zu ezjail-admin zu entnehmen.
# ezjail-admin install
Nun ist unter /usr/jails die komplette Infrastruktur installiert die ezjail benötigt.
Nachdem die Basejail installiert ist wird als nächstes ein neues Flavour angelegt welches die Basis für die Personalisierung der späteren Jails darstellt. Hierzu wird das mitgelieferte Beispiel kopiert.
Zunächst wird die Kopie aus dem Beispiel-Flavour erstellt
# cp -a /usr/jails/flavours/example /usr/jails/flavours/myFlavour
Zunächst muss /usr/jails/newjail/etc/crontab nach /usr/jails/flavours/myFlavour/etc/crontab kopiert werden, da im Template unter newjail keine Änderungen vorgenommen werden dürfen da sie beim nächsten Update überschrieben wird.
# cp /usr/jails/newjail/etc/crontab /usr/jails/flavours/myFlavour/etc/crontab
Dann kann die Datei /usr/jails/flavours/myFlavour/etc/crontab angepasst werden damit adjkerntz nicht unnötig in der Jail läuft. Hierzu wird die entsprechenden Zeile durch vorranstellen eines '#' auskommentiert.
#1,31 0-5 * * * root adjkerntz -a
Damit die Jails alle die richtige Uhrzeit haben muss die localtime vernünftig gesetzt werden. Dies kann einfach durch einen Symlink auf die entsprechende Zeitzonendatei erfolgen. Für Berliner Zeit sieht das z.B. wie folgt aus.
# ln -s /usr/share/zoneinfo/Europe/Berlin /usr/jails/flavours/myFlavour/etc/localtime
Als nächstes wird eine Vorlage für die make.conf der Jails unter /usr/jails/flavours/myFlavour/etc/make.conf erstellt und wie gewünscht befüllt. Beispielsweise zur Verwendung des neuen Paketformats pkg wäre folgender Eintrag nötig.
WITH_PKGNG=yes
Damit die Jails Zugriff auf die Namensauflösung haben um vernünftigen Internetzugang zu erhalten wird die resolv.conf des Hosts als Basis für die zu erstellenden Jails verwendet.
# cp /etc/resolv.conf /usr/jails/flavours/myFlavour/etc/resolv.conf
Die neue Jail soll als Paketverwaltungswerkzeug das neue pkg verwenden und direkt bei der Erzeugung erste Pakete von einem beliebigen Repo installieren. Damit dies funktioniert muss die Jail natürlich Zugang zum Internet haben (so das Repo im Internet liegt). Das bedeutet, dass die Jail über eine gültige resolv.conf verfügen und (im weiteren Ablauf) mit einer gültigen IP erzeugt werden muss.
Zunächst wird die Konfiguration für pkg angelegt. Hier zu wird die Datei /usr/jails/flavours/myFlavour/usr/local/etc/pkg.conf erzeugt und wie folgt gefüllt:
packagesite: MEINEWUNSCHSEITE
Wobei MEINEWUNSCHSEITE die URL des zu verwendenden Repos ist.
Um die Pakete festzulegen die in jede neue Jail bei deren Erzeugung installiert werden sollen wird die Datei /usr/jails/flavours/myFlavour/install_packages angelegt und wie folgt gefüllt.
#!/bin/sh p="pkg install -y" # ab hier folgen die Namen der zu installierenden Pakete $p editors/vim $p mail/ssmtp $p ports-mgmt/portmaster
In diesem Beispiel würden vim und ssmtp in jede erzeugte Jail installiert werden.
Damit beim ersten Start der Jail pkg und die gewünschten Pakete installiert werden muss die Datei /usr/jails/flavours/myFlavour/etc/rc.d/ezjail.flavour.example angepasst werden.
Zunächst wird der folgende Abschnitt gesucht…
# Packages ########### # # Install all packages previously put to /pkg # Remove package files afterwards [ -d /pkg ] && PACKAGESITE=file:// pkg_add -r /pkg/* rm -rf /pkg
… und durch den folgenden ersetzt…
# Packages ########### # # Neue Pakete installieren ASSUME_ALWAYS_YES=YES PACKAGESITE=MYPACKAGESITE pkg /bin/sh /install_packages rm -rf /install_packages
Wobei MYPACKAGESITE mit der URL des zu verwendenden Repos zu ersetzen ist.
Zum Abschluss der Personalisierung der Jailvorlage können noch weitere Konfigurationen eingespielt werden. Um z.B. dem automatisch installierten vim (nach obigem Beispiel) direkt eine vernünftige Konfiguration mitzugeben wird eine fertige vimrc als /usr/jails/flavours/myFlavour/usr/local/share/vim/vimrc abgelegt.
Um nun eine erste Jail mit Einbindung des Flavours myFlavour zu erzeugen wird einfach folgender Befehl verwendet.
# ezjail-admin create -f myFlavour ersteJail 123.123.123.123
Wobei ersteJail der Name der Jail und 123.123.123.123 die ihr zugewiesene IP ist.
Jede erzeugte Jail erhält unter /usr/local/etc/ezjail/ eine eigene Konfigurationsdatei in welcher man noch einige Details der Jail anpassen kann. Auch hier sind die Standardwerte vernünftig. (Achtung: Wird einer Jail das verboten mount nutzen zu dürfen funktioniert das Einbinden der Basejail nicht mehr!).
Nachdem die Jail erzeugt wurde kann sie nun zum ersten Mal gestartet werden. Zum Starten der Jail gibt es verschiedene Möglichkeiten. Da nach der Erzeugung und dem ersten Start der Jail jedoch sicher noch einiges an Konfigurationsbedarf besteht kann mit folgendem Befehl die Jail gestartet und direkt ein Terminalzugang als root geöffnet werden.
# ezjail-admin console -f ersteJail
Je nachdem wie viele Pakete automatisch installiert werden sollen kann es einige Minuten dauern bis die Jail das Erste mal komplett gestartet ist! Geduld ist geboten.
Eine einzelne Jail (hier ersteJail) kann mit folgendem Befehl gestartet werden.
# ezjail-admin start ersteJail
Eine einzelne Jail (hier ersteJail) kann mit folgendem Befehl beendet werden.
# ezjail-admin stop ersteJail
Um die Jails automatisch beim Systemstart mit zu starten wird folgender Eintrag in die /etc/rc.conf des Hostsystems hinzugefügt:
ezjail_enable="YES"
Ausnahmen sind Jails die das Flag gesetzt bekommen haben, dass sie nicht automatisch starten sollen (Details siehe Manpage).
Um in die Jail ersteJail einzuloggen wird der Befehl wie folgt aussehen.
# ezjail-admin console ersteJail
Dies funktioniert nur wenn die Jail bereits läuft. Wird der Parameter -f hinzugefügt wird eine noch nicht laufende die Jail vor dem Einloggen gestartet.
# ezjail-admin console -f ersteJail
Das Konzept von ezjail erlaubt es, dass ein Systemupdate nur auf der basejail durchgeführt werden muss und somit alle Jails automatisch aktualisiert werden. Im Weiteren wird das Update mittels Binärupdates (über freebsd-update) beschrieben.
Um einen neuen Patchlevel einzuspielen (also z.B. von 9.2 auf 9.2-p1) muss sich der Host auf dem selben Release befinden wie wie Jails (in diesem Falle 9.2). Dann kann die basejail einfach wie folge geupdated werden.
# ezjail-admin update -u
Soll die basejail auf eine neue Releaseversion upgedated werden (z.B. von 9.1 auf 9.2) so muss zunächst das Hostsystem geupdated werden. Anschließend kann das Update wie folgt durchgeführt werden.
# ezjail-admin update -s 9.1-RELEASE -U
Hierbei ist 9.1-RELEASE die aktuelle Release-Version die noch in der Jail installiert ist. Das Update wird das System dann auf das Release des Hostsystems heben.