OpenZFS a mindennapokban

Az adattárolás elsődleges irányelve: Ne adjon vissza hibás adatot a háttértár Gajdos Tamás SZTE Optika és Kvantumelektronika Tanszék

whoami: ● 2004: Uhu 1.1 [Mortál Szombat, másodlagos OS] ● 2007: 7.10 [napi használatra, elsődleges OS] ● 2014: SFD Szeged: SaltStack előadás Mikroszkópos adattárolási problémák

● dSTORM lokalizációs mikroszkópia ● ~60 GB/nap: mérési adat + feldolgozott eredmény [*.tiff, *.csv, *.png] ● Felhasználók „home” könyvtárai ● Belső hálózaton elérhető (smb) ● Biztonsági mentések és visszaállítási pontok ● Kéziratokhoz mérési adatok archívuma (~5-10 év) ● Nem lehet leállás

2 “Z ” történelem

● 2001: Sun – OpenSolaris: Matthew Ahrens & Jeff Bonwick → CDDL license (Simon Phillips) ● 2008: FreeBSD port ● 2008: ZFS on Linux ● 2009: az Oracle felvásárolja a Sun-t ● 2010.08: belső e-mail az OpenSolaris zárt forrásúvá tételéről → , utolsó közös pont az OracleZFS és az OpenZFS között (v28) ● 2013: OpenZFS projekt → cél minden OS-re ● 2017.09. az Oracle elengedi a Solaris fejlesztését

3 https://itsfoss.com/what-is-zfs/ OpenZFS rétegek <> *nix

zpool ↔ dm, lvm2, hwraid, ...

↔ ext[2,3,4], , , , , ...

Ortodox 4 https://itsfoss.com/what-is-zfs/ filozófia? OpenZFS alapok: “Copy-On-Write”

● A módosítások egy új blokkra kerülnek, és az írás után a mutatók és a metadata frissül. ● Nincs ← mindig rendelkezésre áll az adat.

root meta B1 B2 B3

root meta B1 B2 B3 meta* B2*

5 https://pthree.org/2012/12/14/zfs-administration-part-ix-copy-on-write/ OpenZFS alapok: “Copy-On-Write”

● A módosítások egy új blokkra kerülnek, és az írás után a mutatók és a metadata frissül. ● Nincs fsck ← mindig rendelkezésre áll az adat. ● Pillanatkép (snapshot)

root meta B1 B2 B3

Merkle-tree root meta B1 B2 B3 meta* B2*

6 https://pthree.org/2012/12/14/zfs-administration-part-ix-copy-on-write/ OpenZFS alapok: checksumming, recordsize

● Minden olvasás során adat-sérülés ellenőrzés ● Hibás blokkok javítása (, extra másolatok) & Bit rot ● Minden íráskor frissül

root meta B1 B2 B3 fletcher4, sha256, c c c c 128K 128K 128K sha512, skein, edonr zfs set checksum=skein pool_name/dataset_name

7 https://blog.programster.org/zfs-record-size Ne kapcsoljuk ki! https://github.com/zfsonlinux/zfs/wiki/Checksums OpenZFS alapok: checksumming, recordsize

● Minden olvasás során adat-sérülés ellenőrzés ● Hibás blokkok javítása (raid, extra másolatok) & Bit rot ● Minden íráskor frissül ● Recordsize: blokk méret <= record size ● [4K, 8K, 16K, …, 128K, …, 1M]

root meta B[123] fletcher4, sha256, c c 640K sha512, skein, edonr zfs set checksum=skein pool_name/dataset_name zfs set recordsize=1M pool_name/dataset_name

8 https://blog.programster.org/zfs-record-size Ne kapcsoljuk ki! https://github.com/zfsonlinux/zfs/wiki/Checksums OpenZFS alapok: compression & dedup

● Tömörített blokkok: lz4, gzip1-9, lzof, zle, lzjb ● Minimális cpu használat (lz4), viszont gyorsabb írás és olvasás a lemezekről. ● Deduplikálás: blokk, fájl, ← Sha256 ● A nagy memória igény miatt nem javasolt

c c c c root cB2 cB3 root meta B1 meta B[123] c c c c c c c c

zfs set compression=lz4 tank/log

https://pthree.org/2012/12/18/zfs-administration-part-xi-compression-and-deduplication/ 9 OpenZFS alapok: ARC, L2ARC, ZIL

LRU MFU ● Adaptive Replacement Cache ● read cache

root meta cB1 cB2 cB3 c c c c

MRU LFU

10 https://www.youtube.com/watch?v=F8sZRBdmqc0 https://www.sparkmycloud.com/blog/zfs/ OpenZFS alapok: ARC, L2ARC, ZIL

