Asi před rokem jsem na hlavním webu psal o kontejnerech nspawn na linuxu. Tentokrát si ukážeme rychlý návod na nastavení kontejnerů na FreeBSD, toho času verze 11.

Tento návod vychází přímo z dokumentace.

Příprava ZFS datasetu

Připravíme si místo pro jaily, já mám zfs zpool jménem tank (skutečně originální jméno :-) ). Pro více informací o administraci ZFS viz krátký seriál.

zfs create tank/jails
zfs create tank/jails/test

Jinak tohle nemá na jail žádný vliv, můžeme jej umístit do libovolného adresáře. ZFS dataset má výhody v podpoře snapshotů, různého nastavení per dataset, exportů (send / receive) apod.

V budoucnu chci do freebsd jailu přenést mailserver, datasety pro ukládání emailů lze nastavit jako komprimované (i nějakým vyšším algoritmem) a mít tak další výhody.

Příprava jailu test

Připravíme si jail jménem test:

Tip: /usr/src získáme z svn checkout https://svn.freebsd.org/base/releng/verze /usr/src, kde verze bude např. 11.0 nebo jiná aktuální RELEASE.

export D=/tank/jails/test
cd /usr/src

# volitelné - pokud máme již sestaveno, není nutné
# to před každým jailem opakovat
make buildworld

make installworld DESTDIR=$D
make distribution DESTDIR=$D
mount -t devfs devfs $D/dev

Nastavení parametrů

Nastavení parametrů v souboru /etc/jail.conf:

test {
        path = /tank/jails/test;
        mount.devfs;
        host.hostname = test;
        ip4.addr = 192.168.42.10;
        interface = re0;
        exec.start = "/bin/sh /etc/rc";
        exec.stop = "/bin/sh /etc/rc.shutdown";
}
  • path - cesta k adresáři s jailem test
  • mount.devfs - automatické připojování devfs
  • host.hostname - hostname ;-), pokud možno FQDN
  • ip4.addr - ipv4 adresa přiřazená jailu
  • interface - síťové rozhranní fyzického stroje, na který bude přiřazena ip adresa jailu. Tímto můžeme konkrétní jail zapojovat do konkrétní sítě.
  • exec.start a exec.stop - proces, který se má zavolat pro start a pro ukončení jailu, v tomto případě init skript freebsd.

Spuštění jailu test

Takto nastavený jail můžeme spustit příkazem:

jail -c test

Seznam běžících jailů si můžeme vypsat příkazem:

# jls
   JID  IP Address      Hostname     Path
     5  192.168.42.10   test         /tank/jails/test

Jail vypneme pomocí

jail -r test

Pokud se chceme do existujícího jailu připojit, například pro nastavení (aktuálně nám tam neběží ani ssh), tak můžeme pomocí

jexec 5 sh

kde 5 je JID jailu získáného z výpisu jls.

V tomto prostředí bychom si měli nastavit alespoň ssh přístup do jailu, protože aktuálně se tam skutečně nijak jinak nedostnameme. Takže nastavíme alespoň:

  • /etc/rc.conf spuštění sshd: sshd_enable="YES"
  • /etc/resolved.conf nameservery v síti
  • /etc/ssh/sshd_config přihlášení za roota: PermitRootLogin yes
  • passwd a změna hesla roota

Potom jail restartujeme a můžeme se připojit na ssh. Dále pracujeme stejně jako na fyzickém systému, vytvoříme uživatele, nastavíme klíče, nainstalujeme programy. A nezapomeneme zkontrolovat nastavení ssh, odstranit přístup pro roota a nastavit přihlašování jen s pomocí klíčů.

Spouštění jailů při startu systému.

Pokud jsme s jailem spokojeni, můžeme nastavit spouštění při startu systému:

V souboru /etc/rc.conf:

jail_enable="YES"
jail_list="test"

Potom lze s jailem pracoval jako s libovolnou službou, tj pomocí service jail start test jej zapnout, service jail stop test vypnout.

Update OS v jailech

Postup update OS v jailech je podobný, jako instalace jailu. Nejdříve je potřeba zkompilovat balíčky:

cd /usr/src
make -j 16 buildworld

Potom přes všechny jaily (opět pracujeme v adresáři /usr/src):

JAIL=/tank/jails/jailname

service jail stop jailname

mergemaster -Fp -D $JAIL
make installworld DESTDIR=$JAIL
mergemaster -a -C -D $JAIL

service jail start jailname