Otthoni NAS telepítése FreeBSD-vel III: levelezés, smartmontools beállítása, snapshotok készítése, ZFS scrubbing

Az első két blogbejegyzést szeretném folytatni, amikben egy otthoni NAS-t kezdtem el telepíteni FreeBSD segítségével:

A ZFS, Samba, és a Jail-ek beállítása után most a levelezés, smart monitor, és a snapshot készítést néztem meg.

A célom a FreeBSD kipróbálása volt. A FreeBSD-ről az elmúlt napokban az a kép alakult ki bennem, hogy egy stabil, jól dokumentált, és modern operációs rendszerről van szó (támogatja az újabb hardware-eket, professzionális eszközöket kínál), de emellett egy kicsit retro érzés használni, ami miatt nagyon szerethető oprendszer. Ha még nem próbáltad ki, csak bátorítani tudlak.

Levelezés beállítása

A FreeBSD alapértelmezetten a Dragonfly Mail Agentet használja (DMA). Itt egyszerűen be lehet konfigurálni a gmail SMTP szerverét (vagy bármelyik SMTP szervert) smarthost-ként. Ehhez a következő konfigurációs fájlokba kell felvenni a beállításokat:

/etc/dma/dma.conf:

SMARTHOST smtp.gmail.com
PORT 587
AUTHPATH /etc/dma/auth.conf
SECURETRANSFER
STARTTLS
MASQUERADE xyz@gmail.com

/etc/dma/auth.conf:

xyz@gmail.com|smtp.gmail.com:aaaabbbbccccdddd

Ahol az aaaabbbbccccdddd az alkalmazás jelszó, amit a gmail fiókodban hoztál létre:

Alias felvétele a root usernek:

/etc/aliases:

root: xyz@gmail.com

Tesztelés:

echo teszt | mail -v -s teszt root

Kapcsolódó FreeBSD kézikönyv leírás: https://docs.freebsd.org/en/books/handbook/mail/

SmartmonTools beállítása

Telepítés, és a szolgáltatás bekapcsolása:

pkg install smartmontools
sysrc smartd_enable="YES"

Smart infók lekérdezése manuális módon:

smartctl -a /dev/ada0

Konfigurálás:

1. Az /usr/local/etc-be települt egy példa konfigfiguráció (smartd.conf.sample), részletes magyarázattal, amiből ki lehet indulni. Ezen kívül a smartd.conf man oldalát érdemes még olvasni: https://man.freebsd.org/cgi/man.cgi?smartd.conf%285%29

cd /usr/local/etc
cp smartd.conf.sample smartd.conf

2. A smard.conf-ban egy DEVICESCAN-t tartalmazó sor van csak, ami nincs kikommentezve. Ehhez a sorhoz a megjegyzés:

# The word DEVICESCAN will cause any remaining lines in this configuration file to be ignored

Tehát akkor a DEVICESCAN sort ki kell kommentezni, mert mi saját beállításokat adunk meg.

3. Ebből a példa beállításból ki is indulhatunk (a példa alapján naponta 2 órakor fut egy short teszt, és szombaton 3 órakor long teszt):

# First ATA/SATA or SCSI/SAS disk.  Monitor all attributes, enable
# automatic online data collection, automatic Attribute autosave, and
# start a short self-test every day between 2-3am, and a long self test
# Saturdays between 3-4am.
#/dev/sda -a -o on -S on -s (S/../.././02|L/../../6/03)

Ez alapján minden nap 1 órakor legyen short teszt, és minden hónapban 1-én és 15-én 2 órakor egy long (és küldjön emailt a root felhasználónak)

/dev/ada0 -a -o on -S on -s (S/../.././01|L/../(1|15)/./02) -m root
/dev/ada1 -a -o on -S on -s (S/../.././01|L/../(1|15)/./02) -m root
/dev/ada2 -a -o on -S on -s (S/../.././01|L/../(1|15)/./02) -m root
/dev/nvme0 -a -o on -S on -s (S/../.././01|L/../(1|15)/./02) -m root

Az email küldés kipróbálásához meg lehet adni minden beállításhoz a "-M test" paramétert is, ekkor a smartd szolgáltatás indítása után (service smartd start) a következő teszt email érkezik, minden HDD-hez:

/dev/ada0 -a -o on -S on -s (S/../.././01|L/../(1|15)/./02) -m root -M test
stb...

Az egyik teszt levél tartalma, ami érkezik a root-nak beállított gmail címre smartd indítása után:

Subject: SMART error (EmailTest) detected on host: nas

This message was generated by the smartd daemon running on:

   host name:  nas
   DNS domain: [Empty]

The following warning/error was logged by the smartd daemon:

TEST EMAIL from smartd for device: /dev/ada1

Device info:
WDC WD30EFRX-68N32N0, S/N:WD-WCC7K5LP3Y6Z, WWN:5-0014ee-264d0913d, FW:82.00A82, 3.00 TB

For details see host's SYSLOG.

A "-M test" paramétert törölni kell, és újraindítani a smartd-t.

ZFS snapshot-ok:

FreeBSD alatt több snapshot management tool közül válaszhatunk, én egy olyat választottam, amit úgy látok a github alapján, hogy aktív fejlesztés alatt van, nem most kezdték el, jó dokumentációja van, és nagyobb tudású, pl zfs replikálást is tudok vele csinálni: https://zrepl.github.io/

Egy előadás róla: https://papers.freebsd.org/2018/bsdcan/schwarz-zrepl_zfs_replication/

Telepítés:

pkg install zrepl

Telepítés után a pkg ki is írja az instrukciókat:

SETUP BEFORE FIRST USE:
- Create the log file /var/log/zrepl.log:
  # service newsyslog restart
- Teach syslogd to redirect facility local0 to the zrepl.log file:
  # service syslogd reload
- Modify the /usr/local/etc/zrepl/zrepl.yml configuration file
- For remote backups, create the SSH key pair and authorized_keys file
- Enable the zrepl daemon to start automatically at boot:
  # sysrc zrepl_enable="YES"
- Start the zrepl daemon:
  # service zrepl start

A zrepl konfigurálását egy kicsit nehezebb volt megérteni, mert sok mindent lehet a toollal csinálni. Most csak a snapshot készítés a feladat.

A konfigurációt a /usr/local/etc/zrepl/zrepl.yml fájlba kell beírni. A jobs alá több job-ot meg lehet adni, ezeknek a típusát érdemes a doksiban elolvasni. A snapshot készítéshez a "snap" típust kell megadni.

A következő konfiguráció 15 percenként csinál egy snapshot-ot, és a "pruning" rész alatt van megadva, hogy hogyan tartsa meg a snapshotokat:

  • 1 óráig mindent megőriz,
  • 1 órásból 24-et,
  • 1 naposból 35-öt
  • 30 naposból 12-t.

A példa a tank0/data és az összes alatta lévő dataset-ből csinál snapshot-ot.

Azokat a snapshot-okat nem törli, amik nem zrepl_ prefixxel kezdődnek.

# zrepl main configuration file.
# For documentation, refer to https://zrepl.github.io/
#
global:
  logging:
    - type: "stdout"
      level:  "error"
      format: "human"
    - type: "syslog"
      level:  "info"
      format: "logfmt"

# Add "jobs:" section(s) here for your specific use cases.
jobs:
  - name: snapshot1
    type: snap
    filesystems: {
      "tank0/data<": true,
    }
    snapshotting:
      type: periodic
      prefix: zrepl_
      timestamp_format: "20060102-150405"
      interval: 15m
    pruning:
      keep:
        - type: grid
          grid: 1x1h(keep=all) | 24x1h | 35x1d | 12x30d
          regex: "^zrepl_.*"
        - type: regex
          negate: true
          regex: "^zrepl_.*"

(A timestamp formátum megadása egy kicsit zavarba ejtő volt (mit keres ott egy konkrét timestamp), de go alatt ezek szerint így kell megadni: a 2006 az évet jelöli mindig, a 01 a hónapot, a 02 a napot, stb... Tehát nem yyyyMMdd... (például) a formátum string.)

A doksiban a kapcsolódó rész: https://zrepl.github.io/quickstart/backup_to_external_disk.html

ZFS scrubbing

A ZSF scrubbing célja a fájlrendszer ellenőrzése.

Az /etc/defaults/periodic.conf fájlban találtam:

# 800.scrub-zfs
daily_scrub_zfs_enable="NO"
daily_scrub_zfs_pools=""                        # empty string selects all pools
daily_scrub_zfs_default_threshold="35"          # days between scrubs
#daily_scrub_zfs_${poolname}_threshold="35"     # pool specific threshold

Ezek szerint default 35 naponként fut.

Ellenőrizni fogom, hogy tényleg futott-e.

További ötletek

  • Prometheus, grafana telepítése: fájlrendszer monitorozás, IO, CPU, smart, snapshot-ok, stb..
  • Tanúsítványok: Érdemes lehet egy saját CA tanúsítványt készíteni és azt telepíteni az eszközökre mint megbízható tanúsítványt. Ezzel a CA tanúsítvánnyal el lehet készíteni az egyes szolgáltatások HTTPS eléréséhez a tanúsítványt.
  • Tűzfal (nem kell mindent elérni)