Otthoni NAS telepítése FreeBSD-vel II: Jail-ek

A hétvégén nagyon jó érzés volt új dolgokat megnézni, és ismerkedni a FreeBSD-vel. Nagyon sok ismeretlen terület van még, de kezdem megszokni, és megszeretni a rendszert.

Ez a rövid élménybeszámoló az előző blogbejegyzés folytatása lenne: https://hup.hu/node/185213

Pár módosítás az előző setuphoz képest

Pár dolgot módosítottam az előző leíráshoz képest, pl a dataset-eket átrendeztem a "zfs rename" paranccsal. (Be tudsz tenni utólag egy dataset-et egy másik dataset-be, snapshot-okat egyszerűbb lesz így).
A tank1 zfs pool-t töröltem, és újra létrehoztam, 512k rekordmérettel (SLOG nélkül nagyon lassú volt a sambán keresztül az írás a tank1-re).

Feltettem a wsdd-t (pkg install py39-wsdd), ahogy @tamascsabi is javasolta (köszi szépen a tippet), és valóban, most már a windows gépek is jól megtalálják a hálózaton a megosztást.
Ehhez ennyi paraméterezésre volt még szükség:

sysrc wsdd_enable="YES"
sysrc wsdd_group="WORKGROUP"
sysrc wsdd_flags="-4 -n NAS"

(Szolgáltatás bekapcsolása, workgroup beállítása, csak ipv4-en működjön, és a megosztás név: NAS)

Anyagok a rendszerrel való ismerkedéshez

FreeBSD Jail-ek

A cél most annyi volt, hogy kipróbáljam a JAIL-eket, és feltegyek a NAS-ra pár szolgáltatást, ami kell nekem.

A handbook jól leírja, hogy hogyan működnek a jail-ek, ez az alapokat írja le: https://docs.freebsd.org/en/books/handbook/jails/ Érdemes ezzel kezdeni, kb 15 perc alatt elolvasható, a másik fél óra a kipróbálás.

A handbook alapján én próbaképpen hoztam is létre többféle jailt is. Minden pont úgy működik, ahogy a handbook-ban van. A handbook-ot ismételni nem szeretném, csak azt írom le, hogy én mire jutottam:

  • Én thick jail-eket használok vnet hálózati beállításokkal. Itt a teljes rendszer benne van a jail-ben, külön kell update, upgrade-elni őket.
  • Lehetett volna használni még thin jail-t, ahol a jail használhat megosztott rendszerfájlokat, vagy könyvtárakat más jailekkel.
  • Megemlítem még a linux jail-eket, de most nem használok ilyet. (de jól jöhet majd)
  • Hálózati konfig alapján: Több lehetőség van (nat-olt, host módban futó pl), én vnet jail-eket használok, ahol egy teljesértékű network stack-je van a jail-nek. Fix IP címet adok nekik, a LAN-on lógnak, és a saját IP címükkel elérhetőek.

Hálózati konfiguráció a VNET Jail-ekhez

Ha vnet jail-eket akarunk használni, akkor kell csinálni egy bridge-et, és bele kell tenni a hálózati interfészt. Ez a 17.5.3. Creating a VNET Jail fejezetben van leírva a kézikönyvben:

ifconfig bridge create
ifconfig bridge0 addm re0

és az /etc/rc.conf-ot módosítani kell a kézikönyv szerint:

defaultrouter="192.168.1.1"
cloned_interfaces="bridge0"
ifconfig_bridge0="inet 192.168.1.150/24 addm em0 up"

Ez lehet, hogy triviális mindenkinek, de itt a kézikönyv talán nem volt túl szájbarágós: a host gép IP címét kell megadni, és az eredeti interfésztől pedig törölni kell. Ott csak annyinak kell maradni, hogy "up". Ez az én konfigom:

# ifconfig_re0="inet 192.168.4.200 netmask 0xffffff00"
ifconfig_re0="up"
defaultrouter="192.168.4.1"
cloned_interfaces="bridge0"
ifconfig_bridge0="inet 192.168.4.200 netmask 0xffffff00 addm re0 up"

Így a hálózat újraindítása után a bridge interfész kapja majd az IP címet a host gépen. Ha vnet módban indítjuk majd a Jailt, akkor a Jail-hez tartozó interfészek is ehhez a bridge-hez lesznek hozzáadva, a Jail látni fogja a host gépet, és a Jailt is látja majd mindenki.

