ZFS na Proxmox 6

V tomto blogu by som chcel vysvetliť ako som v Proxmox VE pridal do systému disk typu SSD. Proxmox 6 som inštaloval už dávnejšie a súborový systém som zvolil ZFS. Teraz pridám disk, ktorý bude určený na storage. Zatiaľ bude nastavený ako single disk na novom zpoole. Budem sa snažiť písať trochu obšírnejšie a občas od témy aj odbočím. Najprv si však popíšeme čo je to ZFS ako vznikol a ako je na tom dnes.

Obsah

História ZFS a nekompatibilta z GPL

ZFS je súborový systém a zároveň manažér logických zväzkov vyvinutý spoločnosťou Sun Microsystems. ZFS (Zettabyte File System) bol pôvodne vyvíjaný pre operačný systém Solaris. ZFS potom vyšlo na svetlo sveta v rámci projektu OpenSolaris, niekedy v roku 2005. ZFS bol ako Open Source portovaný na Linux, MAC OS X a FreeBSD v rokoch 2005-2010. Začiatkom roku 2010 bola dokončená akvizícia spoločnosti Sun Microsystems spoločnosťou Oracle Corporation a ZFS sa stal uzavretým systémom.

To sa nepáčilo ani vývojárom file systému ZFS a väčšina z ních opustila spoločnosť Oracle. V 2010 sa z OpenSolarisu forkoval Illumos aby pokračoval vo vývoji open source projektu vrátane ZFS. V roku 2013 vznikol OpenZFS, ktorý koordinuje vývoj open source ZFS. Keď budem niekde v blogu spomínať ZFS, vždy budem mať na mysli OpenZFS. Vzhľadom na to, že ZFS podlieha licencii Common Development and Distribution License (CDDL), ktorá nie je kompatibilná z GPL, nie je teda možné modul ZFS.ko oficiálne začleniť do linuxového kernelu.

Otázkou je, prečo teda vývojári OpenZFS neupravia licenciu aby bola kompatibilná z GPL a mohla byť zavedená do linuxového kernelu. Z licenčného hľadiska by to podľa OpenZFS.org bolo nesmierne náročne a musel by s tým súhlasiť každý prispievateľ do kódu OpenZFS, takže OpenZFS ostane pod licenciou CDDL. Ale vďaka ZOL je možné používať OpenZFS aj na linuxe. ZFS sa stal súčasťou Debianu v máji 2016.

Základné vlastnosti ZFS

Súborový systém ZFS má oproti iným súborovým systémom veľa výhod. Spomeniem aspoň niektoré základne atribúty ZFS.

  • 128 bitový súborový systém – 16 miliárd GB
  • efektívna kompresia dát
  • šifrovanie dát
  • Ochrana pred poškodením dát – integrita dát
  • Podpora RAID 0, 1, RAIDZ 1/2/3
  • Integrovaný manažér zväzkov
  • Snapshoty súborového systému

Zisťujeme stav zpool + vdev

Počnúc verziou Proxmox VE 3.4 je natívny port Linuxového jadra súborového systému ZFS predstavený ako voliteľný súborový systém a tiež ako ďalšia voľba pre koreňový súborový systém. Nie je potrebné manuálne kompilovať moduly ZFS – obsahuje všetky balíky. V tomto blogu sa budem zaoberať ZFS na Proxmox 6 (pripomeniem, že Proxmox 6 je postavený na Debian 10). Proxmox 6 som inštaloval už dávnejšie na 2x SSD 256GB. Použil som ZFS RAID 1 Mirror. Inštalačný program automaticky rozdelí disk a vytvorí pool pod názvom rpool. ZFS je jednoduché a pozná 2 základné príkazy zfs a zpool. Na zistenie stavu použime príkaz

zpool status
  pool: rpool
 state: ONLINE
  scan: scrub repaired 0B in 0 days 00:00:49 with 0 errors on Sun Dec 13 00:24:50 2020
config:

        NAME                                                   STATE     READ WRITE CKSUM
        rpool                                                  ONLINE       0     0     0
          mirror-0                                             ONLINE       0     0     0
            ata-Patriot_P200_256GB_AA000000000000000978-part3  ONLINE       0     0     0
            ata-Patriot_P200_256GB_AA000000000000000025-part3  ONLINE       0     0     0

