Die Verwaltung von mehreren Jails kann problematisch sein, da jede Jail bei jedem Upgrade komplett neu gebaut werden muss. Dieser Prozess kann sehr zeitaufwändig sein, wenn eine große Anzahl von Jails erstellt oder manuell aktualisiert werden müssen.
Dieser Abschnitt beschreibt eine Methode zur Lösung dieses Problems, indem so viel wie möglich zwischen Jails, auf sichere Art und Weise, durch den Einsatz von mount_nullfs(8)-Mounts geteilt wird. Dadurch werden Aktualisierungen erleichtert und das Verteilen von verschiedenen Diensten, wie HTTP, DNS und SMTP, auf verschiedene Jails wird attraktiver. Außerdem bietet dieses Verfahren einen einfachen Weg, Jails zu erstellen, zu entfernen und zu aktualisieren.
Es existieren auch einfachere Lösungen, wie zum Beispiel ezjail, das einfachere Methoden zur Administration von Jails verwendet und daher nicht so anspruchsvoll ist, wie der hier beschriebene Aufbau. ezjail wird in Abschnitt 15.6, „Verwaltung von Jails mit ezjail“ ausführlich behandelt.
Die Ziele des in diesem Abschnitt beschriebenen Aufbaus sind:
Das Erstellen einer einfachen und gut verständlichen Jail Struktur, die es nicht erfordert für jede Jail ein vollständiges installworld laufen lassen zu müssen.
Es einfach zu machen, neue Jails zu erstellen oder alte zu entfernen.
Es einfach zu machen, bestehende Jails zu aktualisieren.
Es einfach zu machen, einen angepassten FreeBSD-Zweig zu nutzen.
Paranoid bezüglich Sicherheit zu sein und Angriffsmöglickeiten weitgehend zu reduzieren.
Soviel Platz und Inodes wie möglich einzusparen.
Dieses Design ist darauf angewiesen, dass eine read-only-Hauptvorlage in jede Jail hinein gemountet wird und dass jede Jail über wenigstens ein beschreibbares Gerät verfügt. Das Gerät kann hierbei eine separate physikalische Platte oder ein vnode unterstütztes Speichergerät sein. Im folgenden Beispiel wird ein read/write nullfs-Mount genutzt.
Das Layout des Dateisystems ist wie folgt:
Die Jails befinden sich unterhalb der
/home
Partition.
Jede Jail wird unterhalb des
/home/j
-Verzeichnisses
gemountet.
/home/j/mroot
ist die Vorlage für
jede Jail und die nur lesbare Partition für alle
Jails.
Unterhalb von /home/j
wird für jede
Jail ein leeres Verzeichnis angelegt.
Jede Jail bekommt ein
/s
-Verzeichnis, das zum
read/write-Teilbereich des Systems verlinkt wird.
Jede Jail bekommt ihr eigenes read/write-System,
das auf /home/j/skel
basiert.
Der read/write-Teilbereich jeder Jail wird in
/home/js
erstellt.
Dieser Abschnitt beschreibt die Schritte, die zum Erstellen der Hauptvorlage notwendig sind.
Es wird empfohlen, zunächst das FreeBSD Host-System nach den Anweisungen in Abschnitt 24.7, „Das komplette Basissystem neu bauen“ auf den aktuellen -RELEASE-Zweig zu aktualisieren. Darüber hinaus verwendet diese Vorlage sysutils/cpdup, sowie portsnap zum herunterladen der FreeBSD Ports-Sammlung.
Zuerst erstellen wir eine Verzeichnissstruktur für das read-only-Dateisystem, das die FreeBSD-Binärdateien für die Jails enthalten wird. Anschließend wechseln wir in den FreeBSD-Quellcodebaum und installieren das read-only-Dateisystem in die (Vorlage-)Jail.
#
mkdir /home/j /home/j/mroot
#
cd /usr/src
#
make installworld DESTDIR=/home/j/mroot
Als nächstes bereiten wir die Ports-Sammlung für die Jails vor und kopieren den FreeBSD Quellcodebaum in die Jail, da dieser für mergemaster benötigt wird:
#
cd /home/j/mroot
#
mkdir usr/ports
#
portsnap -p /home/j/mroot/usr/ports fetch extract
#
cpdup /usr/src /home/j/mroot/usr/src
Danach wird die Struktur für den read/write-Bereich des Systems erstellt:
#
mkdir /home/j/skel /home/j/skel/home /home/j/skel/usr-X11R6 /home/j/skel/distfiles
#
mv etc /home/j/skel
#
mv usr/local /home/j/skel/usr-local
#
mv tmp /home/j/skel
#
mv var /home/j/skel
#
mv root /home/j/skel
Nutzen Sie mergemaster, um fehlende Konfigurationsdateien zu installieren. Anschließend werden die von mergemaster erstellten Extra-Verzeichnisse entfernt:
#
mergemaster -t /home/j/skel/var/tmp/temproot -D /home/j/skel -i
#
cd /home/j/skel
#
rm -R bin boot lib libexec mnt proc rescue sbin sys usr dev
Nun wird das read/write-Dateisystem mit dem
read-only-Dateisystem verlinkt. Vergewissern Sie
sich, dass die symbolischen Links an den korrekten
s/
Positionen erstellt werden, weil
echte Verzeichnisse oder an falschen Positionen
erstellte Verzeichnisse die Installation fehlschlagen
lassen.
#
cd /home/j/mroot
#
mkdir s
#
ln -s s/etc etc
#
ln -s s/home home
#
ln -s s/root root
#
ln -s s/usr-local usr/local
#
ln -s s/usr-X11R6 usr/X11R6
#
ln -s s/distfiles usr/ports/distfiles
#
ln -s s/tmp tmp
#
ln -s s/var var
Zuletzt erstellen Sie eine allgemeine
/home/j/skel/etc/make.conf
mit
folgendem Inhalt:
WRKDIRPREFIX?= /s/portbuild
Dies erlaubt es, die FreeBSD-Ports innerhalb jeder Jail
zu kompilieren. Das Ports-Verzeichnis ist Teil des
read-only System. Der angepasste Pfad des
WRKDIRPREFIX
macht es möglich,
innerhalb des read/write-Bereichs der Jail Ports zu
bauen.
Die Jailvorlage kann nun verwendet werden, um die Jails
einzurichten und in /etc/rc.conf
zu
konfigurieren. In diesem Beispiel werden drei Jails
erstellt: NS
, MAIL
und WWW
.
Fügen Sie die folgenden Zeilen in
/etc/fstab
ein, damit die
read-only-Vorlage und der read/write-Bereich für
alle Jails verfügbar sind:
/home/j/mroot /home/j/ns nullfs ro 0 0 /home/j/mroot /home/j/mail nullfs ro 0 0 /home/j/mroot /home/j/www nullfs ro 0 0 /home/js/ns /home/j/ns/s nullfs rw 0 0 /home/js/mail /home/j/mail/s nullfs rw 0 0 /home/js/www /home/j/www/s nullfs rw 0 0
Um zu verhindern, dass fsck
die nullfs-Mounts während des
Bootens überprüft oder dass
dump die Mounts sichert, müssen
die letzten beiden Spalten auf 0
gesetzt werden.
Konfigurieren Sie die Jails in
/etc/rc.conf
:
jail_enable="YES" jail_set_hostname_allow="NO" jail_list="ns mail www" jail_ns_hostname="ns.example.org" jail_ns_ip="192.168.3.17" jail_ns_rootdir="/usr/home/j/ns" jail_ns_devfs_enable="YES" jail_mail_hostname="mail.example.org" jail_mail_ip="192.168.3.18" jail_mail_rootdir="/usr/home/j/mail" jail_mail_devfs_enable="YES" jail_www_hostname="www.example.org" jail_www_ip="62.123.43.14" jail_www_rootdir="/usr/home/j/www" jail_www_devfs_enable="YES"
Die Variable
jail_
zeigt nach name
_rootdir/usr/home
statt nach
/home
, da der physikalische Pfad
von /home
unter FreeBSD
/usr/home
lautet. Die Variable
jail_
darf im Pfad aber
keinen symbolischen Link enthalten,
weil die Jail ansonsten nicht gestartet werden
kann.name
_rootdir
Erstellen Sie die notwendigen Mountpunkte für die nur lesbaren Bereiche jeder Jail:
#
mkdir /home/j/ns /home/j/mail /home/j/www
Installieren Sie mit sysutils/cpdup die read/write-Vorlage in jede Jail:
#
mkdir /home/js
#
cpdup /home/j/skel /home/js/ns
#
cpdup /home/j/skel /home/js/mail
#
cpdup /home/j/skel /home/js/www
An dieser Stelle werden die Jails erstellt und für den Betrieb vorbereitet. Mounten Sie zuerst die notwendigen Dateisysteme für jede Jail. Danach starten Sie die Jails:
#
mount -a
#
service jail start
Die Jails sollten nun laufen. Um zu prüfen, ob sie
korrekt gestartet wurden, verwenden Sie
jls
. Die Ausgabe sollte ähnlich der
folgenden sein:
#
jls
JID IP Address Hostname Path 3 192.168.3.17 ns.example.org /home/j/ns 2 192.168.3.18 mail.example.org /home/j/mail 1 62.123.43.14 www.example.org /home/j/www
An diesem Punkt sollte es möglich sein, sich an jeder Jail
anzumelden, Benutzer anzulegen und Dienste zu konfigurieren.
Die Spalte JID
gibt die
Jail-Identifikationsnummer jeder laufenden Jail an. Nutzen
Sie den folgenden Befehl, um administrative Aufgaben in der
Jail mit der JID
3
durchzuführen:
#
jexec 3 tcsh
Das Design dieses Aufbaus bietet einen einfachen Weg, bestehende Jails zu aktualisieren, während die Ausfallzeiten minimiert werden. Außerdem bietet es die Möglichkeit, zu älteren Versionen zurückzukehren, falls irgendwelche Probleme auftreten.
Im ersten Schritt wird das Host-System aktualisiert.
Anschließend wird eine temporäre neue read-only Vorlage
/home/j/mroot2
erstellt.
#
mkdir /home/j/mroot2
#
cd /usr/src
#
make installworld DESTDIR=/home/j/mroot2
#
cd /home/j/mroot2
#
cpdup /usr/src usr/src
#
mkdir s
installworld
erzeugt
einige unnötige Verzeichnisse, die nun entfernt werden
sollten:
#
chflags -R 0 var
#
rm -R etc var root usr/local tmp
Erzeugen Sie neue symbolische Links für das Hauptdateisystem:
#
ln -s s/etc etc
#
ln -s s/root root
#
ln -s s/home home
#
ln -s ../s/usr-local usr/local
#
ln -s ../s/usr-X11R6 usr/X11R6
#
ln -s s/tmp tmp
#
ln -s s/var var
Nun können die Jails gestoppt werden:
#
service jail stop
Hängen Sie die originalen Dateisysteme aus, da die
read/write-Systeme an das read-only System
(/s
) angeschlossen sind:
#
umount /home/j/ns/s
#
umount /home/j/ns
#
umount /home/j/mail/s
#
umount /home/j/mail
#
umount /home/j/www/s
#
umount /home/j/www
Verschieben Sie das alte read-only-Dateisystem und ersetzen Sie es durch das neue Dateisystem. Das alte Dateisystem kann so als Backup dienen, falls etwas schief geht. Die Namensgebung entspricht hier derjenigen bei der Erstellung eines neuen read-only-Dateisystems. Verschieben Sie die originale FreeBSD Ports-Sammlung in das neue Dateisystem, um Platz und Inodes zu sparen:
#
cd /home/j
#
mv mroot mroot.20060601
#
mv mroot2 mroot
#
mv mroot.20060601/usr/ports mroot/usr
Nun ist die neue read-only-Vorlage fertig. Sie müssen daher nur noch die Dateisysteme erneut mounten und die Jails starten:
#
mount -a
#
service jail start
Nutzen Sie jls
um zu prüfen, ob die
Jails korrekt gestartet wurden. Führen Sie innerhalb jeder
Jail mergemaster
aus, damit die
Konfigurationsdateien aktualisiert werden.
Wenn Sie Fragen zu FreeBSD haben, schicken Sie eine E-Mail an
<de-bsd-questions@de.FreeBSD.org>.
Wenn Sie Fragen zu dieser Dokumentation haben, schicken Sie eine E-Mail an
<de-bsd-translators@de.FreeBSD.org>.