Otthoni NAS telepítése FreeBSD-vel I: FreeBSD telepítés, ZFS beállítása, Samba

Kipróbáltam a FreeBSD-t, egy NAS-t kezdtem el itthon telepíteni, és gondoltam erről írok egy jegyzetet (hátha kedvet kap más is, mert nagyon egyszerű volt, másrészt én el fogom felejteni, ezért mindenképpen le akartam írni). Több ok miatt is a FreeBSD-t választottam: stabil, community, dokumentáltság, ZFS-t natívan támogatja, jails, és nem az utolsó, hogy szeretnék vele megismerkedni. Miért nem a NAS megoldások (TrueNAS és társai): A TrueNAS Core-t, és a TrueNAS Scale-t is kipróbáltam, igazán jó programok, de úgy gondoltam, hogy ami nekem kell, azt egy valamilyen általános oprendszerrel meg tudom oldani. A FreeBSD-re valószínűleg gyakrabban kaphatok fontos security frissítéseket. Az én use case-emre a FreeBSD-nek elégnek kell lennie. Ha valami egy grafikus interfészen kattintgatva nem működik / nem úgy működik, akkor azt kisebb valószínűséggel oldom meg, mint ha eleve FreeBSD-t használnék.

A gép

  • CPU: AMD Ryzen 5600G
  • Motherboard: Gigabyte B550M
  • RAM: 32 Gb
  • /dev/nda0: 250 Gb Silicon Power SSD, M.2
  • /dev/ada0: 512 Gb Samsung Evo 870 SSD, Sata
  • /dev/ada1: 3 Tb WD RED, Sata
  • /dev/ada2: 3 Tb WD RED, Sata
  • /dev/ada3: 2 Tb Toshiba, Sata

A következőket szeretném

  • Otthoni NAS
  • A NAS-ra ZFS fájlrendszert szeretnék
  • Legyen egy olyan pool, amin az adatok tükrözve vannak, ezekre kerülnek a fontos adatok
    • A két darab 3 Tb-os WD RED-re kerülnének a fontos adatok tükrözve, ez lenne egy pool
  • Legyen egy olyan pool, ami egy darab HDD-ból áll, és a nem fontos adatok vannak rajta
    • A 2 Tb-os HDD-re a nem fontos adatok: ez meg a másik pool.
  • Az ada0-ra telepítem a FreeBSD-t.
  • Az M.2-es SSD-t felhasználom SLOG-nak a ZFS-hez (lehet, hogy ez felesleges itt, de kipróbálom mi ez).

FreeBSD telepítése

  • 14-es FreeBSD ISO letöltése, és pendrive-ra írása
  • Telepítéskor ki lehetett választani a magyar beállításokat (billentyűzet, locale, timezone)
  • Auto ZFS particionálást választottam, és kiválasztottam az ada0 disk-et.
  • A telepítő felajánlotta a DHCP bekapcsolását, de én fix IP címet adtam. Az IPV6-ot kikapcsoltam (legközelebb).
  • A felajánlott csomagokat telepítettem, szerintem a ports-ot választottam még ki pluszban.
  • A szolgáltatások között bekapcsoltam a CPU frekvenciát állító szolgáltatást, az NTP szolgáltatásokat (start-kor a beállítást, és az NTP daemont)
  • Megadtam a ROOT felhasználó jelszavát.
  • Felvettem egy plusz usert, akit még betettem a wheel group-ba is. Ez azért kell, hogy a "su" egyáltalán működjön.

A telepítés után

  • Feltettem a bash-t
  • Feltettem a doas-t, ez olyasmi mint a sudo.
  • Frissítések: freebsd-update fetch / freebsd-update upgrade parancsok. Egy pozitív élmény volt, hogy frissítéskor úgy láttam, hogy csinált egy boot snapshot-ot, amire vissza lehet térni egy mozdulattal.
  • Frissítések: pkg help / pkg update / pkg upgrade
  • Ez pl egy leírás, hogy mit lehet csinálni telepítés után: https://www.dwarmstrong.org/freebsd-after-install/ (de több ilyen is van a net-en érdemes körbenézni)

Az NTP is, és később a Samba is bootolás után hibát jelzett, hogy még nem elérhető a hálózat. Az NTP nem tudta a time server nevét feloldani, a Samba pedig nem tudott UDP package-eket küldeni, ezért nem indultak el rendesen.
Ezt a netwait szolgáltatás bekapcsolása megoldotta:

sysrc netwait_enable="YES"
sysrc netwait_timeout="60"
sysrc netwait_ip="192.168.4.1"
reboot

Megjegyzés: Az /etc/rc.conf egy fontos konfig fájl, ide kerülnek be a fenti beállítások, és az, hogy egy service ki vagy be van kapcsolva. Egy másik fontos könyvtár a /usr/local/etc, ezekkel érdemes ismerkedni egy kicsit.