LRU MFU ● Adaptive Replacement cmt Cache ● read cache ● tömörített

root meta cB1 cB2 cB3 c c c c cB3 cB1 MRU LFU

11 https://www.youtube.com/watch?v=F8sZRBdmqc0 https://www.sparkmycloud.com/blog/zfs/ OpenZFS alapok: ARC, L2ARC, ZIL

LRU

MRU MFU

LFU

12 https://www.youtube.com/watch?v=F8sZRBdmqc0 https://www.sparkmycloud.com/blog/zfs/ OpenZFS elérhetősége

● FreeBSD/FreeNAS: Része a base csomagoknak, és fő fájlrendszer ● Linux (2.6.32 – 5.3): GPL <> CDDL miatt csak kernel modul (64bit)

● Ubuntu 16.04+: $ sudo apt install zfsutils-linux zfs-initramfs

● CentOS6: # yum install http://download.zfsonlinux.org/epel/zfs-release.el6.noarch.rpm -y # nano /etc/yum.repos.d/zfs.repo #← engedélyezni a [zfs-kmod] tárolót # yum install zfs -y

● CentOS7: # yum install http://download.zfsonlinux.org/epel/zfs-release.el7_7.noarch.rpm -y # nano /etc/yum.repos.d/zfs.repo #← engedélyezni a [zfs-kmod] tárolót # yum install zfs -y ● … vagy forrásból telepíthető

https://tutorials.ubuntu.com/tutorial/setup-zfs-storage-pool 13 https://www.symmcom.com/docs/how-tos/storages/how-to-install-zfs-on-centos-7 https://github.com/zfsonlinux/zfs/wiki/RHEL-and-CentOS ZPOOL létrehozása (Ubuntu 18.04.3)

$ ls /dev/disk/by-id/ ● 5*750 GB HDD ata-HGST_HTS541075A9E680_JA13021H0J6BRK ata-SAMSUNG_HN-M750MBB_S2R9J9DBA00197 ● 1* 4 GB HDD ata-ST34311A_5BF1Y1ZK ata-ST34311A_5BF1Y1ZK-part1 ● zfs: mirror, stripe, raidz[1-3] ata-WDC_WD7502ABYS-18A6B0_WD-WMAU00120759 ata-WDC_WD7502ABYS-18A6B0_WD-WMAU00124488 ● unix: raid1, raid0, raid[5-7?] ata-WDC_WD7502ABYS-18A6B0_WD-WMAU00124851 wwn-0x5000cca764c75de1 wwn-0x50014ee0569e89cc wwn-0x50014ee0569e9763 wwn-0x50014ee0abf466d9 wwn-0x50024e92064919a6

$ sudo zpool create -o ashift=12 vd-Rocinante raidz1 \ /dev/disk/by-id/ata-SAMSUNG_HN-M750MBB_S2R9J9DBA00197 \ /dev/disk/by-id/ata-HGST_HTS541075A9E680_JA13021H0J6BRK \ /dev/disk/by-id/ata-WDC_WD7502ABYS-18A6B0_WD-WMAU00120759 \ /dev/disk/by-id/ata-WDC_WD7502ABYS-18A6B0_WD-WMAU00124488 \ /dev/disk/by-id/ata-WDC_WD7502ABYS-18A6B0_WD-WMAU00124851

14 https://docs.oracle.com/cd/E19253-01/819-5461/gaynr/index.html ZPOOL létrehozása (Ubuntu 18.04.3)

$ zpool status pool: vd-Rocinante state: ONLINE scan: scrub repaired 0B in 1h21m with 0 errors on Sat Oct 11 14:13:05 2019 config:

NAME STATE READ WRITE CKSUM vd-Rocinante ONLINE 0 0 0 raidz1-0 ONLINE 0 0 0 ata-SAMSUNG_HN-M750MBB_S2R9J9DBA00197 ONLINE 0 0 0 ata-WDC_WD7502ABYS-18A6B0_WD-WMAU00124851 ONLINE 0 0 0 ata-HGST_HTS541075A9E680_JA13021H0J6BRK ONLINE 0 0 0 ata-WDC_WD7502ABYS-18A6B0_WD-WMAU00120759 ONLINE 0 0 0 ata-WDC_WD7502ABYS-18A6B0_WD-WMAU00124488 ONLINE 0 0 0 errors: No known data errors

$ zpool list NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT vd-Rocinante 3,41T 3,12T 298G - 41% 91% 1.00x ONLINE -

