Inhaltsverzeichnis

Allgemein

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.).

Das Konzept von ezjail

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).

Basejail

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.

Newjail

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.

Flavours

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.

Installation und Einrichtung

Zunächst wird ezjail installiert und soweit eingerichtet, dass man direkt Jails erstellen lassen kann.

Installation

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.

Basejail installieren

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.

Neues Flavour anlegen

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.

Eigenes Flavour erstellen

Zunächst wird die Kopie aus dem Beispiel-Flavour erstellt

# cp -a /usr/jails/flavours/example /usr/jails/flavours/myFlavour

crontab anpassen

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

Timezone setzen

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

make.conf anpassen

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

resolv.conf einfügen

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

PKG

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.

PKG einrichten

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.

Zu installierende Pakete festlegen

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.

Bootstrap von PKG

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.

Weitere Konfigurationen

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.

Erzeugen einer Jail

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!).

Erster Start der Jail

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.

Arbeiten mit Jails

Eine Jail starten

Eine einzelne Jail (hier ersteJail) kann mit folgendem Befehl gestartet werden.

# ezjail-admin start ersteJail

Eine Jail beenden

Eine einzelne Jail (hier ersteJail) kann mit folgendem Befehl beendet werden.

# ezjail-admin stop ersteJail

Jails beim Systemstart starten

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).

In eine Jail einloggen

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

Update der Basisjail

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.

Update auf einen neuen Patchlevel

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

Update auf ein neues Release

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.