TrueNAS GELI-vel titkosított tároló migrálása natív ZFS titkosított tárlolóra

Korábban említést tettem róla, hogy a FreeNAS rendszeremet 7 éve építettem. A költséghatékonyság jegyében három WD Green meghajtót vásároltam, melyek nem kifejezetten 0-24 üzemmódra lettek tervezve, legalábbis a vezérlő szoftverük nem erre, hanem a takarékos üzemre van optimalizálva. Egy kis bütyköléssel (WDIDLE3) lehet ezen segíteni. Egy meghajtó hosszabb vergődést követően nemrég produkált egy hibás szektort. A dolog nem ért váratlanul. A S.M.A.R.T. értékeket már több, mint egy éve folyamatosan figyelemmel kisértem, amióta a nullától különböző Raw_Read_Error_Rate és az első Current Pendig Sector megjelent. Nem hittem volna, hogy még ennyi ideig gyakorlatilag érzékelhető hiba nélkül működni fog a meghajtó.

A hibát a TrueNAS az időszakos karbantartás során (scrub) észlelte. A ZFS fájlrendszer ellenőrzése során az egyik meghajtó olvasási hibát jelentett, amely a kötetet azonnal “degraded” státuszba tette. Ez azt jelenti, hogy a szolgáltatások továbbra is elérhetőek maradnak, de a redundancia részlegesen vagy teljesen megszűnik, vagyis az adatok további hiba bekövetkezése esetében nem állíthatóak vissza. A meghajtót tehát sürgősen cserélni kell.

Ez a meghajtó sajnos már nem kapható, a Western Digitalról pedig az utóbbi időben elterjedt, hogy a költségoptimalizálás miatt a kisebb kapacitású meghajtóknál átállt SMR (Shingled Magnetic Recording) technológiára, amely bizonyos felhasználási területen hátrányosnak bizonyult. Még a willhaben-en is körülnéztem használt meghajtók (régebbi WD Red, WD Green) után, de a több évet használt darabok használt árát egyszerűen soknak találtam (70-80€, 7 éve 111€-t fizettem a 4TB WD Green meghajtóért!), így inkább az új meghajtó mellett döntöttem. Pontosabban meghajtók mellett, ugyanis arra jutottam, hogy a RAIDZ helyett, az egyszerűbb tükrözést fogom használni.

A RAIDZ nagyon jól teljesített, de sajnos körülményes a bővítése. Csak egyféle módon lehet meglévő kötetet bővíteni: Minden meghajtót egyenként nagyobb kapacitásúra kell cserélni, és a kötetet újraépíteni. Három 8 TB-os meghajtó pedig már nettó 16 TB kapacitást jelent. Ehhez ajánlott 16 GB memória, amely azt jelentette volna, hogy a szolgáltatások memóriaigénye miatt az egész szervert bővíteni kell. A köztes megoldást két 12TB os meghajtó jelentette, amely éppen “akciós” volt az Amazon-on. Ezek a meghajtók héliummal vannak töltve, amely kisebb belső súrlódást és halkabb, takarékosabb üzemet jelent. Mivel folyamatosan mennek, ez nem elhanyagolható szempont.

évredundanciameghajtóknettó kapacitásmeghajtó ára1 TB ára
2014RAIDZ3 x 4TB WD40EZRX8 TB111€41,63€
2021tükör2 x 12TB WD120EDAZ12 TB182,5€30,42€

Az új meghajtók megérkeztek, de mielőtt beépítésre kerülnek, át kell esniük egy alapos tesztelésen. Ehhez a WD saját diagnosztikai szoftverét használtam. Az új szoftver Dashboard névre hallgat, de sajnos nem tetszett. Nem tudtam egyszerre a két meghajtót tesztelni, ezért a régi szoftverrel, a Data Lifeguard Diagnostic for Windows-sal dolgoztam.

A futási idők ezeknél a meghajtóknál extrém hosszúak. A meghajtó teljes törlése 21 órát, a bővített tesztelés (extended test) további 21 órát jelentett. Érdekes, hogy bár azonos meghajtókról beszélünk, az egyiknél 1-1 órával tovább tartottak a műveletek. Ez azt jelenti, hogy a meghajtó 5%-kal lassabb. A meghajtók hibátlanok voltak.

