Jaily ve FreeBSD
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 zsvn 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 jailemtest
mount.devfs
- automatické připojování devfshost.hostname
- hostname ;-), pokud možno FQDNip4.addr
- ipv4 adresa přiřazená jailuinterface
- 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
aexec.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