CoMo schrieb:
Dann muss ich vielleicht damit arbeiten und mich damit abfinden, dass es mit DHCP nicht geht.
Ansonsten hat man ja auch immer noch die Möglichkeit, Jails quasi "zu Fuß" zu erstellen.
Und das ist eigentlich auch im
Handbuch (Chapter Jails&Containers) gut beschrieben.
Die typische Vorgehensweise ist, das man sich ein ZFS-Dataset für die Jail erzeugt. Ist nicht notwendig, aber praktisch, weil man dann sowas wie Snapshots hat und auch leicht Größenlimits setzen kann usw.
Deswegen machen das auch die meisten Jail-Management-Tools so. Idealerweise noch mit einem übergeordneten Dataset, für gemeinsame (und vererbbare) Eigenschaften.
Code:
zfs mypool/jails
zfs mypool/jails/testjail
Wenn
mypool auch der Root-Pool ist, dann hat man jetzt direkt das Verzeichnis
/jails/testjail
Typischerweise ist das so, das man chroot-mäßig ein vollständiges Grundsystem in die Jail rein installiert (muss nicht notwendigerweise so sein , da sind verschiedene Vorgehensweisen möglich, von denen einige auch im Handbuch beschrieben sind).
Am leichtesten geht das durch die Benutzung des FreeBSD-Installers
bsdinstall:
bsdinstall jail /jails/testjail
Man kann dann gleich gucken, ob das FreeBSD-System in der Jail auf den neusten Stand ist und ggf. updaten:
freebsd-update -b "/jails/testjail" fetch install
Die Jail-Konfiguration selbst liegt i.d.R. in der
/etc/jail.conf. Wenn sich das Jail-System selbst via DHCP eine IP-Adresse holen soll, wird das eine VNET-Jail sein müssen. Dadurch kriegt die Jail einen vollwertigen eigenen Netzwerkstack. Außerdem braucht man ein virtuelles Netzwerkinterface (mit eigener MAC-Adresse usw.).
Das macht man unter FreeBSD mit
epair. Ein
epair kann man sich als virtuelle Netzwerkschnittstellen vorstellen die mit einem Kabel verbunden sind. Man hat zwei Enden. "epair0a" und "epair0b" (die
0 muss nicht zwangsläufig eine 0 sein, sondern kann auch eine beliebige andere Zahl sein). Das eine Ende kommt quasi als Netzwerkschnittstelle in die Jail. Das andere kommt wird zu einer
Netzwerkbrücke (die Netzwerkbrücke kann man sich als virtuellen Ethernet-Switch vorstellen) hinzugefügt.
Auch das ist im Handbuch beschrieben (
Creating a VNET Jail).
(unter
/usr/share/examples/jails/ gibts ein Skript names
jib, mit dem man sich das Leben etwas erleichtern kann ; da kann man sich auch semi-automatisch die
bridge und
epair erstellen lassen)
Wenn wir das von Hand machen wollen, können wir grob so vorgehen wie im Handbuch beschrieben:
Code:
ifconfig bridge create
ifconfig bridge0 addm re0
(wobei für
re0 hier für das phyische Netzwerkinterface des Hosts einzutragen ist)
Willst Du die beim Booten automatisch erstellen lassen, füge folgendes der
/etc/rc.conf hinzu:
Bash:
cloned_interfaces="bridge0"
ifconfig_bridge0="addm re0 up"
Jedenfalls könnte dann unsere
/etc/jail.conf so aussehen:
Bash:
# Globale Parameter, die für alle Jails gelten
exec.start += "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown jail";
exec.consolelog = "/var/log/jail_${name}_console.log";
# Definition der einzelnen Jails:
testjail {
# ${name} wird durch den Jailnamen ersetzt
# also hier 'testjail'
host.hostname = "${name}";
path = "/jails/${name}";
mount.devfs;
devfs_ruleset = "100"; # vnet-devfs Rules + bpf
allow.set_hostname = 1;
# allow.sysvipc = 1; # falls benötigt?
$id=0; # Diese ID muss eindeutig sein;
# sprich für jede Jail eine Andere
$epair = "epair${id}"; # Netzwerkinterfacename für epair
vnet;
vnet.interface = "${epair}b";
exec.prestart = "/sbin/ifconfig ${epair} create up";
exec.prestart += "/sbin/ifconfig ${epair}a up descr jail:${name}";
exec.prestart += "/sbin/ifconfig ${bridge} addm ${epair}a up";
exec.start +="/sbin/dhclient ${epair}b";
exec.poststop = "/sbin/ifconfig ${bridge} deletem ${epair}a";
exec.poststop += "/sbin/ifconfig ${epair}a destroy";
}
(für die Beschreibung der Optionen kannst Du in der Manpage von
jail.conf(5) bzw.
jail(8) nachschauen ; außerdem haben wie fleißig
ifconfig(8) benutzt und natürlich
dhclient(8))
Was
devfs_ruleset angeht:
das sind Regeln weil die Jail ja auch ihr eigenes
/dev Verzeichnis hat. Und über diese Regeln wird geregelt, was dieses
/dev Verzeichnis innerhalb der Jail enthalten darf. Es gibt das vordefinierte Ruleset
5 (was auch beim Beispiel im Handbuch benutzt wird). Das ist ok für vnet-Jails. Es reicht aber nicht für DHCP, weil wir dafür noch Zugriff auf
/dev/bpf
brauchen.
Deswegen tragen wir folgendes Ruleset in unser
/etc/devfs.rules ein:
Bash:
[devfsrules_jail_vnet_bpf=100]
add include $devfsrules_jail_vnet
add path 'bpf*' unhide
(wir müssen dann ein
service devfs restart
machen um die Änderungen wirksam werden zu lassen oder natürlich ein Reboot)
Deine Jail starten kannst Du dann mit:
service jail onestart testjail
Sollen die Jails gleich beim booten des Host-Systems mit hoch kommen, kann man das in der /etc/rc.conf vermerken:
sysrc jail_enable="YES"
Willst Du nur bestimmte Jails beim booten starten, kann man die mit Leerzeichen getrennt angeben:
sysrc jail_list="testjail"
Wie Du siehst ist Jail-Konfiguration ganz einfach und man braucht diese Management-Tools eigentlich gar nicht. :-)
Noch ein wichtiger Hinweis zu
epair und
bridges. Das funktioniert so in der Form nur zuverlässig, wenn die Maschine ein Ethernet-Interface hat. Auf einem WLAN-Interface wird das eher schwierig, weil man dann ja auch eine eigene MAC-Adresse für die Jail braucht etc. und das dann auf den WLAN-Adapter zu realisieren geht i.d.R. nicht.
Hab ich noch was vergessen? Bestimmt. :-)
Dann ergänze ich noch oder/und Du fragst nach.