ifconfig bridge0
bridge0: flags=1008843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
	options=0
	ether 58:9c:fc:10:ff:82
	inet 192.168.4.200 netmask 0xffffff00 broadcast 192.168.4.255
	id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
	maxage 20 holdcnt 6 proto rstp maxaddr 2000 timeout 1200
	root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0
	member: vnet0.4 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
	        ifmaxaddr 0 port 8 priority 128 path cost 2000
	member: vnet0.3 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
	        ifmaxaddr 0 port 11 priority 128 path cost 2000
	member: vnet0.1 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
	        ifmaxaddr 0 port 5 priority 128 path cost 2000
	member: re0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
	        ifmaxaddr 0 port 1 priority 128 path cost 55
	groups: bridge
	nd6 options=9<PERFORMNUD,IFDISABLED>

 

Jail manager (iocage) telepítése, és használatba vétele

Ha valaki kipróbálja a handbook alapján a jail-eket (ami szerintem kötelező, ha használni szeretné őket), akkor láthatja, hogy így jail-eket csinálni nagyon körülményes, nem egy működőképes dolog hosszú távon. De elérhető több jail manager is FreeBSD alá, én az iocage-et próbáltam ki. A TrueNas core-ban is ezt használták, és ez nagyon elterjedtnek, és jól kipróbáltnak tűnik.

Konfiguráció:

