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