Koreňový file systém je nainštalovaný na subvol rpool/ROOT/pve-1 viď riadok 4 a tak isto môžeme vidieť ďalší subvol rpool/data na ukladanie obrazov VM. Prvý kontajner je napr. uložený v /rpool/data/subvol-101-disk-0

Filesystem                    Size  Used Avail Use% Mounted on
udev                           16G     0   16G   0% /dev
tmpfs                         3.2G  313M  2.9G  10% /run
rpool/ROOT/pve-1              223G  7.9G  215G   4% /
tmpfs                          16G   34M   16G   1% /dev/shm
tmpfs                         5.0M     0  5.0M   0% /run/lock
tmpfs                          16G     0   16G   0% /sys/fs/cgroup
rpool                         215G  128K  215G   1% /rpool
rpool/data                    215G  128K  215G   1% /rpool/data
rpool/ROOT                    215G  128K  215G   1% /rpool/ROOT
rpool/data/subvol-101-disk-0   32G  2.4G   30G   8% /rpool/data/subvol-101-disk-0
/dev/fuse                      30M   16K   30M   1% /etc/pve
tmpfs                         3.2G     0  3.2G   0% /run/user/0

V ZFS je veľmi dôležité pochopiť čo je to vdev (Virtual Device). Existuje 7 druhov vdev

  • Disk – klasicky HDD, alebo SSD
  • Súbor – cesta k súborom obrazom
  • Zrkadlenie – štandardný RAID 1
  • RAIDZ 1/2/3
  • spare – Pevné disky označené ako „hot spare“ pre softvérový RAID ZFS
  • Cache – L2ARC
  • SLOG/ZIL

Keď si všimneme rpool, ktorý vytvoril proxmox počas inštalácie, tak vdev v tomto prípade nie sú fyzicke SSD, ale mirror-0.

Vytváramé nový pool

Ako už bolo spomenuté v Proxmox 6 mám 2x 256GB SSD zapojené ako RAID 1 mirroring. Do systému som pridal ďalší SSD, zapojený cez adaptér AXAGON ADSA-1S6, USB3.0 – SATA 6G s podporou UASP. Najprv zistíme aké úložné zariadenia detekuje náš systém (zobraziť si ich necháme podľa ID zariadení)

ls -l /dev/disk/by-id
total 0
lrwxrwxrwx 1 root root  9 Oct 25 04:29 ata-Patriot_P200_256GB_AA000000000000000025 -> ../../sdb
lrwxrwxrwx 1 root root 10 Oct 25 04:29 ata-Patriot_P200_256GB_AA000000000000000025-part1 -> ../../sdb1
lrwxrwxrwx 1 root root 10 Oct 25 04:29 ata-Patriot_P200_256GB_AA000000000000000025-part2 -> ../../sdb2
lrwxrwxrwx 1 root root 10 Oct 25 04:29 ata-Patriot_P200_256GB_AA000000000000000025-part3 -> ../../sdb3
lrwxrwxrwx 1 root root  9 Oct 25 04:29 ata-Patriot_P200_256GB_AA000000000000000978 -> ../../sda
lrwxrwxrwx 1 root root 10 Oct 25 04:29 ata-Patriot_P200_256GB_AA000000000000000978-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Oct 25 04:29 ata-Patriot_P200_256GB_AA000000000000000978-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 Oct 25 04:29 ata-Patriot_P200_256GB_AA000000000000000978-part3 -> ../../sda3
lrwxrwxrwx 1 root root 11 Oct 25 04:29 lvm-pv-uuid-1MKwdq-c1by-iEY6-jpYe-Ew8b-mhTO-8Se7XI -> ../../zd0p5
lrwxrwxrwx 1 root root  9 Dec 21 19:08 usb-WDC_WDS_100T2B0A-00SM50_98765432100C-0:0 -> ../../sdc

Nás zaujíma posledný riadok čo je náš inkriminovaný 1 TB SDD. Vzhľadom k tomu, že mám k dispozícii len 1x 1TB SSD a to ešte pripojený cez USB 3.0, tak musím vytvoriť nový pool. Nemôžem ho pripájať do jestvujucého poolu ako vdev, pretože poškodením dátových blokov na ktoromkoľvek disku môžem prísť o celý pool a to určite nechcem. Ak v budúcnosti dokúpim ďalší SSD, tak vytvorím s pôvodným SSD, RAID 1 Mirror, aby som mal aspoň akú takú redundanciu.