Az iocage doksija (https://iocage.readthedocs.io/en/latest/) alapján a /etc/sysctl.conf fájlba ezeket felvettem:

net.inet.ip.forwarding=1       # Enable IP forwarding between interfaces
net.link.bridge.pfil_onlyip=0  # Only pass IP packets when pfil is enabled
net.link.bridge.pfil_bridge=0  # Packet filter on the bridge interface
net.link.bridge.pfil_member=0  # Packet filter on the member interface

iocage telepítése:

pkg search iocage
pkg install py39-iocage-1.2_12

Engedélyezés:

sysrc iocage_enable="YES"

iocage inicializálása:

iocage activate zroot

(Ez hozza lézre a dataset-eket a zroot pool-ban, amik kell neki. Úgy láttam, kb hasonlóan, mint ahogy a handbook-ban is javasolják, csak ott kézzel kell ezeket létrehozni.)

FreeBSD 14 letöltése:

iocage fetch -r 14.0-RELEASE

(A kézikönyv módszere alapján fetch-el kell letölteni a tar.gz-t, és kicsomagolni az erre a célra létrehozott template könyvtárba. Az iocage ezt rendezi magának.)

Konténerek létrehozása, és az iocage használata

Egy paranccsal már lehet is jail-t létrehozni, például:

iocage create -n "adguard" -r 14.0-RELEASE --thickjail vnet="on" allow_raw_sockets="1" boot="on" defaultrouter="192.168.4.1" ip4_addr="192.168.4.202/24" ip6_addr="none" defaultrouter6="none"

Az iocage doksijában érdemes elolvasni a lehetőségeket, de könnyen megjegyezhető a használata. pl, iocage list, iocage create, iocage destroy, iocage stop, iocage restart. vagy iocage exec, stb... nem kell magyarázni, hogy melyik mire jó.

Könyvtárak, dataset-ek felmountolása a jail-be

A host gépről könyvtárat, vagy dataset-et kétféle módon lehet felmountolni:

  • zfs paranccsal (vagy iocage paranncsal) beállíthatod egy dataset-re, hogy az egy jail-hez tartozó dataset, és hogy melyik jailhez tartozik. Ilyenkor ezt a dataset-et már csak a jail-en belül tudod kezelni,
    a host gépen a biztonság miatt nem mountolhatod fel (Ha jól értettem). Nem próbáltam még ki ezt a módszert.
  • nullfs segítségével.

Mount-olás nullfs segítségével:

A /boot/loader.conf könyvtárban engedélyezni kell a nullfs modult:

nullfs_load="YES"

Be is lehet reboot nélkül tölteni:

kldload nullfs

majd például a plex-hez kapcsolódó könyvtár felmountolása a host gépről:

iocate exec plex mkdir -p /tank1/data
iocage fstab -a plex /tank1/data /tank1/data nullfs rw 0 0

Az első parancs létrehozza a könyvtárat a jail-ben, a második pedig felvesz egy jail-hez tartozó fstab bejegyzést.

Egyébként érdemes az iocage által létrehozott dataset-ekben, könyvtárakban körbenézni, pl a plex esetén a /zroot/iocage/jails/plex/ könyvtárban érhető el a config.json, ami a jail konfigurációját tartalmazza, az fstab, amiben a nullfs mount van, és a root könyvtár, ami a jail root-ja. Tehát fájlokat bármikor be lehet másolni a jail-be a host gépről egy sima cp paranccsal.

Egyéb erőforrások megosztása a jaillel

Nekem nem volt rá szükségem, nem próbáltam ki, de remélem, hogy a leírásból jól értettem meg. Egy fontos dolog még a devfs, és a devfs_ruleset. Ha valaki kipróbálja a konténer létrehozást, akkor látható, hogy iocage generál egy devfs ruleset id-t. Ezzel lehet konfigurálni a /dev/devfs.rules fájlban, hogy a konténer milyen eszközöket láthat. A pgk install szinte minden csomag telepítése után ír még instrukciókat, ez pl a plex-hez volt, ami ahhoz kellhet, hogy a hardware-es enkódolás működjön, ha intel gpu-d van:

For jails, make a devfs ruleset to expose /dev/dri/* devices.
e.g., /dev/devfs.rules on the host:
[plex_drm=10]
add include $devfsrules_hide_all
add include $devfsrules_unhide_basic
add include $devfsrules_unhide_login
add include $devfsrules_jail
add path 'dri*' unhide
add path 'dri/*' unhide
add path 'drm*' unhide
add path 'drm/*' unhide

Egyéb dolgok, amikre figyelni kell

(Én beleszaladtam a pofonokba.) Az iocage automatikusan betette nekem az ipv6 engedélyezését az összes interfészen a jail-en belül a /etc/rc.conf-ba. Ezt én kikapcsoltam, mert nincs rendesen beállítva, és az adguard pl nem működött jól.

Ha megosztott könyvtárad van (pl sambahoz, vagy plex-hez), és pl NFSv4 ACL-eket használsz, akkor a jail-en belüli usereknek, group-oknak is meg kell adni a jogosultságot a setfacl paranccsal. Érdemes eltérő UID, és GID-eket használni.

Például: A sambát át szeretném tenni jail-be, de egyenlőre furcsa hibába futottam, jogosultság probléma, valószínűleg valamit benéztem. A kliens gép csak homokórázott, amikor egy megosztott mappát meg akartam nyitni, majd hosszú timeout után hibaüzenet. De a plex működik, akkor ennek is működnie kell. (a plex esetén a plex usert hozzá kellett adni setfacl paranccsal a megfelelő jogosultságokkal a megosztott plex könyvtárhoz, a jail-en belül)

 

TODO

  • Smartctl
  • Snapshot-ok
  • Zfs scrub
  • rsync backup, vagy zfs replika egy távoli gépre
  • Email küldés (pl a smartctl eredménye)
  • HDD idle mód / folyamatos bekapcsolva hagyás
    • camcontrol-lal kell-e állítanom a HDD-ken, hogy ne álljanak le, ne menjenek idle módba, vagy éppen azt, hogy álljanak le? (vagy felesleges ezt bántani)
      Egy ilyet találtam példának (vagy akár megoldásnak): https://github.com/ngandrass/truenas-spindown-timer
  • Van még szolgáltatás, amit fel szeretnék tenni, pl nginx reverse proxy, hogy ne kelljen 10 különböző IP címet, meg portokat bepötyögnöm. Vagy Transmission.

Hozzászólások

Jó lesz, bár én a jailekhez nem használok managert, kézzel állítom be őket, sokkal jobb ha otthonira kell, mert legalább tudom mit állítok be.
(nekem a jail managerek mindíg elállítgattak bizonyos opciókat azután keresgethettem, mi a hibás)
Szerintem egyszerűbb is ilyen kevés számú jail-nél.
A bridge interfacet nem kell a megcímezni, minek, de ha szeretnéd, úgy is jó.
Bekonfigurálod a külső lábát az int_if-nek, azután a jail epair interface-eit is beállítod ugyanabba a hálózati tartományba, oszt jóidő.
rc.conf-ba nem árt:

% sysrc jail_parallel_start="YES"
% sysrc jail_list="samba plex"

Sambához itt az én beállításom, bár kicsit más, de hátha tudsz belőle szemezgetni.

freebsd-samba-jail-cups-hplip/