ZFS beállítása

Titkosítani szeretném a pool-okat, kulcs létrehozása:

dd if=/dev/random of=/root/nas.key bs=32 count=1
chmod 600 /root/nas.key

(nem tudom, hogy mi a best practice erre, ezt a nas.key-t érzésem szerint érdemes jól eltenni magadnak is)

Lemezek listázása:

geom disk list

ZFS pool létrehozása:

zpool create -O atime=off -O exec=off -O encryption=on -O keyformat=raw -O keylocation=file:///root/nas.key tank0 mirror /dev/ada1 /dev/ada2 log /dev/nda0
zpool create -O atime=off -O encryption=on -O keyformat=raw -O keylocation=file:///root/nas.key tank1 /dev/ada3

Property-k:

  • atime=off: Ne íródjon a hozzáférés ideje minden fájl hozzáférésnél, valószínűleg ez lassítaná a fájlok elérését.
  • exec=off: ami ezen a pool-on van, nem kell, hogy végrehajtható legyen.
  • encryption=on, keyformat=raw, keylocation=file:///root/nas.key tank0: Titkosítás bekapcsolása, és a kulcs megadása
  • az ada1, és az ada2 kerüljön egy mirror-ba, és az slog pedig a /dev/nda0-ra.
  • Slog-ot egyáltalán nem kellett volna így külön megadni, nem kötelező, csak ki akartam próbálni. A sync írásokat meg lehet vele gyorsítani. Én a pool-okon a sync flag-et standard-on hagyom, ami azt jelenti, hogy a sync utasítások maradnak szinkronok, és kerülnek az slog-ba. Lehetne még az értéke always (minden műveletnél szinkronizálás van), meg disabled (async működés van). Így a standard egy jó választásnak tűnik.