Krátka vsuvka prečo rozširujem dátové uložisko.
Jeden z mojich Linuxových kontajnerov (LXC) je využitý ako webový server LAMP. Všetky kontajnery a virtuálne stroje umiestňujem na rpool (vrátane backupov). V spomínanom LXC mám niekoľko virtualhostov, kde okrem iného hostujem WordPress, DokuWiki, PHPFusion a pod. Niekedy dávno, keď ešte neboli tak hojne rozšírené cloudy ako dnes, tak dáta som ukladal na zabezpečený SFTP server (to som ešte nevedel nič o virtualizácii a bežal som na klasickom Ubuntu servery 9.04). Následne som prešiel na Proxmox 5.x a ako dátové úložisko som začal používať NextCloud. Pre dátové úložisko sa určite nehodí 256 GB RAID 1 (na ktorom sú okrem LXC/KVM aj backupy), preto potrebujem priestor pre dáta zväčšiť a keďže som nechcel ísť do rotačných diskov, tak som siahol po lacnejšom 1 TB SSD. Vzhľadom k tomu, že nie som zberateľom žiadnych filmov a extrémne objemných súborov, tak 1 TB bude pre mňa až až.

Poďme už konečne vytvoriť novy pool. Cez webové rozhranie Proxmoxu prejdeme do shellu (terminálu) PVE. Ako som spomínal vyššie, zaujíma nás posledný riadok (náš nový SSD).

lrwxrwxrwx 1 root root  9 Dec 21 19:08 usb-WDC_WDS_100T2B0A-00SM50_98765432100C-0:0 -> ../../sdc

Veľmi sa odporúča aby sa pre úložné zariadenia použilo ID zariadenia a nie názvy ako /dev/sda, /dev/sdb atď … V takomto prípade by sa mohlo stať, že /dev/sda po reboote už nebude /dev/sda a systém by nevedel detekovať zpool. Teraz vytvoríme pool pod názvom datapool

zpool create datapool usb-WDC_WDS_100T2B0A-00SM50_98765432100C-0:0

Pomocou zpool status skontrolujeme stav poolov a vidíme nový pool datapool.

  pool: datapool
 state: ONLINE
  scan: none requested
config:

        NAME                                            STATE     READ WRITE CKSUM
        datapool                                        ONLINE       0     0     0
          usb-WDC_WDS_100T2B0A-00SM50_98765432100C-0:0  ONLINE       0     0     0

errors: No known data errors

  pool: rpool
 state: ONLINE
  scan: scrub repaired 0B in 0 days 00:00:49 with 0 errors on Sun Dec 13 00:24:50 2020
config:

        NAME                                                   STATE     READ WRITE CKSUM
        rpool                                                  ONLINE       0     0     0
          mirror-0                                             ONLINE       0     0     0
            ata-Patriot_P200_256GB_AA000000000000000978-part3  ONLINE       0     0     0
            ata-Patriot_P200_256GB_AA000000000000000025-part3  ONLINE       0     0     0

errors: No known data errors

Ak si pozrieme zfs list, alebo df -h, tak vidíme tabuľku, kde je aj náš nový datapool. Vidíme jeho veľkosť, voľné, použité miesto, ale aj bod pripojenia (mount) /datapool (čiže vôbec sa nemusíme starať o mounting, je to plne automatické). Zdá sa, že teraz nám stačí spraviť BindMount do linuxového kontajnera. Určite však nechcem pre data v Nextcloude využívať celý pool, preto si na novom poole vytvoríme súborový system (subvol a nazvime ho napr. nextcloud).

zfs create datapool/nextcloud

Aké jednoduché 🙂 teraz sa môžeme pozrieť na náš novo vytvorený FS (môžeme to chápať ako oddiel, alebo partíciu na klasickom disku).