Stratégia

Az egyértelmű volt számomra, hogy az adatokat át kell migrálnom, de hogy hogyan, annak utána kellett olvasnom. Az alapötlet az, hogy a snapshotokkal kell az adatokat a két kötet között másolni. Így minden, még a snapshotok maguk is könnyedén átvihetők az új kötetre. A feladat végeztével át kell nevezni a régi kötetet, majd az újat a régi nevére, és elvileg működik minden, ahogy korábban.

Van azonban egy kis apróság, ami bonyolítja a helyzetet: A TrueNAS az új, ZFS alapú titkosítást támogatja, a FreeNAS-ban használt GELI titkosítás már csak a visszafelé kompatibilitás miatt elérhető. Új köteteket ezzel a titkosítással már nem lehet létrehozni. A TrueNAS hivatalos dokumentációjában van egy kis információ erre vonatkozóan.

A migráció

Először offline-ba kapcsoltam a meghibásodott meghajtót, majd kiszereltem:

A helyére bekerült egy új meghajtó. A második meghajtót később adom a tükörhöz. Az újraindítás után a GELI-vel titkosított kötetet kinyitottam, de a szolgáltatásokat (NFS, SMB, Jails) nem indítottam el. Az új kötetet az új ZFS titkosítással hoztam létre:

A titkosítási kulcsot az Encryption Options alatt lecseréltem egy jelszóra. Reményeim szerint a dataset-ek ezt a titkosítást fogják örökölni.

Innentől a terminálban folytattam a munkát. Elsőként kellett egy rekurzív snapshot az egész kötetről:

root@truenas:~ # zfs snapshot -r vol0@clone_snapshot

A snapshotot átküldjük az új kötetre. Ehhez a zfs-send rekurzív (-R) kapcsolóval, a zfs-receive pedig felülírás (-F) kapcsolóval, illetve a cél köteten a forrás tömörítési tulajdonságának elhagyásával kerül futtatásra. Ne felejtsük el, hogy a cél dataset ezt a tulajdonságágát a cél kötettől fogja örökölni:

root@truenas:~ # zfs send -Rv vol0@clone_snapshot | zfs receive -x encryption -Fdvu vol0_new
total estimated size is 7.00T
cannot receive new filesystem stream: zfs receive -F cannot be used to destroy an encrypted filesystem or overwrite an unencrypted one with an encrypted one
warning: cannot send 'vol0@clone_snapshot': signal received

…aha, nem. Ez így sajnos nem működik. Néhány sikertelen próbálkozás után feladtam az egész kötet másolását, és dataset-enként próbáltam (a legkisebbel kezdtem):

root@truenas:~ # zfs send -Rv vol0/iocage@clone_snapshot | zfs receive -x encryption -Fdvu vol0_new

A snapshotok másolása elindult.

received 122G stream in 2062 seconds (60.8M/sec)

Folytattam a többivel is. A legnagyobb dataset másolását éjjelre hagytam. Másnapra minden dataset másolása lekészült.

Következet a csere. A “régi” kötetet le kell csatolni (export). Ezt a GUI-n keresztül csináltam. A TrueNAS figyelmeztetett, hogy a rendszer kötet át fog költözni egy másik elérhető pool-ra.

Azt hittem, hogy ez a művelet csupán néhány másodperc lesz, ehhez képest 40%-nál (Reconfiguring system dataset) megtorpant a folyamat. Eközben ps-sel figyeltem a folyamatot, és láttam, hogy az új pool helyett a boot eszközre költözik vissza a rendszer (rsync -az /var/db/system/ /tmp/system.new). Hmm. Végül aztán sikerrel zárult a folyamat.

Az új kötet lecsatolása eseménytelenül zajlott.

Következzen hát az új kötet régi néven (vol0) történő felcsatolása:

Ezen a ponton elvetettem a felcsatolást, ugyanis én vol0 néven szerettem volna felcsatolni a kötetet. Így megpróbáltam az alábbi parancsot:

root@truenas:~ # zpool import vol0_new vol0