Pool létrehozásnál hiba elhárítás (mert korábban már volt használva a hdd másra, és a zfs mindenért szól):

  • Ha a "zfs create" arra hivatkozik, hogy nem tudja létrehozni a pool-t, akkor nézd meg jól még egyszer a disk neveket.
  • Ha közben a kernel üzenetekben hiba jön, hogy a GPT partíció invalid a lemezen, akkor "fdisk destroy -F adaX" -el tudod törölni, és kell egy reboot a végén.
  • Ha a "zpool create" azt a hibát üzeni, hogy a disk potenciálisan már egy pool része (mert korábban zfs pool volt rajta, akkor a -f paraméter jelenti a force-ot: "zpool create -f ..."

Sync állítása utólag (de a standard a default elvileg):

zfs set sync=standard tank0
zfs set sync=standard tank1

Dataset létrehozása:

zfs create -o casesensitivity=insensitive -o compression=lz4 -o aclmode=restricted -o aclinherit=passthrough tank0/documents
zfs create -o casesensitivity=insensitive -o compression=off -o aclmode=restricted -o aclinherit=passthrough tank0/photos

A tank1-ben most nem hozok létre dataset-et, azt majd később, amikor kell. Mivel SAMBA-val szeretném ezeket használni, ezért case insensitive-re állítom a poolokat. A dokumentumokra bekapcsolom az LZ4 tömörítést, a fényképekre felesleges szerintem. A többi paraméterről (acl) majd még írok.

A gép újraindítása után a dataset-ek nem mountolodtak fel. Amikor megpróbáltam kézzel felmountolni, kiderült, hogy nincsenek a titkosításhoz használt kulcsok betöltve. A betöltés kézzel: "zfs load-key -a", de a zfskeys szolgáltatást be kell kapcsolni:

sysrc zfskeys_enable=YES
reboot

Fontos zfs parancsok még (csak pár darabot kiemelek, biztos van több is, de érdemes felfedezni, utánaolvasni):

zpool list - pool-ok listázása
zfs list - pool-ok datasetek és mountpointok listázása
zfs get property_name tank0/documents - property lekérdezése. (a property_name-et ki kell cserélni, pl sync, compression, stb...)
zfs set property_name tank0/documents - property lekérdezése

Jogosultságok

Az aclmode, és aclinherit azért kell, mert ezekben a dataset-ekben acl alapú jogosultság kezelést szeretnék. Itt érdemes a többi paramétert a manualból elolvasni, nem tudom sajnos pár mondatban leírni, hogy melyik mire jó, de az aclmode=restricted: A chmod művelet hibát ad majd, ha olyan fájlra vagy könyvtárra próbálják meg alkalmazni, amelyhez ACL tartozik amely így nem írható le egy móddal. (tehát például az egyik usernek rx, a másiknak rw van adva az acl-hez, akkor a chmod 755 nem fog működni, ahogy én értem). Az aclinherit pedig, hogy hogyan öröklődjenek a jogosultságok: A passthrough jelentése: Minden ACL módosítás nélkül öröklődik.

Most annyit szeretnék, hogy legyen egy family group, aki módosítani tud (később ezt majd finomítani kell).

Egy group-ot is létre kell hozni, és hozzáadni az első usert:

pw groupadd family
pw group mod family -m dlaszlo

A user milyen group-okban van:

id dlaszlo

A group-ban milyen userek vannak:

pw group show family

Jogosultság megadása a könyvtárakra:

setfacl -a 0 g:family:modify_set:fd:allow /tank0/documents 
setfacl -a 0 g:family:modify_set:fd:allow /tank0/photos 

getfacl /tank0/documents-el lekérdezhető, hogy mi van megadva. A -a 0 paraméter a pozíciót jelenti, hogy hova szúrtuk be a jogosultságot.

A modify_set-ről: https://docs.oracle.com/en/operating-systems/solaris/oracle-solaris/11… (a solaris doksija is tök jó, a ZFS is nagyon jól le van benne írva)

Példa parancs, read only jogosultság adás a family_ro group-nak, rekurzívan:

setfacl -R -a 0 group:family_ro:r-x---a-R-c--s:fd:allow photos

Törölni úgy kell, hogy a teljes jogosultság string-et bemásoljuk a parancsba, amit a getfacl-al kapunk (például az everyone-t):

setfacl -R -x everyone@:r-x---a-R-c--s:-------:allow photos

Samba telepítése

pkg search samba

csomag kiválasztása, és:

pkg install samba419

Samba szolgáltatás engedélyezése, és indítása:

sysrc samba_server_enable=YES
service samba_server start

Megjegyzés: Ha a ZFS-nek próbálom meg a samba supportját, akkor FreeBSD alatt ezt kapom:

# zfs set sharesmb=on tank0/documents
No SMB support in FreeBSD yet.
cannot share 'tank0/documents: operation not supported': SMB share creation failed

Samba beállítások:

/usr/local/etc/smb4.conf:

[global]
   workgroup = WORKGROUP
   server string = NAS
   disable netbios = Yes
   domain master = Yes
   local master = Yes
   security = user
   map to guest = Never
   usershare allow guests = no
   passdb backend = tdbsam
   socket options = TCP_NODELAY IPTOS_LOWDELAY
   deadtime = 15
   getwd cache = yes
   keepalive = 60
   aio read size = 16384
   aio write size = 16384
   aio write behind = true
   use sendfile = YES
   log level = 1

[documents]
   path = /tank0/documents
   valid users = @family
   public = no
   writable = yes
   browsable = yes
   printable = no
   read only = no
   guest ok = no
   vfs objects = zfsacl
   nfs4:mode = special
   nfs4:acedup = merge
   nfs4:chown = no
   store dos attributes = yes
   map hidden = no
   map system = no
   map archive = no
   map readonly = no


[photos]
  stb...

ebben benne van az is, hogy a zfs acl-lel szeretnénk használni. A doskiját érdemes megnézni, én is a példa beállításokat használtam, és elolvastam, hogy kb melyik beállítás mit jelent: https://www.samba.org/samba/docs/current/man-html/smb.conf.5.html

User hozzáadása a samba-hoz:

pdbedit -a -u dlaszlo

WSDD telepítése a netbios helyett, lásd: https://hup.hu/node/185227

ZFS cache használat ellenőrzése:

pkg install zfs-stats

Ezzel látszik, hogy használja-e az slog-ot íráskor:

zpool iostat -v 1

Ezzel pedig hogy az olvasás (ARC) cache-t:

zfs-stats -A

(meg még sok mást).

Todo

  • automatikus snapshot-ok
  • automatikus zfs scrub
  • automatikus smart
  • automatikus mentés rsync megosztásra
  • értesítések (email-ben, vagy máshogy, pl a smart-ról, vagy egyéb dolgokról)
  • adguard, unifi contoller, esetleg plex indítása jail-ben.

 

Bocs, ha valahol nagyon pongyolán fogalmaztam, inkább egy rövid kis jegyzetnek szántam, biztos bele kell majd néznem később. Amiért itt megosztottam ezt: nagyon pozitívak a tapasztalataim a FreeBSD-vel, és eddig azért nem kezdtem bele, mert nem tudtam, hogy mikbe futok majd bele, mit veszek ezzel a vállamra. Hát semmi problémába nem futottam eddig, és esetleg ha valaki akar még vele ismerkedni, akkor itt látható, hogy én miket próbáltam ki eddig.

Hozzászólások

atime=off: Ne íródjon a hozzáférés ideje minden fájl hozzáférésnél, valószínűleg ez lassítaná a fájlok elérését

Linuxon is közkedvelt a noatime illetve a relatime mount opció; én nem szeretem. Az fstab-omban mindenhol megadom a strictatime opciót. Az ebből fakadó írások mennyisége számomra lényegtelen, viszont nagyon gyakran futtatom az

ls -ltru

# alias ls='ls --color=auto --time-style="+%Y-%m-%d %H:%M:%S %z"'

parancsot, ahhoz pedig kell a strictatime.

Nálam szintén freebsd a nas, csak 13.2 egy wifi-driver miatt (14-en nem működik).
De ha már jail miatt is freebsd-re esett a választás, akkor a különböző szolgáltatásokat, (pl. samba) rakhatnád jail-be.
Netbios helyett én wsdd-t használok (py39-wsdd).

Jó ötlet, lehet, hogy majd átteszem. Most a jailt a unifi kontrollerrel, és az adguarddal próbáltam ki. A wsdd-t nem is ismertem, köszönöm, megnézem!

(Wifi kérdések: Wifi driver, vagy egyéb wifi kérdésekbe én is időről időre belefutottam. Lefedettség probléma a falak miatt, csatorna kiosztás kérdések, a szomszédok ordibáló wifi-je, driver probléma, stb...

A végén ebből elegem lett, vettem párszáz méter UTP kábelt, kábelvéget, és krimpelőt, és a padláson át mindenhova odavittem a kábelt (annyira előrelátó voltam beköltözés előtt, hogy minden szobában van egy kábelcsatorna, ami a padlásra megy, csak sajnos elég szűkös :)). Van ahol egyszerűen csak átfúrtam a szomszéd szobába, és a parketta szegőléc mögött vittem el a kábelt.

Most már csak a telefonok, egy tablet, két laptop, és a gyerekek szobájából pár "okos" kütyü lóg wifi-n. A jó minőségű wifi miatt pedig az unifinél kötöttem ki (ennek nem okoz problémát ha 10000 másik wifi hotspot van a környéken, rosszul beállítva, meg egyéb zavaró dolgok)

Ha most lehetne falat vésni, porolni, akkor rendes kábelcsatornákat alakítanék ki a falakban, megtervezném az egészet. De sajnos nem így tettem, amikor ide költöztünk. :))

