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 Linux 1.1 [Mortál Szombat, másodlagos OS] ● 2007: Ubuntu 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 file system” 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 → Illumos fork, 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, ...
zfs ↔ ext[2,3,4], xfs, jfs, reiserfs, f2fs, ...
Ortodox unix 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 fsck ← 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 (raid, 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, byte ← 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/backup 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 → replication 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 (Oracle Solaris, Illumos). ● Nincs minden Solaris syscall Linuxra lefordítva. ● SPL 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