15 https://docs.oracle.com/cd/E19253-01/819-5461/gaynr/index.html ZFS hangolás saját használatra

$ sudo zfs set compression=lz4 vd-Rocinante $ sudo zfs set checksum=skein vd-Rocinante

$ zfs list NAME USED AVAIL REFER MOUNTPOINT vd-Rocinante 2,49T 151G 28,8K /vd-Rocinante

$ sudo zfs create create -o mountpoint=/var/lib/lxc vd-Rocinante/lxc $ sudo zfs create create -o mountpoint=/srv/ vd-Rocinante/backup $ sudo zfs create create -o mountpoint=/srv/backup/deep vd-Rocinante/backup/deep $ sudo zfs create create vd-Rocinante/test

$ sudo zfs set recordsize=16K vd-Rocinante/lxc $ sudo zfs set recordsize=1M vd-Rocinante/backup $ sudo zfs set compression=gzip9 vd-Rocinante/backup/deep

16 ZFS hangolás saját használatra

$ zfs list NAME USED AVAIL REFER MOUNTPOINT vd-Rocinante 2,49T 151G 28,8K /vd-Rocinante vd-Rocinante/lxc 2,05G 151G 1,45G /var/lib/lxc vd-Rocinante/backup 2,49T 151G 1,24T /srv/backup vd-Rocinante/backup/deep 1,27T 151G 1,27T /srv/backup/deep vd-Rocinante/test 280M 151G 280M /srv/test

$ zfs get compression,compressratio vd-Rocinante NAME PROPERTY VALUE SOURCE vd-Rocinante compression lz4 local vd-Rocinante compressratio 2.11x -

$ zfs get all NAME PROPERTY VALUE SOURCE vd-Rocinante/test type filesystem - vd-Rocinante/test creation h okt 11 14:21 2019 - vd-Rocinante/test used 280M - vd-Rocinante/test available 151G - vd-Rocinante/test referenced 280M - vd-Rocinante/test compressratio 6.52x - vd-Rocinante/test mounted yes - vd-Rocinante/test quota none default

17 Snapshot & Remote backup

$ sudo zfs snapshot vd-Rocinante/test@manual_20190911 $ sudo zfs snapshot vd-Rocinante/test@manual_now

$ sudo zfs destroy vd-Rocinante/test@manual_20190911 $ sudo zfs rollback vd-Rocinante/test@manual_now

# zfs send vd-Rocinante/test@manual_now | zfs receive vd-Guanshiyin # zfs send -Rv vd-Rocinante/test@manual_now | zfs receive -F vd-Guanshiyin -R → stream package (létrehoz mindent) -F → ha a fogadó fél előrébb lenne, akkor azt visszaállítja

$ sudo zfs send -v -I vd-Rocinante/[email protected] \ vd-Rocinante/[email protected] | ssh [email protected] zfs recv -F \ vd-GuyMolinari/replications/test -I → incremental (két snapshot között)

https://www.freebsd.org/cgi/man.cgi?zfs(8) 18 RTFM! Probléma #1: Nem olyan gyors, mint lehetne

● ZFS a Solaris operációs rendszerhez lett tervezve (, Illumos). ● Nincs minden Solaris syscall Linuxra lefordítva. ● kernel modul: Solaris Portability Layer

19 https://www.youtube.com/watch?v=2jo0E1CJS2k Probléma#2: Memory fragmentáció, TLB

● kmalloc() ● vmalloc() ● DMA 1 1 1 1 2 2 2 3 3 3 4 4 4 4

3

2

phys virt phys virt

20 https://www.youtube.com/watch?v=2jo0E1CJS2k OpenZFS jövője

● Root on ZFS (Linux) ● Linuxon az SPL elhagyása (v0.8.0) ● Ubuntu 19.10 telepítője már tartalmazza ● FreeBSD is a ZFS on Linux moduljára áttér ● RaidZ kiterjesztés (6 HDD → 7 HDD → 8 HDD) ● ZSTD tömörítés (adaptív, több szint) ● Kmalloc() linuxon is (~v1.0.0) ● Minden fő operációs rendszeren elérhető legyen a közös verzió (Windows-ra is van port!)

https://docs.google.com/spreadsheets/d/1CFapSYxA5QRFYy5k6ge3FutU7zbAWbaeGN2nKVXgxCI 21 https://github.com/zfsonlinux/zfs/pull/9024 https://github.com/zfsonlinux/zfs/wiki/Ubuntu-18.04-Root-on-ZFS Köszönöm a figyelmet!

Q&A Demó (ha még lesz rá idő)… [UHU Linux 2.2 (Nerd) + OpenZFS v0.6.5.11]

22