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/srczí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 jailemtestmount.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.startaexec.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.confspuštění sshd:sshd_enable="YES"/etc/resolved.confnameservery v síti/etc/ssh/sshd_configpřihlášení za roota:PermitRootLogin yespasswda 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