Szerkesztve: 2024. 05. 19., v – 15:20

Wsdd azért kell, mert ugye a SMBv1 alapból tiltva van az újabb win verziókon és az eddig megszokott felderítés nem fog menni a win intézőjében.
Kell majd neki egy tűzfalnyitás (ha használsz) a multicasthoz, plusz egy tcp/5357 és udp/3702.
Samba-hoz van egy pár dolog amit érdemes a sebesség miatt beállítani.
(socket options, getwd cache, aio read size, stb),
loader.conf-ba egy < aio_load="YES" > is kell, plusz < nullfs_load="YES" > ha kívülről szeretnél könyvtárakat becsatolni.
Javaslom a jail-hez a VNET alapút, mert a natolt jail és a samba nem igazán szeretik egymást.
Wifivel semmi bajom nem volt, tökéletesen működött, csak a 14-es kiadásnál egy bug miatt a hostap démon nem működött az én wifi driveremmel együtt.
Küldtem reportot, nemtudom, hogy javították -e, mert azóta is maradt nálam a 13.2.

Az aio úgy látom, hogy a kernelbe van fordítva. A Wsdd tökéletesen működik.

Köszi! Te thin vagy thick jale-t használsz? thick-et kezdtem el használni, de nem tudom eldönteni, melyik lesz problémás később. Az iocage-et használom, mint jail managert. Kipróbálom a nullfs-es mountolást, és utána átrakom a samba-t is a jail-be. Jó ötlet, hogy minden szolgáltatás külön legyen.

Thick jail-t használok, ezenbelül VNET jailt.
Ha olyan szolgáltatásokat akarsz futtatni amik nem bírják a NAT-ot pl. (dlna) akkor VNET jailt kell használni.
Nekem majdnem minden szolgáltatás külön jailben van. (NFS, samba, mediaserver, rsync, ftp.)
Ezenkívül nyomtató és scanner hálózati megosztást is használok, de azt a samba jailbe telepítem.
A thin jail se rossz, könnyebb frissíteni a jaileket ha sok van, de nekem automatikusan egy script megcsinálja és öt jailt nem nehéz upgradelni.
Lehetőség van arra is, hogy használod a classic jaileket és a VNET alapú jaileket vegyesen, de egyszerűbb, ha mindegyiket egyformán konfigurálod.
Én alapból készítek egy base-jailt, beállítom, csinálok egy zfs-snapshotot róla, azután ezeket klónozom és beállítom őket ( jailname, IP-cím, rc.conf, stb. ) külön-külön.