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
- Základné vlastnosti ZFS
- Zisťujeme stav zpool + vdev
- Vytváramé nový pool
- Mount ZFS poolu
- Testovanie
- Záver
- Odkazy na internete
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

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.

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
- The Z File System (ZFS) on FreeBSD
- Oracle Solaris ZFS Administration Guide
- ZFS for Linux
- Install ZFS on Debian GNU/Linux
- ZFS on ArchLinux
- OpenZFS
- Ars walkthrough: Using the ZFS next-gen filesystem on Linux
- ZFS Concepts and Tutorial
- ZFS Disk Label Changed
- Setup ZFS in Proxmox from Command Line with L2ARC and LOG on SSD
- Pridanie systémového disku do ZFS
- ZFS na Heronovo
- ZFS on linux
- ZFS quick command reference with examples
- How to Setup ZFS Filesystem on Linux with zpool
- ZFS pool on Proxmox VE (PVE) (ZFS Mirror & RAID10 examples)
- How To Create A NAS Using ZFS and Proxmox
- ZFS na wikipedii
- Čo vie ZFS na root.cz
- Stavba a skúsenosti zo ZFS storage
- ZFS na linuxdays 2014
- What is ZFS? Why are People Crazy About it?
- zfs mount to container for access
- mount zfs in LXC container
- Mount ZFS dataset in unprivileged containers