NAME                           USED  AVAIL     REFER  MOUNTPOINT
datapool                       480K   899G       96K  /datapool
datapool/nextcloud              96K   899G       96K  /datapool/nextcloud
rpool                         13.8G   215G       96K  /rpool
rpool/ROOT                    7.88G   215G       96K  /rpool/ROOT
rpool/ROOT/pve-1              7.88G   215G     7.88G  /
rpool/data                    5.89G   215G       96K  /rpool/data
rpool/data/subvol-101-disk-0  2.32G  29.7G     2.32G  /rpool/data/subvol-101-disk-0
rpool/data/vm-100-disk-0       959M   215G      959M  -
rpool/data/vm-102-disk-0      2.63G   215G     2.63G  -

Tu však vidíme, že náš nový subvol má takú istú veľkosť ako celý pool. To preto, lebo subvol zdieľa celú veľkosť v rámci poolu. Mne však pre nextcloud stačí 200 GB priestor, takže subvolu nastavíme quotu 200 GB.

zfs set quota=200G datapool/nextcloud 
NAME                           USED  AVAIL     REFER  MOUNTPOINT
datapool                       504K   899G       96K  /datapool
datapool/nextcloud              96K   200G       96K  /datapool/nextcloud
rpool                         13.8G   215G       96K  /rpool
rpool/ROOT                    7.88G   215G       96K  /rpool/ROOT
rpool/ROOT/pve-1              7.88G   215G     7.88G  /
rpool/data                    5.89G   215G       96K  /rpool/data
rpool/data/subvol-101-disk-0  2.32G  29.7G     2.32G  /rpool/data/subvol-101-disk-0
rpool/data/vm-100-disk-0       959M   215G      959M  -
rpool/data/vm-102-disk-0      2.63G   215G     2.63G  -

A už je všetko v poriadku. Pre nextcloud sme nastavili 200 GB (viď riadok 3). Tento subvol môžeme zväčšovať a zmenšovať ako sa nám zachce. Zatiaľ som neskúšal čo sa stane keď ho budeme chcieť zmenšiť na hodnotu, ktorá bude nižšia ako objem uložených dát (predpokladám, že systém takúto operáciu nepovolí (alebo prídeme o dáta (to si ešte overím))).

Mount ZFS poolu

Teraz môžeme subvol /datapool/nextcloud pripojiť pomocou BindMount do kontajnera. BindMount môžeme spraviť tak, že upravíme konfiguračný súbor príslušného kontajnera, alebo z hostiteľa použijeme príkaz, ktorý zapíše do konfiguráku to čo mu zadáme. Najjednoduchší spôsob je ten druhý. Najprv sa pozrieme cez web ako vyzerá naš LXC, konkrétne resources

LXC/Resources

Na obrázku vidíme, že koreňový disk kontajnera má veľkosť 32GB. Ako som už spomínal, obsahom kontajnera je niekoľko virtualhostov a tie zdieľajú túto kapacitu virtuálneho disku. Ak budem v budúcnosti vytvárať ďalšie virtualy a kontajnery (plus backupy), tak 256 GB sa rýchlo minie. V lete 2020 som prechádzal na nový HW a zo starého železa som migroval niektoré KVM a LXC na nové železo. Čiže v starom LXC som mal mountnutý rotačný 4 TB HDD (FS bol použitý EXT4) do LXC na /mnt/sdb/nextcloud. Tak isto je to nakonfigurované aj pre nextcloud, takže to už nebudem meniť a mount spravím na to isté miesto.

pct set 101 -mp0 /datapool/nextcloud,mp=/mnt/sdb/nextcloud

Príkaz hovorí: zapíš do konfiguračného súboru kontajnera s identifikátorom 101 následujúci riadok, mp0 /datapool/nextcloud,mp=/mnt/sdb/nextcloud. Jednoduchým príkazom si môžeme overiť, že riadok sa naozaj do konfiguráku zapísal (viď riadok 6)

cat /etc/pve/lxc/101.conf
arch: amd64
cores: 1
hostname: web-debian
memory: 1024
mp0: /datapool/nextcloud,mp=/mnt/sdb/nextcloud
net0: name=eth0,bridge=vmbr1,gw=192.168.1.1,hwaddr=9E:43:6D:25:D9:CB,ip=192.168.1.101/24,type=veth
onboot: 1
ostype: debian
rootfs: local-zfs:subvol-101-disk-0,size=32G
swap: 1024

Tak isto si môžeme všimnúť vo vnútri LXC -> Resources sa vytvoril nový bod pripojenia.

Nový bod pripojenia