A felcsatolt kötet sajnos nem látszott a GUI-ban, úgyhogy lecsatoltam, és a GUI-n keresztül csatoltam fel:

root@truenas:~ # zpool export vol0

A kötet átnevezése sikeres volt.

A kötetet kinyitottam, a jail menüpontra kattintva kiválasztottam a vol0-poolt. A jail-ek megjelentek.

A végére a rendszerkötet áthelyezése maradt:

Erre nem számítottam. A GELI titkosítás mellett ez megoldható volt??? Itt miért nem? Ráadásul a kötet titkosítását már nem tudom utólag módosítani. Ami még menne, hogy jelszó helyett kulcsra állok át, de a dataset-eket akkor sem tudom jelszóval védeni. Na itt még van mit javítani…

Tükör létrehozása

Az utolsó feladat a második meghajtó hozzáadása a pool-hoz. Ezt a pool status nézetben az extend menüpont kiválasztásával tehetjük meg.

A hozzáadás után rögtön megkezdődik a meghajtó tükrözése (resilver). Remélem, hogy a folyamat gyorsabb lesz, mit a kijelzett 2527 nap. 🙂

Ha nem tapasztalok rendellenességet, akkor a maradék két hibamentes 4 TB-os meghajtó törlés után offline biztonsági másolatként folytathatja pályafutását.

ZoneMinder újratelepítése TrueNAS 12 jail-ben

Az előző posztban az UniFi Controller telepítéséről, illetve frissítéséről volt szó. Lássuk hát a ZoneMinder frissítését.

Az alábbi dokumentáció elkészítéséhez segítségemre volt a közösségi plugin, illetve annak szkriptjei. Itt találjátok: https://github.com/freenas/iocage-plugin-zoneminder

A wiki szerint a mentés és visszaállítás egyrészt a fájlrendszer visszaállítását (események, konfiguráció), másrészt a MySQL adatbázis visszaállítását jelenti.

Ezen felül a webszerver (nginx) konfigurációját is érdemes elmenteni.

Kezdjük az adatbázissal. A munkát a jail-ben kezdem, a szolgáltatást leállítom:

root@truenas:/ # iocage console ZoneMinder
root@ZoneMinder:~ # service zoneminder stop

Mivel nem ismerem az adatbázist, ezért mindent exportálok:

root@ZoneMinder:~ # mysqldump --user=root --password --set-gtid-purged=OFF --add-drop-database --triggers --routines --events --databases zm > /tmp/dump.sql

A mentés a jail-ben van, ezért ki kell másolnunk valahova, ahol az új jail-ből hozzáférünk:

root@ZoneMinder:~ # exit
logout
root@truenas:/ # cd /mnt/vol0/iocage/jails/ZoneMinder/root/tmp/
root@truenas:/mnt/vol0/iocage/jails/ZoneMinder/root/tmp # cp dump.sql /mnt/vol0/dataset2/Backup/ZoneMinder/

Folytassuk a fájlrendszerrel, de hol található a konfiguráció?

root@truenas:/mnt/vol0/iocage/jails/ZoneMinder/root # find . -name zm.conf
./usr/local/etc/zm.conf

Várjunk csak, nem ez kell nekünk, hanem a zoneminder mappa alatti fájlok:

root@truenas:/mnt/vol0/iocage/jails/ZoneMinder/root # cd usr/local/etc
root@truenas:/mnt/vol0/iocage/jails/ZoneMinder/root/usr/local/etc # cat zm.conf
==========================================================================
#
ZoneMinder Base Configuration
#
==========================================================================
#
*** DO NOT EDIT THIS FILE ***
#
To make custom changes to the variables below, create a new configuration
file, with an extention of .conf, under the /usr/local/etc/zoneminder
folder, containing your desired modifications.
#

Akkor mentsük ki fájlokat a jail-ből az egyik dataset-re:

root@truenas:/mnt/vol0/iocage/jails/ZoneMinder/root # cd zoneminder
root@truenas:/mnt/vol0/iocage/jails/ZoneMinder/root/usr/local/etc/zoneminder # cp *.conf /mnt/vol0/dataset2/Backup/ZoneMinder/

