Hlavní navigace

COW filesystémy ZFS

22. 10. 2014 12:35 (aktualizováno) | Jan Krcmar

Tento systém byl navržen Sun Microsystems. Poprvé byl představen v roce 2005 v distribuci OpenSolaris.

Je licencován CDDL, která není kompatibilní s GPL, pod kterou je vydáván Linux.
Proto jsou jeho hlavní doménou operační systémy rodiny BSD a Solaris.
ZFS byla původně zkratka pro Zettabyte File system, ale v součastnosti již neznamená nic.
Oproti většině file systémů používá proměnnou velikost bloku.
Nepoužívá inody, ale různé struktury pro konkrétní operace (block-pointer, space-map…).

V názvosloví ZFS označujeme skupinu fyzických zařízení pro ukládaní dat jako pool.
Do poolu můžeme zařízení přidávat a odebírat online.
V poolu vytváříme další file systemy. Ty mají mountpoint, který defaultně odpovídá cestě v poolu.
V ZFS můžeme také vytvořit volume, který je přístupný jako standardní zařízení.

ZFS vytvoříme tím, že vytvoříme pool.

[root@freebsd ~]# zpool create zpool /dev/ada0p3 [root@freebsd ~]# zpool status pool: zpool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM zpool ONLINE 0 0 0 ada0p3 ONLINE 0 0 0 errors: No known data errors [root@freebsd ~]# df Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/ada0p2 2031132 832404 1036240 45% / devfs 1 1 0 100% /dev zpool 8192947 31 8192916 0% /zpool

Vytvořený pool je defaultně připojen v rootu.

File system vytvoříme příkazem zfs.

[root@freebsd ~]# zfs create zpool/test

Pro složitější příklad ukážeme defaultní rozdělení disku použitím automatického rozdělení – Automatic Root-on-ZFS, při instalaci FreeBSD.
Velikost swapu jsme vybral při instalaci 1 GB. Po instalaci vypadají diskové oddíly takto.

[root@freebsd ~]# gpart show => 34 20971453 ada0 GPT (10G) 34 1024 1 freebsd-boot (512K) 1058 2097152 2 freebsd-swap (1.0G) 2098210 18873277 3 freebsd-zfs (9.0G) [root@freebsd ~]# zpool status pool: zroot state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM zroot ONLINE 0 0 0 gptid/f245d5b1-3350-11e4-88e0-a7ca1f524829 ONLINE 0 0 0 errors: No known data errors

Pool zroot se skládá z jednoho oddílu a jeho stav je v pořádku.

Další výpis zobrazuje informace o velikosti a volném místu v poolu.

[root@freebsd ~]# zpool list NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT zroot 8.94G 939M 8.02G 10% 1.00x ONLINE -

Podíváme se na jednotlivé file systemy.

[root@freebsd ~]# zfs list NAME USED AVAIL REFER MOUNTPOINT zroot 939M 7.88G 144K none zroot/ROOT 887M 7.88G 144K none zroot/ROOT/default 887M 7.88G 887M / zroot/tmp 176K 7.88G 176K /tmp zroot/usr 576K 7.88G 144K /usr zroot/usr/home 144K 7.88G 144K /usr/home zroot/usr/ports 144K 7.88G 144K /usr/ports zroot/usr/src 144K 7.88G 144K /usr/src zroot/var 48.9M 7.88G 48.2M /var zroot/var/crash 148K 7.88G 148K /var/crash zroot/var/log 208K 7.88G 208K /var/log zroot/var/mail 144K 7.88G 144K /var/mail zroot/var/tmp 152K 7.88G 152K /var/tmp

Rozdělění odpovídá myšlence ZFS. Založí se jeden velký oddíl a ten můžeme následně dále dělit.

Připojení file systemu na jiné místo provedeme nastavením parametru mountpoint

[root@freebsd ~]# zfs set mountpoint=/var/log zroot/var/log

Rozdělení poolu reflektuje standardní potřeby FreeBSD uživatele.
Na jednotlivé datasety lze aplikovat kvóty a rezervace. Můžeme takto zaručit, že příliš obsáhlé logy nezasáhnou do provozu databáze.
Kvóty a rezervace lze nastavit online.