Teraz kontajner reštartujeme (môžme to spraviť cez web rozhranie, alebo klasicky cez shell príkazom (reboot). Po reboote by malo všetko fungovať.

Testovanie

Funkčnosť si môžme overiť jednoduchým spôsobom. Zatiaľ je vlastníkom prípojného bodu root, takže sa v kontajnery prihlásime ako root, prejdeme do bodu pripojenia na ktorý sme pripojil /datapool/nextcloud a skúsime na to miesto nejaký zápis. Ja som ako príklad stiahol ISO obraz netinstall debian 10.

su root
cd /mnt/sdb/nextcloud
wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-10.7.0-amd64-netinst.iso

Teraz v kontajnery skontrolujeme ako to vyzerá na našom virtuálnom disku pomocou príkazu df

df -h
Súborový systém               Veľk  Použ  Dost Pou% Pripojený na
rpool/data/subvol-101-disk-0   32G  2,4G   30G   8% /
datapool/nextcloud            200G  337M  200G   1% /mnt/sdb/nextcloud
none                          492K  4,0K  488K   1% /dev
tmpfs                          16G     0   16G   0% /dev/shm
tmpfs                          16G  8,2M   16G   1% /run
tmpfs                         5,0M     0  5,0M   0% /run/lock
tmpfs                          16G     0   16G   0% /sys/fs/cgroup

Z výstupu príkazu df je vidieť že pool datapool (subvol nextcloud) je pekne namountovaný kde sme chceli a aj veľkosť je 200 GB. Tým, že sme stiahli debian netinstall, tak vidíme, že 337 MB je už využitých. Zatiaľ je mount pod právami roota.

ls -la /mnt/sdb/
celkom 2
drwxr-xr-x 3 root root 3 sep 27 18:09 .
drwxr-xr-x 3 root root 3 jún  6  2018 ..
drwxr-xr-x 2 root root 3 jan  9 14:12 nextcloud

Keďže nextcloud funguje pod užívateľom www-data a pod rootom by nevedel vôbec nič na disk zapísať, tak rekurzívne zmeníme aj vlastníka. To spravíme ako root, alebo cez sudo

chown -R www-data:www-data /mnt/sdb/nextcloud
 ls -la /mnt/sdb/
celkom 2
drwxr-xr-x 3 root     root     3 sep 27 18:09 .
drwxr-xr-x 3 root     root     3 jún  6  2018 ..
drwxr-xr-x 2 www-data www-data 3 jan  9 14:12 nextcloud

Ak by som chcel v budúcnosti rozšíriť pool, tak pridaním ďalšieho fyzického disku do systému, môžem bez problémov zväčšiť pool. Ak by som chcel redundanciu mirroring, tak pripojím rovnako veľký disk ako je pôvodný a vytvorím RAID 1. Ak by som chcel RAIDZ 1, 2, 3 tak pridám ďalšie disky (obdoba RAIDZ 1,2,3 je RAID 5,6,7). To sa používa vo veľkých diskových poliach, kde musia byť dáta chránené voči zlyhaniu niektorého z fyzických diskov. Čím viac diskov obsahuje pole tým viac sú dáta chránené. Každá časť disku obsahuje paritné bloky na základe ktorých sa pomocou funkcie XOR dopočítavajú data na nový disk (ktorý bol po havárii vymenený).

Záver

Dnes sme si ukázali ako pomocou zpool vytvoríme nový pool vrátane ďalšieho subvolume a nastavíme mu kvótu. V linuxovom kontajnery LXC sme spravili z hostiteľa BindMount na daný subvolume. V tomto blogu som zhruba popísal základ ako funguje ZFS. Je toho ešte strašne veľa čo všetko je možné so ZFS prevádzať. Na úplný záver by som chcel povedať, že ZFS som dlho nepoznal a začal som to študovať len nedávno. O ZFS viem toho zatiaľ veľmi málo, chcelo by to viac študovať, robiť praktické testy a zisťovať ako sa systém správa. Na internete sa dá nájsť strašne veľa dokumentácie či už na Oracle, alebo FreeBSD, ale strašne málo kvalitných praktických návodov (aj keď určite sa niečo nájde). Dúfam, že v budúcnosti sa o ZFS na tomto blogu ešte zmienim.

Odkazy na internete

Leave a Reply

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *