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.
Über Sinn und Unsinn kann man sich nun streiten. Ändert aber nichts, da Google dieses einfach in ihren Browser fest eingebaut hat. Möchte man nun also kein gelbes Ausrufezeichen in der Adresszeile vom Chrome haben, muss die eigene CA CT unterstützen und das Zertifikat veröffentlichen.
StartSSL/StartCOM tut dieses bisher noch nicht. Ich habe aber folgende Info bekommen:
There will be support shortly for submitting to the CT logs and installing the response for CT aware web servers (TLS extension). Support for the latter is lacking for a large part, but it should get better over time, most likely Apache first.
Wenn ich mehr habe, gibt es mehr.

In diesem Sinne….