FreeBSD kann Linux-Binaries ausführen. Das ist nichts Neues. Aber ein komplettes Debian in einer Jail laufen lassen, mit apt-get und allem was dazugehört? Das geht auch. Die Jail nutzt den FreeBSD-Kernel, das Userland kommt von Debian GNU/kFreeBSD. iocage erstellt die Jail, debootstrap installiert das Debian-Basissystem hinein.
Hinweis: Debian GNU/kFreeBSD wurde nach Debian 8 (Jessie) eingestellt. Für aktuelle Setups ist linux_enable="YES" in der /etc/rc.conf mit einer regulären Linux-Jail der bessere Weg. Die hier gezeigte Methode funktioniert aber weiterhin mit älteren Debian-Versionen und zeigt das Prinzip.
Voraussetzungen
iocage muss installiert und konfiguriert sein. Zusätzlich wird debootstrap benötigt:
pkg install debootstrap
Jail erstellen
Die Jail wird mit iocage angelegt. Die entscheidenden Parameter sind exec_start und exec_stop. Statt der üblichen FreeBSD-Init-Skripte werden die Debian-Runlevel aufgerufen:
iocage create -e tag=debian-jail01 \ exec_start="/etc/init.d/rc 3" \ exec_stop="/etc/init.d/rc 0"
Runlevel 3 startet die Dienste, Runlevel 0 fährt herunter. Den Mountpoint der neuen Jail auslesen:
iocage get mountpoint debian-jail01 # /iocage/jails/19e3594f-.../
Debian installieren
debootstrap holt ein minimales Debian von den Mirrors und entpackt es in das Root-Verzeichnis der Jail. In diesem Beispiel Debian Wheezy:
debootstrap wheezy /iocage/jails/19e3594f-.../root/ # I: Retrieving Release # I: Retrieving Packages # I: Resolving dependencies of required packages... # I: Resolving dependencies of base packages... # [... ~150 Pakete werden heruntergeladen und entpackt ...] # I: Configuring adduser... # I: Configuring apt... # I: Base system installed successfully.
Das dauert ein paar Minuten. Am Ende steht ein komplettes Debian-Basissystem im Jail-Verzeichnis.
fstab für die Jail
Debian braucht ein paar Dateisysteme die FreeBSD nicht automatisch in Jails mountet. Die fstab der Jail (nicht die im Debian) bekommt drei Einträge:
# /iocage/jails/19e3594f-.../fstab linsysfs .../root/sys linsysfs rw 0 0 linprocfs .../root/proc linprocfs rw 0 0 tmpfs .../root/lib/init/rw tmpfs rw,mode=777 0 0
linsysfs und linprocfs stellen die Linux-kompatiblen /sys und /proc bereit. Ohne die funktionieren viele Linux-Programme nicht. Das tmpfs für /lib/init/rw braucht Debians Init-System.
Netzwerk und Hostname
IP-Adresse und Hostname setzen:
iocage set vnet=off debian-jail01 iocage set ip4_addr="em0|192.168.1.46/16" debian-jail01 iocage set hostname="debian-jail01" debian-jail01 iocage set host_hostname="debian-jail01" debian-jail01
Die /etc/hosts im Debian-Dateisystem anpassen:
# /iocage/jails/19e3594f-.../root/etc/hosts 127.0.0.1 localhost debian-jail01 ::1 localhost ip6-localhost ip6-loopback debian-jail01
Starten und nutzen
Beim ersten Start kommen ein paar Fehlermeldungen wegen mount_unionfs und fehlenden Verzeichnissen. Die sind harmlos und können ignoriert werden:
iocage start debian-jail01 # mount_unionfs: .../: No such file or directory # mount: .../root/usr/home: No such file or directory # * Starting 19e3594f-... (debian-jail01) # + Started (shared IP mode) OK # + Starting services OK
Konsole betreten:
iocage console debian-jail01 # GNU/kFreeBSD debian-jail01 10.2-RELEASE-p4 root@debian-jail01:~# apt-get update root@debian-jail01:~# apt-get install mc
apt-get funktioniert, Pakete lassen sich installieren, Dienste starten. Von aussen geht auch iocage exec debian-jail01 uname -a und zeigt den FreeBSD-Kernel mit GNU/kFreeBSD-Userland.
Das Stoppen funktioniert wie bei jeder anderen Jail:
iocage stop debian-jail01
Einordnung
Das hier ist kein Ersatz für eine richtige Linux-VM. Es ist ein Trick: Der FreeBSD-Kernel stellt die Jail-Isolation, Debian liefert das Userland. Nützlich wenn man ein bestimmtes Linux-Tool braucht das es für FreeBSD nicht gibt, oder wenn man testen will wie sich Software unter Debian verhält.
Für produktive Linux-Workloads auf FreeBSD ist heute eher eine reguläre Jail mit dem Linux-Kompatibilitätslayer oder gleich bhyve die bessere Wahl.
Fragen? Einfach melden.
Schreibe einen Kommentar