ZFS failisüsteemi kasutamine
Sisukord
- 1 ZFS
- 2 Sissejuhatus
- 3 Kasutus
- 4 Pool
- 5 Failisüsteem
- 6 Snapshoti kasutamine
- 7 Failisüsteemi kloon
- 8 Failisüsteemi võrku jagamine
- 9 Andmete pakkimine
- 10 zpooli versiooni uuendamine
- 11 Kõvaketta vahetamine poolis
- 12 Ketaste lisamine pooli ehk mitme erineva pooli kombineerimine üheks
- 13 Pooli import ja eksport
- 14 ZFS ja Deduplication
- 15 ZFS kasutamine Solarises
- 16 ZFSi ohutu katsetamine FreeBSD süsteemis
- 17 Pakitud failisüsteemi ja quota probleem
- 18 ZFS LInuxil üle ZFS-Fuse
- 19 Jõudluse suurendamine ehk sendfile() funktsioon ja suured failid
- 20 Kiirustestid
- 21 Probleemide avastamine käsuga scrub
- 22 Zfz-stats
- 23 GeomWatch
- 24 Lingid
ZFS
ZFS (Zettabyte File System) on Sun'i teadlaste poolt välja töötatud failisüsteem, millel on järgmised iseloomulikud tunnused
- praktiliselt piirita mahupiirangud (failisüsteemi suuruse, failide arvu, snapshottide arvu jms omaduste jaoks)
- kokku on ühendatud failisüsteemi ning logical volume managementi omadused, mis teeb kasutamise mugavaks
- ZFS on open-source failisüsteem (Common Development and Distribution License)
- töötamise ajal saab failisüsteemi moodustavate seadmete arvu suurendada, aga eemaldada saab vaid teatud tingimustel
- Failisüsteemi blokisuurus valitakse dünaamiliselt ja on jooksvalt muudetav.
- Snapshotide ja failisüsteemi kloonide tegemise võimalus
- Kõikide plokkidega koos salvestatakse 256 bitine kontrollsumma. Kui kettalt loetud info ja kontrollsumma ei lange kokku taastatakse riknenud andmed automaatselt paarsusinfo abil.
- Võimalus kasutada pakitud failisüsteeme ja deduplikeerimist
ZFS versioonid ja neis lisandunud võimalused
VER DESCRIPTION --- -------------------------------------------------------- 1 Initial ZFS version 2 Ditto blocks (replicated metadata) 3 Hot spares and double parity RAID-Z 4 zpool history 5 Compression using the gzip algorithm 6 bootfs pool property 7 Separate intent log devices 8 Delegated administration 9 refquota and refreservation properties 10 Cache devices 11 Improved scrub performance 12 Snapshot properties 13 snapused property 14 passthrough-x aclinherit 15 user/group space accounting 16 stmf property support 17 Triple-parity RAID-Z 18 Snapshot user holds 19 Log device removal 20 Compression using zle (zero-length encoding) 21 Deduplication 22 Received properties
Tabeli paremaks mõistmiseks info, et FreeBSD 8-STABLE/9-CURRENT peale on portud versioon 15 (versioon 13 on 8.0-RELEASE süsteemis). Täpsemat infot FreeBSD peal ZFS kasutamisest ja versioonidest leiab http://wiki.freebsd.org/ZFS
Sissejuhatus
Siin tekstis vaadeldud eelkõige ZFS failisüsteemi kasutamist operatsioonisüsteemil Solaris, kuid kuna FreeBSD peale on ZFS samuti täiel mahul porditud ning võimalik on seda üle Fuse kasutada ka Linuxis siis on 99% ulatuses toodud käsud rakendatavad ka neis süsteemides. Lõpus on ära toodud ka mõned FreeBSD ja Linuxi spetsiifilised kasutusjuhtumid.
FreeBSD Peamiseks erinevuseks võrreldes Solarisega on ,et FreeBSD's pole ZFS moodul vaikimisi laetud ning selleks tuleb lisada rc.conf faili
zfs_enable="YES"
Või tükkida käsk zfs mooduli jooksvalt laadimiseks
# kldload zfs
Kasutus
ZFS failisüsteemi kasutuselevõtmine toimub kahes etapis
- tuleb moodustada ZFS pool
- ZFS poolis tuleb moodustada ZFS failisüsteemid
Üldiselt nimetatakse pooli, failisüsteemi, snapshoti või klooni dataset'iks.
Pool
ZFS pooli tegemisel näidatakse, milliseid füüsilisi seadmed ja millise redundantsusega kasutama asutakse. Kõige otsekohesem on kasutada kogu füüsilist seadet, aga võimalik on kasutada ka nn Solarise partitsioone, nt c4t0d0s6 või tavalisi faile failisüsteemist. Viimane võimalus on praktiliselt sobilik ehk vaid katsetamiseks ning ZFS omaduste tundmaõppimiseks.
Moodustame 100G suurusele kettaseadmele da0 (/dev/da0) ZFS failisüsteemi
# zpool create tank da0
Moodustatud pool'i omadusi saab vaadata käsuga
# zpool status
Pooli eemaldamine toimub käsuga
# zpool destroy tank
ZFS võimaldab lisaks failisüsteemi tekitamisele koostada ka erinevaid raid skeeme. Näiteks moodustame kahe Solaris operatsioonisüseemile nähtava kettaseadme c2t0d0 ja c3t0d0 baasil ZFS pool'i nimega tank, milles on füüsilised kettaid paigutatud peeglisse
# zpool create tank mirror c2t0d0 c3t0d0
Raid 5 skeemiga pooli moodustamiseks tuleb öelda
# zpool create tank raidz c6t8d0 c7t0d0 c7t5d0
Tegemist on Raid5 laadse süsteemiga kus paarsusinfo paigutatakse mööda kettaid. Kuid kasutusel on erinevad algoritmid mis pakuvad suuremat jõudlust kirjutamise puhul. Raidz üks kasulik omadus on iseparanduvus "self-healing". Kui bad-block on avastatud siis ZFS lisaks korrektsete andmete võtmisele üritab ka viga proovides asendada vigase info korrektsega. Ühe füüsilise ketta riknemise korral suudab ZFS omakorda aga paarsusinfo säilunud block-devicedele ümber jagada.
Raid 10 skeemiga pooli moodustamiseks
# zpool create srv mirror da1 da2 da3 mirror da4 da5 da6
Ning stripe ehk raid0 tekitamiseks
# zpool create tank c6t8d0 c7t0d0 c7t5d0
Pooli omadusi saab küsida öeldes
# zpool get all tank NAME PROPERTY VALUE SOURCE tank size 244G - tank used 132G - tank available 113G - tank capacity 53% - tank altroot - default tank health ONLINE - tank guid 16227317280498583651 - tank version 4 local tank bootfs - default tank delegation on default tank autoreplace off default tank cachefile - default tank failmode wait default
Pooli juures on oluline tähele panna, et ta kasutab sisemiselt nn on-disk format'it. Võimalikud väärtused ZFS pool 15 versioonil on:
# zpool upgrade -v This system is currently running ZFS pool version 15. The following versions are supported: VER DESCRIPTION --- -------------------------------------------------------- 1 Initial ZFS version 2 Ditto blocks (replicated metadata) 3 Hot spares and double parity RAID-Z 4 zpool history 5 Compression using the gzip algorithm 6 bootfs pool property 7 Separate intent log devices 8 Delegated administration 9 refquota and refreservation properties 10 Cache devices 11 Improved scrub performance 12 Snapshot properties 13 snapused property 14 passthrough-x aclinherit 15 user/group space accounting For more information on a particular version, including supported releases, see: http://www.opensolaris.org/os/community/zfs/version/N Where 'N' is the version number.
Pooli moodustamisel saab lisaks määrata ka on-disk format versiooni.
Pooli ümbernimetamiseks tuleb anda järgnevad käsud: Nimetame pooli katsetus ümber srv'ks
# zpool export katsetus # zpool import katsetus srv
või
# zfs rename tank/katsetus tank/srv
Võimalik on ka lihtsalt testida milline tulevane raidiskeem välja nägema hakkab ilma seda reaalselt ketastele loomata, selleks tuleb create järele lisada võti -n
Failisüsteem
Moodustame poolis kaks failisüsteemi, /opt/csw ning /export/home (tundub, et neil kahel konkreetsel juhul on ZFS failisüsteemist palju abil, samas peab arusaadavalt vaatama, et süsteem, kus tegevusi läbi viia oleks selleks valmis)
# zfs create anum/opt-csw # zfs create anum/export-home
Peale failisüseemide moodustamist tuleks neile näidata sobivad ühenduspunktid
# zfs set mountpoint=/opt/csw anum/opt-csw # zfs set mountpoint=/export/home anum/export-home
Ühenduspunkti eemaldamiseks tuleb kasutada mountpoint=none väärtust.
Failisüsteemi külge ja lahti ühendamine toimub vastavalt
# zfs mount anum/opt-csw # zfs umount anum/opt-csw
Failisüsteemide seisu saab vaadata käsuga
# zfs list
või ise näidates soovitud parameetrid
# zfs list -o shareiscsi,origin,name,used,avail,refer,mountpoint,type
Failisüseemi eemaldamine toimub sarnase käsuga
bash# zfs destroy anum/opt-csw
Failisüsteemi omaduste küsimiseks tuleb öelda näiteks
# zfs get all anum/iscsi NAME PROPERTY VALUE SOURCE anum/iscsi type filesystem - anum/iscsi creation Tue Oct 9 15:38 2007 - anum/iscsi used 36.5K - anum/iscsi available 6.63G - anum/iscsi referenced 36.5K - anum/iscsi compressratio 1.00x - anum/iscsi mounted yes - anum/iscsi quota none default anum/iscsi reservation none default anum/iscsi recordsize 128K default anum/iscsi mountpoint /anum/iscsi default anum/iscsi sharenfs off default anum/iscsi checksum on default anum/iscsi compression off default anum/iscsi atime on default anum/iscsi devices on default anum/iscsi exec on default anum/iscsi setuid on default anum/iscsi readonly off default anum/iscsi zoned off default anum/iscsi snapdir hidden default anum/iscsi aclmode groupmask default anum/iscsi aclinherit secure default anum/iscsi canmount on default anum/iscsi shareiscsi off default anum/iscsi xattr on default
Failisüsteemi loomisel vaikimisi ei ole määratletud failisüsteemi suurust. Kui sama zfs pooli sisse moodustada mitu failisüsteemi, siis ühe täitumine tähendab kõigi täitumist, selle vastu aitab failisüsteemile suuruse seadmine (ingl. k. quota) öeldes nt
# zfs set quota=16G anum/export-home
Kui on soov lihtsalt mingitele kaustadele/kasutajatele panna quota pooli siseselt peale siis aitab lihtsalt käsk
# zfs create -o compression=on -o quota=905G poolinimi/mart # zfs create -o compression=on -o quota=905G poolinimi/ants
Kasuks tuleb ka eelnevalt
# zfs set atime=off poolinimi
Zpoolis antud käskude vaatamiseks, alates selle loomisest
# zpool history History for 'home': 2013-01-23.19:39:31 zpool create -f home raidz da1 da2 ada0 ada1 ada3 2013-01-24.01:37:42 zfs set primarycache=metadata home 2013-01-30.02:56:40 zpool scrub home 2013-02-10.16:35:02 zpool scrub home
Snapshoti kasutamine
Failisüsteemist snapshoti moodustamisel fikseeritakse ära ajahetkele vastav failisüsteemi olek ning seostatakse selle olekuga nimi. Snapshoti nime abil saab edaspidi selle snapshoti poole pöörduda. Peale failisüsteemist snapshoti moodustamist toimub vastava failisüsteemi enda kasutamine edasi muutusteta.
Snapshot võimaldab
- ajahetkele vastavale failisüsteemi olekule tagasi pöörduda
- ajahetkele vastavast failisüsteemist teha koopiat (nt backupi või failisüsteemi klooni tegemise mõttes)
- vahetult read-only ligipääsu selle ajahetkele vastavale seisule (snapshot on iseenesest read-only)
Failisüsteemist snapshoti moodustamine toimub näiteks käsuga
bash# zfs snapshot anum/opt-csw@20070331
kusjuures @-märgi järel ei pruugi olla tingimata aega tähistav sõne. Snapshoti saab moodustada failisüsteemist, mille failid on avatud, kuid ilmselt saab kooskõlaliste andmetega snapshoti, kui failisüsteem ei ole parasjagu kasutusel (või on teada kuidas olukorda lahendada).
Kui failisüsteem oli snapshoti tegemise ajal ühendatud kataloogi /opt/csw alla, siis snapshotile vastavale failisüsteem asub kataloogis /opt/csw/.zfs/snapshot/20070331. Oluline on tähele panna, et shelli tab klahviga complete'imine ei toimi, '.zfs/' osa tuleb välja kirjutada.
Üheks snapshoti kasutamise eesmärgiks võiks olla tekitada olukord, et peale muudatuste tegemist kõnealusesse failisõsteemi saaks vajadusel hõlpsasti pöörduda tagasi eelmisele seisule. Tingimusel, et taastataval failisüsteemil ei ole avatud faile (st praktiliselt peab olema võimalik failisüsteemi lahti ühendada, mida küll zfs käsk automaatselt teeb), tuleb eelmisele seisule tagasipöördumiseks öelda
bash# zfs rollback anum/opt-csw@20070331
Teiseks snapshoti kasutamise eesmärgiks võiks olla ajahetkele vastava koopia moodustamine, mida saab talletada faili kujul ning millelt saab hiljem vajadusel ajahetkele vastavat failisüsteemi seisu taastada. Koopia tegemine toimub käsuga
bash# zfs send anum/export-home@20070331 | gzip -c > anum-export-home-20070331.gz
Taastamine toimuks käsuga
bash# gunzip -c anum-export-home-20070331.gz | zfs receive anum/export-home
Arvutis olevate snapshottide nimekirja näeb käsuga
bash# zfs list -t snapshot
Snapshoti eemaldamine toimub käsuga
bash# zfs destroy anum/opt-csw@20070331
Failisüsteemi kloon
Selleks, et snapshotile vastavasse failisüsteemi saaks kasutada traditsiooniliselt, tuleb temast moodustada failisüsteemi kloon, näiteks selliselt
# zfs clone anum/opt-csw@20070331 anum/opt-csw-20070331
Tulemusena tekib failisüsteemi anum/opt-csw-20070331 kasutada nagu tavalist ZFS failisüsteemi.
Lisaks on võimalus algne failisüsteem, st see, mille snapshotist kloon tekitati, asendada klooniga öeldes
# zfs promote anum/opt-csw-20070331
Toimuvat võiks ette kujutada nii, et keskel on snapshot ja promotemise tulemusena vahetavad allikas ja kloon omavahel kohad, mis mille suhtes moodustatud on.
Kui üldiselt tuleb eemaldada asju järjekorras, 1. kloon, 2. snaphost, 3. allikas, siis promote'imise tulemusena saab ilma klooni eemaldamata allika eemaldada.
Selleks, et kloon kannaks allikaks olnud failisüsteemi nime, tuleb kasutada zfs rename käsku.
Failisüsteemi võrku jagamine
ZFS failisüsteemi saab jagada võrku nii nagu tavalist failisüsteemi NFS serveri abil. Solarise puhul on aga mugav seda teha lihtsalt seades ZFS failisüsteemi sharenfs omaduse väärtuseks 'on'. Näiteks selliselt
# zfs set sharenfs=on anum/export-home
Hõplsasti saab käsu share abil veenduda, kas failisüsteem tekkis NFS serveri poolt välja jagatud failisüsteemide nimekirja, näiteks
# share - /export/home rw "kasutajate kodukataloogid" - /var/log/postgresql ro "pg logid"
Selliselt välja jagatud failisüsteemi kasutamine toimub NFS kliendi poolt samuti kui tavalise NFS serveri poolt välja jagatud failisüsteemi kasutamine.
Alates versioonist Solaris 10 8/07 (u4) saab hõlpsasti jagada võrku iscsi targetina ZFS volume'it, selleks tuleb öelda
# zfs create -V 20g tank/iscsishare # zfs set shareiscsi=on tank/iscsishare # iscsitadm list target Target: tank/iscsishare iSCSI Name: iqn.1986-03.com.sun:02:875dc199-fcc0-e9f3-d548-b18bd837c9d5 Connections: 0
Tõsi, tundub, et ZFS volume'ile vastavale ressursile ei pääse praktiliselt muud moodi ligi kui üle iscsi.
Targeti eemaldamiseks tuleb öelda
# zfs set shareiscsi=off tank/iscsishare # zfs destroy tank/iscsishare
NFS ja iSCSI protokolliga ZFS ressursi võrku jagamisel leiab aset Solarisele iseloomulikuna, et automaatselt käivitatakse sobivalt seadistatud NFS ja iSCSI targeti deemonid.
Andmete pakkimine
Lülitame sisse pakkimise
# zfs set compression=on zfstest
Info küsimiseks kui hästi info pakkimine toimib on olemas käsk
# zfs get compressratio NAME PROPERTY VALUE SOURCE zfstest compressratio 1.85x -
Ja mõned testid
Esimesena sql dumbiga. Faili suurus väljaspool ZFSi pakkimata
1.1G /home/jj/KOOLIELU/koolielu.sql
Fail ZFS sees
# du -h /zfstest/koolielu.sql 346M /zfstest/koolielu.sql
Vaatame mitmekordne võit tekkis
# zfs get compressratio NAME PROPERTY VALUE SOURCE zfstest compressratio 3.14x -
Selline võit on saavutatav muidugi vaid hõredate tekstifailidega. Näiteks DVD5 ISO faili puhul 4.4G iso läks vaid 4.3G suuruseks
FreeBSD ports haru (/usr/ports) oli zfs pakituna 253 mega, seejuures on ports originaalse suurusega 488 mega
Lisa2: OpenSolarise masina peal kunagi tehtud katsetused:
DD-ga 1 GiB faili kirjutamiskiirused ZFS-il:
vaikelayout (striped?): 44,5 MB/s
RAIDZ: vanilla: 45.5 MB/s compress=gzip-1 38,6 MB/s compress=gzip-1, dedup=on 37,2 MB/s compress=on dedup=on 45,1 MB/s
zpooli versiooni uuendamine
Solarise operatsioonisüsteemi uuendamisel võib juhtuda, et zfs tarkvara toetab uuemat zfs failisüsteemi versiooni kui kasutusel on. Sellest saab teada käsuga
# zpool status export pool: export state: ONLINE status: The pool is formatted using an older on-disk format. The pool can still be used, but some features are unavailable. action: Upgrade the pool using 'zpool upgrade'. Once this is done, the pool will no longer be accessible on older software versions.
Nagu arvuti ütleb, versiooni uuendamine toimub selliselt
# zpool upgrade export This system is currently running ZFS version 3. Successfully upgraded 'export' from version 2 to version 3
Kõvaketta vahetamine poolis
Kõvaketta vahetamiseks poolis tuleb öelda
zpool replace -f anum c5t1d0 c5t2d0
mille tulemusena zpoolis anum asendatakse esimene seade teisega. Samal ajal zpooli olekut vaadates saab teada kui kaugel asendamine on
bash# zpool status pool: anum state: ONLINE status: One or more devices is currently being resilvered. The pool will continue to function, possibly in a degraded state. action: Wait for the resilver to complete. scrub: resilver in progress, 12.91% done, 0h11m to go config: NAME STATE READ WRITE CKSUM anum ONLINE 0 0 0 mirror ONLINE 0 0 0 c0t4d0 ONLINE 0 0 0 replacing ONLINE 0 0 0 c5t1d0 ONLINE 0 0 0 c5t2d0 ONLINE 0 0 0 errors: No known data errors
Ketaste lisamine pooli ehk mitme erineva pooli kombineerimine üheks
Seadme lisamiseks tuleb öelda, kusjuures poolilt moodustatud failisüsteemid võivad olla samal ajal külge ühendatud
# zpool add poolinimi seadmenimi
Seejuures peab arvestama, et eemaldada saab vaid redundantseid seadmeid.
Näiteks kui on olemas pool
NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 mirror ONLINE 0 0 0 c0t0d0s4 ONLINE 0 0 0 c1t0d0s4 ONLINE 0 0 0 mirror ONLINE 0 0 0 c0t1d0s4 ONLINE 0 0 0 c1t1d0s4 ONLINE 0 0 0
siis sinna ühe mirroripaari lisamiseks tuleb öelda
# zpool add tank mirror c0t0d0s3 c1t0d0s3
ning tulemuseks on
NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 mirror ONLINE 0 0 0 c0t0d0s4 ONLINE 0 0 0 c1t0d0s4 ONLINE 0 0 0 mirror ONLINE 0 0 0 c0t1d0s4 ONLINE 0 0 0 c1t1d0s4 ONLINE 0 0 0 mirror ONLINE 0 0 0 c0t0d0s3 ONLINE 0 0 0 c1t0d0s3 ONLINE 0 0 0
Keerukam näide raid-z peal erienvate raiditüüpidega: Meil on neli ketast da0 da1 da2 da3 mis 250Gb suurused, neli ketast da4 da5 da6 da7 mis 300Gb suurused ning kolm ketasad10 ad4 ad6 mis 160G suurused
selleks, et me ei kaotaks ruumi, kui raid arvutatakse kõige väiksemate ketaste alusel, kuid saaksime nad üheks suureks pooliks kokku kombineerida
# zpool create usr1 raidz da0 da1 da2 da3 # zpool add usr1 raidz da4 da5 da6 da7
Välja näeb tulemus selline
# zpool status pool: usr1 state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM usr1 ONLINE 0 0 0 raidz1 ONLINE 0 0 0 da0 ONLINE 0 0 0 da1 ONLINE 0 0 0 da2 ONLINE 0 0 0 da3 ONLINE 0 0 0 raidz1 ONLINE 0 0 0 da4 ONLINE 0 0 0 da5 ONLINE 0 0 0 da6 ONLINE 0 0 0 da7 ONLINE 0 0 0
Soovides lisada veel 3 ketast 160g suurused tuleb anda käsk
# zpool add usr1 raidz ad10 ad4 ad6 invalid vdev specification use '-f' to override the following errors: mismatched replication level: pool uses 4-way raidz and new vdev uses 3-way raidz
Tegemist on hoiatusega ja seda võib siiski ignoreerida. Peamine mis kannatab on raidi kiiruste pool, see võib pisut langeda.
# zpool status pool: home state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM home ONLINE 0 0 0 raidz1 ONLINE 0 0 0 da0 ONLINE 0 0 0 da1 ONLINE 0 0 0 da2 ONLINE 0 0 0 da3 ONLINE 0 0 0 raidz1 ONLINE 0 0 0 da4 ONLINE 0 0 0 da5 ONLINE 0 0 0 da6 ONLINE 0 0 0 da7 ONLINE 0 0 0 raidz1 ONLINE 0 0 0 ad4 ONLINE 0 0 0 ad6 ONLINE 0 0 0 ad10 ONLINE 0 0 0 errors: No known data errors
Pooli import ja eksport
Kui arvutile lisada kõvakettad, mis omavahel moodustavad pooli, siis saab seda tutvustada operatsioonisüsteemile käsuga
test-baas:~# zpool import pool: teine_anum id: 3176370179574190780 state: ONLINE status: The pool is formatted using an older on-disk version. action: The pool can be imported using its name or numeric identifier, though some features will not be available without an explicit 'zpool upgrade'. The pool may be active on on another system, but can be imported using the '-f' flag. config:
teine_anum ONLINE c7t0d0s3 ONLINE c6t8d0s3 ONLINE
Ning kui sobib, siis teha kasutatavaks öeldes
# zpool import teine_anum
Kui imporditav pool arvab enda kohta nime, mis on juba kasutusel, siis tuleb öelda
# zpool import teine_anum uus_pooli_nimi
Kusjuures, kui sedasi külge ühendatava pooli sees on kirjeldatud failisüsteemid, mille külgeühenduspunkt ei ole töötavas operatsioonisüsteemis tühi, siis ei toimu külgeühendamist ja saab sarnase teate
# zpool import -f teine_anum cannot mount '/data': directory is not empty
Kui aga on plaanist pooli moodustavad kõvakettad süsteemist eemaldada, tuleb öelda
# zpool export anum
ZFS ja Deduplication
TODO
- For every TB of pool data, you should expect 5 GB of dedup table data,
assuming an average block size of 64K.
- This means you should plan for at least 20GB of system RAM per TB of
pool data, if you want to keep the dedup table in RAM, plus any extra memory for other metadata, plus an extra GB for the OS.
(see oli kokkuvõte, muidu on seal üsna pikk ja põhjalik analüüs) http://constantin.glez.de/blog/2011/07/zfs-dedupe-or-not-dedupe
- http://blogs.sun.com/bonwick/entry/zfs_dedup
- http://constantin.glez.de/blog/2010/03/opensolaris-zfs-deduplication-everything-you-need-know
ZFS kasutamine Solarises
Probleemid Solarises
Kui zfs mingil põhjusel nö eksib väga ära, siis võib arvuti bootimine olla vägagi raskendatud. Aitab bootida nullindasse milestone'i, sarnaselt
{0} ok boot /sbus@7,0/SUNW,fas@3,8800000/sd@2,0 -m milestone=none
sisestada juurkasutaja parool ning eemaldada fail
/etc/zfs/zpool.cache
Iseenesest jäävad zfs andmed selle liigutuse tulemusel hävitamata, kuid ilmselt on seal midagi suhteliselt katki ning nad vajavad oskuslikku lähenemist.
Kui pooli moodustamisel vastab süsteem, et
# zpool create tank c6t8d0 c7t0d0 c7t5d0 invalid vdev specification use '-f' to override the following errors: /dev/dsk/c6t8d0s0 contains a ufs filesystem. /dev/dsk/c6t8d0s2 contains a ufs filesystem. /dev/dsk/c6t8d0s3 is part of exported or potentially active ZFS pool kolmas_anum. Please see zpool(1M).
ning on teada, et võib neid asjaolusid mitte arvestad, siis sobib kasutada create järel võtit -f
bash# zpool create -f tank c6t8d0 c7t0d0 c7t5d0
Kasutamine Solarises CSW tarkvaraga majandamisel
CSW paketid paigaldatakse reeglina kataloogi /opt/csw kusjuures paketihaldusega seotud muudatused fikseeritakse kataloogis /var/sadm, st samas kohas koos nt SUNW pakettidega. Kui need kataloogid paigutada ZFS failisüsteemidele, siis on CSW tarkvara muudatuste tegemisel võimalus suhteliselt hõlpsasti kasutades sobivalt ZFS snapshotte neid muudatusi vajadusel tagasi võtta.
Lisaks, /export ja /usr/local kataloogide pidamine ZFS peal võib samuti anda süsteemi haldamisel juurde paindlikkust.
ZFS failisüsteemi kasutamine Solarise non-global tsoonis
ZFS failisüsteemi kasutamiseks Solarise non-global tsooni juures saab tsooniga seostada kas ZFS failisüsteemi enda või ZFS dataset'i. Viimasel juhul on tsooni administraatoril enam võimalusi vastava ZFS ressursiga tegeleda, nt saab ta moodustada failisüsteeme ja snapshotte tsooni sees.
Näiteks teeme nii, et ZFS failisüsteemi tank/data saab kasutada tsoonis 'tsooninimi' ning ta on seal kataloogi /data alt ligipääsetav
bash# zfs set mountpoint=legacy tank/data bash# zonecfg -z tsooninimi ... zonecfg:tsoooninimi> add fs zonecfg:tsoooninimi:fs> set type=zfs zonecfg:tsoooninimi:fs> set special=tank/data zonecfg:tsoooninimi:fs> set dir=/data zonecfg:tsoooninimi:fs> end
Aga soovides delegeerida non-global tsoonile tank/data kui dataset'i tuleb öelda
zonecfg:tsooninimi> add dataset zonecfg:tsooninimi:dataset> set name=tank/data zonecfg:tsooninimi:dataset> end
Tsooni delegeeritud failisüsteemidega ei saa globaalses tsoonis turvakaalutlustega ennem tegeleda, kui tsooni seadistustest on vastav dataset eemaldatud ning lisaks on ka eemaldatud zoned lipp
bash# zfs set zoned=off tank
kus tank on dataset'i nimi.
ZFSi ohutu katsetamine FreeBSD süsteemis
Soovides vaid zfs'i testida ning kasutada seejuures erinevaid img faile ,et mängida läbi mitmesuguseid raid jms kompressimise lahendusi tuleb toimetad sedasi
Loome testiks isofaili mille haagime külge zfs formaadis kettana
# dd if=/dev/zero of=zfs.img bs=1024k count=11024 5834+0 records in 5833+0 records out 6116343808 bytes transferred in 136.348605 secs (44858133 bytes/sec)
Kontrollime ISO suurust
# du -h zfs.img 5.7G zfs.img
Haagime selle BSDle dev block seadmena külge
# mdconfig -f zfs.img md5
Loome tekkinud md5 nimelise block seadme peale zfs pooli
# zpool create zfstest /dev/md5
Vaatame kas kõik läks viisakalt ning seade haagiti failisüseemile automaatselt külge
# df -h Filesystem Size Used Avail Capacity Mounted on /dev/ad0s1a 148G 59G 77G 43% / .. zfstest 5.6G 0B 5.6G 0% /zfstest
Pakitud failisüsteemi ja quota probleem
ZFS failisüsteem läks üle quota ja pealse seda ei lubanud enam faile kustutada: Disk quota exceeded.
$ rm boxroom-0.6.3.zip rm: boxroom-0.6.3.zip: Disc quota exceeded
Lahenduseks on kustutatav fail esmalt nullida: http://lists.freebsd.org/pipermail/freebsd-current/2008-January/082615.html
$ ls -larth boxroom-0.6.3.zip -rw-r--r-- 1 laas wheel 344K Apr 19 2009 boxroom-0.6.3.zip $ cat /dev/null > boxroom-0.6.3.zip $ rm boxroom-0.6.3.zip
Niiviisi vabastatud 334 kilobaidist piisas, et sai faili enda eemaldada ning seejärel minna suuremate failide kallale
Probleem tekkis tõenäoliselt kuna tegu oli pakitud failisüsteemiga. Sellest tuleb järeldada, et ka kataloogikirjed on pakitud mitte vaid inodede sisu. Ehk mõne baidi muutmine suurendab kataloogi ja nullide kirjutamine teeb faili väiksemaks.
Edit: Tundub, et sama probleem tekib ka vahel mitte pakitud failisüsteemiga. Terve kaustapuu puhul oleks lahenduseks kõik failid tühjendada
# find /path/to/directory -type f -exec cat /dev/null > {} \;
Ja seejärel rm failiga eemaldada.
ZFS LInuxil üle ZFS-Fuse
Debiani puhul tuleb installida järgnevad sõltuvused
# apt-get install libaio-dev libattr1-dev libacl1-dev libz-dev libz-dev libfuse-dev libfuse2 scons libssl-dev # apt-get install bzip2 # apt-get install make
ZFS-Fuse paketi installiks tuleb käivitada järgnevad käsud
Loome kausta kus kompileerida
# cd /usr/src/
Tõmbame algkoodi alla
# wget http://zfs-fuse.net/releases/0.6.9/zfs-fuse-0.6.9.tar.bz2
Pakime lahti
# bunzip2 -d zfs-fuse-0.6.9.tar.bz2 # tar -xf zfs-fuse-0.6.9.tar
Siseneme kausta ja kompileerime scons käsuga
# cd zfs-fuse-0.6.9 # cd src # scons
To install, run 'scons install' with appropriate privileges. It will install the binaries in /usr/local/sbin by default.
Jõudluse suurendamine ehk sendfile() funktsioon ja suured failid
Kui FTP ja Veebiserver peavad jagama ZFS pealt mahukaid faile siis võib tarkvarade puhul mis kasutavad vaikimisi Sendfile() funktsiooni failide edastamise jõudlus drastiliselt langeda. Sendfile on nimelt mõeldud peamiselt paljude väikeste failide serveerimiseks mitte aga suurte.
Seega ISO failide ja arhiivide liigutamise puhul tasub see kasutatavast tarkvarast välja lülitada.
Vsftp puhul piisab näiteks kui lisada vsftpd.conf faili rida
use_sendfile=NO
Veebiserveri Apache puhul saab seda seadistad isegi täpsemalt kaustade põhiselt:
<Directory "/teekond-failideni"> EnableSendfile Off </Directory>
Zfsil võiks lasta mälusäästu huvides käsnata üksnes metadatat.
# zfs set primarycache=metadata tank/datab
Kiirustestid
Mõned subjektiivsed kiirusetestid, kus võrdleme ühesuguseid kombineeritud raidiskeemide jõudlust võrreldes tavalise lahendusega
Kaks nelja kettaga raid-z pooli ühes poolis
# zpool create t1 raidz da0 da1 da2 da3 raidz da4 da5 da6 da7
dd test
# dd if=/dev/urandom of=/t1/1G bs=1024 count=1024 1073741824 bytes transferred in 19.908234 secs (53934559 bytes/sec)
Kaks nelja kettaga ja üks kolme kettaga raid-z pool ühes poolis
# create -f t2 raidz da0 da1 da2 da3 raidz da4 da5 da6 da7 raidz ad4 ad6 ad10
dd test
# dd if=/dev/urandom of=/t2/1G bs=1024k count=1024 1073741824 bytes transferred in 20.388560 secs (52663937 bytes/sec)
Üks raidz pool kolme kettaga
# zpool create -f t3 raidz ad4 ad6 ad10
dd test
# dd if=/dev/urandom of=/t3/1G bs=1024k count=1024 1073741824 bytes transferred in 24.006931 secs (44726326 bytes/sec)
Probleemide avastamine käsuga scrub
Probleem: üks ketas poolis tundub katki
Prooviks parandada scrub abil
# zpool scrub srv # zpool status pool: srv state: ONLINE status: One or more devices could not be used because the label is missing or invalid. Sufficient replicas exist for the pool to continue functioning in a degraded state. action: Replace the device using 'zpool replace'. see: http://www.sun.com/msg/ZFS-8000-4J scrub: scrub in progress for 0h0m, 0.00% done, 345h11m to go config: NAME STATE READ WRITE CKSUM srv ONLINE 0 0 0 raidz1 ONLINE 0 0 0 ad10 UNAVAIL 0 467 7.64M corrupted data ad8 ONLINE 0 0 0 ad6 ONLINE 0 0 0 ad12 ONLINE 0 0 0 ad14 ONLINE 0 0 0 errors: No known data errors
Anname scrubi soovitatud käsu
# zpool replace -f srv ad10
Mille peale algab asendamine
# zpool status pool: srv state: DEGRADED scrub: scrub in progress for 0h5m, 7.14% done, 1h6m to go config: NAME STATE READ WRITE CKSUM srv DEGRADED 0 0 0 raidz1 DEGRADED 0 0 0 replacing DEGRADED 0 0 0 ad10/old UNAVAIL 0 0 0 cannot open ad10 ONLINE 0 0 0 2.92G resilvered ad8 ONLINE 0 0 0 ad10 ONLINE 0 0 0 ad12 ONLINE 0 0 0 ad14 ONLINE 0 0 0 errors: No known data errors
Tulemus..
# zpool status pool: home state: ONLINE scrub: resilver completed after 4h22m with 0 errors on Tue Jun 21 22:36:16 2011 config:
NAME STATE READ WRITE CKSUM home ONLINE 0 0 0 raidz1 ONLINE 0 0 0 ad10 ONLINE 0 0 0 571G resilvered ad8 ONLINE 0 0 0 ad10 ONLINE 0 0 0 ad12 ONLINE 0 0 0 ad14 ONLINE 0 0 0
Kui vead on parandatud võib vanade vigade näitamise lõpetada selle ajaloo kustutamisega andes käsu
# zpool clear
Zfz-stats
FreeBSD puhul tarvis paigaldada port
- /usr/ports/sysutils/zfs-stats
Kasutamine
# zfs-stats -E ------------------------------------------------------------------------ ZFS Subsystem Report Tue Oct 4 10:36:07 2011 ------------------------------------------------------------------------ ARC Efficiency: 9.12m Cache Hit Ratio: 92.66% 8.45m Cache Miss Ratio: 7.34% 669.64k Actual Hit Ratio: 92.66% 8.45m Data Demand Efficiency: 42.92% 332.24k CACHE HITS BY CACHE LIST: Most Recently Used: 37.01% 3.13m Most Frequently Used: 62.99% 5.33m Most Recently Used Ghost: 0.32% 26.84k Most Frequently Used Ghost: 1.43% 121.08k CACHE HITS BY DATA TYPE: Demand Data: 1.69% 142.60k Prefetch Data: 0.00% 0 Demand Metadata: 98.31% 8.31m Prefetch Metadata: 0.00% 0 CACHE MISSES BY DATA TYPE: Demand Data: 28.32% 189.63k Prefetch Data: 0.00% 0 Demand Metadata: 71.68% 480.00k Prefetch Metadata: 0.00% 5 ------------------------------------------------------------------------
GeomWatch
Before starting geomWatch, you should edit its configuration file, /usr/local/etc/geomWatch.conf. Then, add the following line to /etc/rc.conf:
geomwatch_enable="YES"
Finally, to start it, run the following command:
# /usr/local/etc/rc.d/geomWatch start
You can also test your SMTP configuration by running the following command:
# /usr/local/sbin/geomWatch -t
cat /usr/local/etc/geomWatch.conf.
zpool="array4" interval="30" # seconds to sleep between checks senderName="ZFS Watch" # name portion of "From" message header, optional #senderAddress="geomwatch@some.domain" # SMTP envelope sender and address portion of "From" smtpServer="localhost:25" # address and port of SMTP server smtpAuth="0" # 1 to enable SMTP authentication
Lingid
- http://en.wikipedia.org/wiki/Nested_RAID_levels Raidi kombineerimiste näited
- http://zfs-fuse.net/ ZFS linuxile üle fuse
- http://www.wizy.org/wiki/ZFS_on_FUSE ZFS ja Fuse õpetused
http://zfsonlinux.org/example-zvol.html zfs linuxil