Jails gebruiken in FreeBSD

FreeBSD heeft standaard een functie waarmee je jails kan aanmaken (vergelijkbaar met Linux containers). In freebsd zijn deze zeer uitgebreid: Er zijn “Thick Jails” waar elke jail zijn eigen bestandssysteem heeft, “Thin jails” waar maar een paar mappen verschillen en de rest word overgenomen van het basissysteem, en zelfs Linux Jails, waarmee je Linux applicaties kan draaien op een freeBSD kernel! In deze post leg ik uit hoe je Thick Jails kan gebruiken, maar je kan meer lezen over de andere soorten jails in de FreeBSD documentatie.

Jails inschakelen

Om jails in te schakelen, moeten we de volgende 2 commando’s uitvoeren:

sysrc jail_enable="YES"
sysrc jail_parallel_start="YES"

vervolgens moeten we de basis mappenstructuur aanmaken voor de jails:

zfs create -o mountpoint=/usr/local/jails zroot/jails
zfs create zroot/jails/media
zfs create zroot/jails/templates
zfs create zroot/jails/containers

vervolgens moeten we de userland files downloaden. Ik gebruik hier “thickjail” als naam van de jail die ik maak.

fetch https://download.freebsd.org/ftp/releases/amd64/amd64/13.2-RELEASE/base.txz -o /usr/local/jails/media/13.2-RELEASE-base.txz
mkdir -p /usr/local/jails/containers/thickjail
tar -xf /usr/local/jails/media/13.2-RELEASE-base.txz -C /usr/local/jails/containers/thickjail --unlink
cp /etc/resolv.conf /usr/local/jails/containers/thickjail/etc/resolv.conf
cp /etc/localtime /usr/local/jails/containers/thickjail/etc/localtime

Nu de jail is geconfigureerd, kunnen we deze updaten naar het laatste freebsd patch level

freebsd-update -b /usr/local/jails/containers/thickjail/ fetch install

vervolgens moeten we het volgende toevoegen aan “/etc/jail.conf”, of aan een nieuw bestand in /etc/jail.conf.d/

thickjail {
  # STARTUP/LOGGING
  exec.start = "/bin/sh /etc/rc";
  exec.stop = "/bin/sh /etc/rc.shutdown";
  exec.consolelog = "/var/log/jail_console_${name}.log";

  # PERMISSIONS
  allow.raw_sockets;
  exec.clean;
  mount.devfs;

  # HOSTNAME/PATH
  host.hostname = "${name}";
  path = "/usr/local/jails/containers/${name}";

  # NETWORK
  ip4.addr = 172.16.0.201;
  interface = em0;
}

Tip: als je het IP van de host wilt delen, kan je “ip4 = inherit” gebruiken.

We kunnen nu de jail starten met

service jail start thickjail

De jail beheren

We kunnen de draaiende jails oplijsten met “jls”:

root@testbsd:/etc/jail.conf.d # jls
   JID  IP Address      Hostname                      Path
     1  172.16.0.201    thickjail                     /usr/local/jails/containers/thickjail

Om de jail te starten of stoppen, kunnen we het volgende gebruiken

service jail stop thickjail
service jail start thickjail
service jail restart thickjail

We kunnen ook een shell openen in de jail:

jexec -u root thickjail

Jails opstarten bij systeemstart

Om een jail te starten bij de systeemstart, kunnen we het volgende toevoegen aan /etc/rc.conf

jail_list="thickjail"

je kan meerdere jails toevoegen, gescheiden met een spatie.

Jails verwijderen

service jail stop jailname
chflags -R 0 /usr/local/jails/containers/jailname
rm -rf /usr/local/jails/containers/jailname