[root@freebsd ~]# zfs set quota=2g zroot/var/log

Tato vlastnost je výhodou při použití jailů, kdy můžeme omezit obsazený prostor pro jednotlivé jaily.

[root ~]$ zfs list -o name,used,avail,refer,mountpoint,quota,reserv NAME USED AVAIL REFER MOUNTPOINT QUOTA RESERV zpool 2.44T 238G 31K /mnt/zpool none none zpool/jail 68.7G 41.3G 38K /jail 110G none zpool/jail/backup 4.03G 41.3G 3.32G /jail/backup none none zpool/jail/honeypot 462M 41.3G 421M /jail/honeypot none none zpool/jail/ldapradius 11.7G 41.3G 10.9G /jail/ldapradius none none zpool/jail/snort 27.0G 41.3G 6.98G /jail/snort 80G none zpool/jail/syslog 16.6G 41.3G 11.2G /jail/syslog none none zpool/jail/webs 8.83G 41.3G 2.26G /jail/webs none none zpool/ports 1.08G 2.92G 1.08G /usr/ports 4G none zpool/tmp 20.3M 1004M 20.3M /tmp 1G 1G zpool/usr 2.45G 3.55G 2.45G /usr 6G 6G zpool/var 1.21G 2.79G 1.21G /var 4G 4G

Snapshoty se vytváří příkazem zfs.

[root ~]# zfs snapshot zpool/jail/snort@Wed

Pro vytváření periodických záloh využijme automatického skriptu.
Vlastnoručně napsaného, nebo jako v tomto případě nástrojem zfSnap.

[root ~]# zfs list -t all ... zpool/jail/snort 27.0G 41.3G 6.98G /jail/snort zpool/jail/snort@weekly-2014-07-12_05.42.00--2m 2.38G - 6.86G - zpool/jail/snort@weekly-2014-07-19_06.03.00--2m 1.84G - 6.88G - zpool/jail/snort@weekly-2014-07-26_05.57.00--2m 1.74G - 7.11G - zpool/jail/snort@weekly-2014-08-02_06.26.00--2m 1.78G - 7.12G - zpool/jail/snort@weekly-2014-08-09_06.39.00--2m 1.68G - 7.12G - zpool/jail/snort@weekly-2014-08-16_06.13.00--2m 1.70G - 7.13G - zpool/jail/snort@weekly-2014-08-23_06.30.00--2m 2.05G - 7.13G - zpool/jail/snort@weekly-2014-08-30_06.24.00--2m 1.26G - 7.03G - zpool/jail/snort@Wed 0 - 6.98G - ...

Ze snapshotu lze vytvořit proud dat, který můžeme uložit do souboru pro účely zálohování.
Snapshot lze také odeslat na vzdálený systém, kde může být připraven jako záloha pro případ výpadku.

[root ~]# zfs send zpool/jail/snort@Wed | ssh backup zfs recv spool/backup

Systém implementuje Self-Healing vlastnost použitím techniky RAID-Z.
Jedná se o RAID5 s COW transakcemi.
Kdykoliv ZFS zjistí poškození dat nebo metadat špatným kontrolním součtem, může blok opravit pomocí správného bloku na redundantním disku.

Pro ušetření místa na disku můžeme zapnout vlastnost deduplikace. Pokud systém při zápisu na disk zjistí, že zapisovaný blok již existuje, neuloží ho, ale vytvoří pouze ukazatel na existující blok.

V dokumentaci k ZFS na FreeBSD stojí, že některé vlastnosti ZFS jsou velice náročné na paměť RAM.
Obecně se doporučuje 1 GB RAM na 1 TB storage.
Pokud použijeme vlastnost deduplikace doporučuje se až 5 GB RAM na 1 TB dat.

Komprese je ve výchozím nastavení pouze pro metadata.
Typ komprese můžeme vybrat z možností lzjb, gzip, gzip-[1–9], zle, lz4.
Šifrování je v beta stádiu.