Következnek az események. Az események könyvtára a 01-system-paths.conf fájlban ZM_DIR_EVENTS változóban található (/var/db/zoneminder/events). Én ezekkel most nem foglalkozom, de ugyanúgy menthetőek, mint a konfiguráció.

root@truenas:/mnt/vol0/iocage/jails/ZoneMinder/root/usr/local/etc/zoneminder # grep ZM_DIR_EVENTS < 01-system-paths.conf
ZM_DIR_EVENTS=/var/db/zoneminder/events

Végül a webszerver konfigurációjának mentését végezzük el:

root@truenas:/mnt/vol0/iocage/jails/ZoneMinder/root/usr/local/etc/nginx # cp nginx.conf /mnt/vol0/dataset2/Backup/ZoneMinder/
root@truenas:/mnt/vol0/iocage/jails/ZoneMinder/root/usr/local/etc/nginx # cp conf.d/zoneminder.conf /mnt/vol0/dataset2/Backup/ZoneMinder/

A TrueNAS felhasználói felületén keresztül a közösségi plugin-ek között elérhető a Zoneminder, viszont a plugin a 12.1-es verzióra épül, ezért nem így fogom telepíteni.

Helyette létrehozok egy új jail-t a felhasználói felületen, majd frissítem a csomagokat és telepítem a zoneminder-t.

root@truenas:~ # iocage console ZoneMinder
root@ZoneMinder:~ # pkg update && pkg upgrade
root@ZoneMinder:~ # pkg install zoneminder
root@ZoneMinder:~ # exit

A poszt írásakor az 1.34.9-es verzió volt elérhető. Telepítés után kapunk egy több oldalas leírást, hogy mit kell még telepítenünk, beállítanunk. Következzenek sorban a lépések:

1. ZoneMinder konfigurációs fájlok és adatbázis mentés visszaállítása:

root@truenas:/mnt/vol0/iocage/jails/ZoneMinder/root/usr/local/etc/zoneminder # cp /mnt/vol0/dataset2/Backup/ZoneMinder/*.conf .
root@truenas:/mnt/vol0/iocage/jails/ZoneMinder/root/tmp # cp /mnt/vol0/dataset2/Backup/ZoneMinder/dump.sql .

2. MySQL telepítés, adatbázis import

A kezdeti root jelszó a szolgáltatás indítása untán a /root/.mysql_secret fájlban található és illik rögtön megváltoztatni. Ezen felül létrehozunk egy felhasználót a ZoneMinder-nek zmuser néven. Ez a felhasználó szerepel az előző lépésben visszaállított konfigurációs fájlban:

root@truenas:~ # iocage console ZoneMinder
root@ZoneMinder:~ # pkg install mysql57-server

Initial password for first time use of MySQL is saved in $HOME/.mysql_secret
ie. when you want to use "mysql -u root -p" first you should see password
in /root/.mysql_secret

root@ZoneMinder:~ # sysrc mysql_enable="YES"
root@ZoneMinder:/ # service mysql-server start
root@ZoneMinder:/ # mysql --user=root --password
Enter password:

root@localhost [(none)]> ALTER USER 'root'@'localhost' IDENTIFIED BY '*****';
Query OK, 0 rows affected (0.02 sec)

root@localhost [(none)]> GRANT ALL PRIVILEGES ON zm.* TO 'dbadmin'@'localhost' IDENTIFIED BY '****';
Query OK, 0 rows affected, 1 warning (0.03 sec)

root@localhost [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.02 sec)

root@localhost [(none)]> exit
Bye
root@ZoneMinder:/ # mysql --user=root --password < /tmp/dump.sql
Enter password:

3. nginx webszerver telepítése:

root@ZoneMinder:~ # pkg install nginx
root@ZoneMinder:~ # sysrc nginx_enable="YES"
root@ZoneMinder:~ # exit

nginx konfiguráció visszatöltése:

root@truenas:/mnt/vol0/iocage/jails/ZoneMinder/root/usr/local/etc/nginx # cp /mnt/vol0/dataset2/Backup/ZoneMinder/nginx.conf .
root@truenas:/mnt/vol0/iocage/jails/ZoneMinder/root/usr/local/etc/nginx # mkdir conf.d
root@truenas:/mnt/vol0/iocage/jails/ZoneMinder/root/usr/local/etc/nginx # cp /mnt/vol0/dataset2/Backup/ZoneMinder/zoneminder.conf conf.d/

ideiglenes SSL tanúsítvány generálása, ha van, akkor a tanúsítvány visszaállítása

root@truenas:~ # iocage console ZoneMinder
root@ZoneMinder:~ # # /usr/bin/openssl req -new -newkey rsa:2048 -days 366 -nodes -x509 -subj "/O=Temporary Certificate Please Replace/CN=*" -keyout /usr/local/etc/ssl/key.pem -out /usr/local/etc/ssl/cert.pem

szolgáltatás indítása

root@ZoneMinder:~ # service nginx start

4. cgi-wrapper telepítése, beállítása

root@ZoneMinder:~ # pkg install fcgiwrap
root@ZoneMinder:~ # sysrc fcgiwrap_enable="YES"
root@ZoneMinder:~ # sysrc fcgiwrap_user="www"
root@ZoneMinder:~ # sysrc fcgiwrap_socket_owner="www"
root@ZoneMinder:~ # sysrc fcgiwrap_flags="-c 4"

5. php beállítása

root@ZoneMinder:~ # touch /usr/local/etc/php-fpm.d/zoneminder.conf
root@ZoneMinder:~ # vi /usr/local/etc/php-fpm.d/zoneminder.conf

Az alábbi sorok bemásolása:
listen = /var/run/php-fpm.sock
listen.owner = www
listen.group = www
env[PATH] = /usr/local/bin:/usr/bin:/bin

root@ZoneMinder:~ # echo date.timezone = '"UTC"' > /usr/local/etc/php/overrides.ini
root@ZoneMinder:~ # sysrc php_fpm_enable="YES"
root@ZoneMinder:~ # service php-fpm start

6. Könyvtárak létrehozása

Az alábbi lépéseket utólag dokumentáltam, mivel ezekre hibakeresés során derült fény:

root@ZoneMinder:~ # mkdir /var/log/zm
root@ZoneMinder:~ # chown www:www /var/log/zm
root@ZoneMinder:~ # su -m www -c 'mkdir /var/db/zoneminder/events'
root@ZoneMinder:~ # su -m www -c 'mkdir /var/db/zoneminder/images'

7. ZoneMinder indítása

root@ZoneMinder:~ # sysrc zoneminder_enable="YES"
root@ZoneMinder:~ # service zoneminder start
root@ZoneMinder:~ # exit

Készen vagyunk.

Ráadás: Ideiglenes fájlrendszer (tmpfs)
A leírás szerint a ZoneMinder a kamerák felvételeinek utolsó néhány képkockáját megtartja, riasztás esetére. Ajánlott ezeket a felvételeket a memóriában tárolni, hogy a tárolókat kíméljük.
Az alábbi linken találtam egy jó leírást a beállításokról.

A felhasználói felületen a jail beállításaiban kapcsoljuk be az “allow_raw_sockets”-t és az “allow_mount”-ot és alatta válasszuk ki az “allow_mount_tmpfs”-t.
Adjuk hozzá az alább sort a jail fájlrendszer táblájához (fstab):

root@truenas:/mnt/vol0/iocage/jails/ZoneMinder # echo tmpfs /mnt/vol0/iocage/jails/ZoneMinder/root/tmp tmpfs rw,nosuid,noexec,mode=01777 0 0 >fstab

A tmpfs csak akkor csatolható a jail-ben, ha az enforce_statfs 2-nél kisebb értékre van beállítva, ezért állítsuk 1-re:

root@truenas:/mnt/vol0/iocage/jails/ZoneMinder # iocage set enforce_statfs=1 ZoneMinder
enforce_statfs: 2 -> 1

A jail-ben ellenőrizzük a fájlrendszert:

root@ZoneMinder:/ # mount
vol0/iocage/jails/ZoneMinder/root on / (zfs, local, nfsv4acls)
tmpfs on /tmp (tmpfs, local, noexec, nosuid)
devfs on /dev (devfs, local, multilabel)
fdescfs on /dev/fd (fdescfs)

A ZoneMinder így már üzemképes.