pyth0n3 Posted March 8, 2012 Report Posted March 8, 2012 Download white paper :wget http://sprunge.us/JgZi -O zfs_by_example.txtIn acest articol voi discuta despre ZFS (Zettabyte File System).Zettabyte este o unitate de masura si poate fi reprezentata in urmatorul fel:1 Zettabyte = 1,180,591,620,717,411,303,424 (270) bytes, 1,024 Exabytes, 983,826,350,597,842,752 pages of plaintext (1,200 characters) 4,919,131,752,989,213 books (200 pages or 240,000 characters) 375,299,968,947,541 digital pictures (with 3MB average file size) 281,474,976,710,656 MP3 audio files (with 4MB average file size) 1,732,153,702,834 650MB CD’s 251,030,052,003 4.38GB DVD’s 43,980,465,111 25GB Blu-ray discsZFS este un filesystem open source care a fost svilupat de catre Sun MicrosystemVine distribuit sub licenta Common Development and Distribution License, si exista un porting pt Linux.Pentru cei interesati (ZFS on Linux).Un feature esential a acestui filesystem ar fi "data integrity".Poate preveni ca datele sa fie corupte, voi face si o minima demonstratie in unul din exemple unde voi incerca sa corup o parte din date.Acepta fisiere de dimensiuni destulde mari (16 exabytes) si o limita de 256 zettabytes pentru dimensiunea total? a sistemului de fi?iere.Inainte de a crea cateva exemple voi ilustra diferenta intre modul in care vin contruite diverse sisteme de fisiere si zfs.Sistemul de fisiere zfs vine construit intrun recipient chemat zpool .Un zpool vine construit din dispozitive virtuale care in acelasirand sunt construite din dispozitive de block ,acestea pot fi partitii de hard disk sau drive-uri intregi.Un sistem de fisiere de obicei poate fi creat intrun dispozitiv unic (hard disk) si necesita un volume manager pentru a utiliza mai mult de un dispozitiv.Un exemplu poate ilustra acest lucru:-------------------------- -------------------------- - - - -- filesystem1 - - filesystem2 -- - - --------------------------- -------------------------- - - - -____________-____________ ____________-_____________ _ _ __ logical volume1 _ _ logical volume2 __ _ _ __________________________ _________________________ | |######### | ######### ######### | ########## # # # # # # ## disk # # disk # # disk # # disk ## # # # # # # ########## ######### ######### #########Deobicei in majoritatea cazurilor unde vine folosit un volume manager aceasta este structura pe baza careia vine creat un sistem de fisiereIn schimb zfs contruieste sistemul de fisiere intrun singur recipient chemat zpool , in acelasi timp sistemele de fisiere pot fi structurate intro ierarhie.Exemplu zpool: ------------- - - -filesystem - - 6 - ------------- - - ------------- ------------- - - - - -filesystem - -filesystem - - 4 - - 5 - ------------- ------------- - - - - ------------- ------------- ------------- - - - - - - -filesystem - -filesystem - -filesystem - - 1 - - 2 - - 3 - ------------- ------------- ------------- - - - ____________-_______________-_______________-_____________ __ ZPOOL __ __________________________________________________________ | | | | | |######### ######### ######### ########## # # # # # # ## disk1 # # disk2 # # disk3 # # diskX ## # # # # # # ########## ######### ######### #########Diferenta dintre voume manager este ca in zfs se poate crea un singur zpool in care pot fi atasate toate partitiile sau drive-uri intregi si sistemele de fisiere pot avea o ierarhie .Un sistem de fisiere poate avea in internul lui alte sisteme de fisiere.Spatiul acestor sisteme de fisiere poate fi delimitat , fiecare poate avea o anumita cota (dimensiune), vom vedea pe parcurs cum pot fi alocate aceste dimensiuni.Exemplele urmatoare sunt facute intrun sistem Unix SunOS 5.10in exemple voi folosi 2 partitii separate (slice) , aceeasi sintaxa ramane valabila pentru drive-uri separate Voi crea un zpool care va gazdui diverse sisteme de fisiere folosind doua slice, evindent pe parcurs se poat adauga alte partitii sau discuri in mod dinamic Sistemele de fisiere create nu necesita unmount, si nu trebuie creata nici un fel de directiva in /etc/vfstab , o data creat fiecare sistem de fisiere va fi montat in mod automat iar in momentul in care se vor adauga discuri noi , spatiul va fi modificat in mod dinamic.Pentru test voi folosi urmatoarele (slice):c1d1s3 -> 1GBc1d1s4 -> 1GBVoi folosi 2 servere separate Hostname pyth0n3 Debian 6 -> pentru a testa integritatea datelorHostname eclipse Solaris 10 -> pentru a crea un zfsSintaxa pentru a crea un zpool este urmatoareazpool nume_pool disk1 disk2 diskX Se poate crea spre exemplu un zpool mirror cu urmatoarea sintaxa zpool nume_pool mirror disk1 disk2 mirror disk3 disk4Spre exemplu un zpool mirror creat din doua disck-uri de 2GB va avea 1GB de spatiu deoarece unul din disk-uri va fi folosit pentru mirroring.Se poate crea spre exemplu un zpool folosind un singur disk sau o singura partitie a unui disk.Exemplu:zpool create eclipse_pool c1d1s3O data ce aceasta sintaxa a fost rulata s-au intamplat urmatoarele:A fost creat un zpool eclipse_zpool, si a fost montat in mod automat ,mount sau df poate demonstra acest lucru[eclipse]# mount................/eclipse_pool on eclipse_pool read/write/setuid/devices/nonbmand/exec/xattr/atime/dev=2d5000e on Thu Mar 8 06:58:32 2012[eclipse]#[eclipse]# df -h eclipse_poolFilesystem size used avail capacity Mounted oneclipse_pool 984M 21K 984M 1% /eclipse_pool[eclipse]# Un zpool vine montat in mod automat dupa ce a fost construit si poate fi direct folosit ca sistem de fisiere ,acest lucru permite in mod automatstocarea oricarui tip de fisier in /eclipse_pool.[eclipse]# zpool status -v eclipse_pool pool: eclipse_pool state: ONLINE scrub: none requestedconfig: NAME STATE READ WRITE CKSUM eclipse_pool ONLINE 0 0 0 c1d1s3 ONLINE 0 0 0errors: No known data errors[eclipse]# zpool status arata daca acest sistem de fisiere nu prezinta errori, numarul disk-urilor sau a prtitiilor care fac parte si daca este pregatit pentru a putea fi folosit .Un status online va demonstra ca sistemul de fisiere este deja pus la dispozitie si poate fi folosit.Un alt tip de optiune care poate aduce informatii in legatura cu un pool care a fost creat este zpool list[eclipse]# zpool listNAME SIZE ALLOC FREE CAP HEALTH ALTROOTeclipse_pool 1016M 76.5K 1016M 0% ONLINE -[eclipse]# Pentru a extinde spatiul e destul de simplu, pot fi atasate alte discuri sau partitii iar spatiul va fi extins in mod dinamic.zpool add eclipse_pool c1d1s4eclipse_pool a fost extins in mod automat iar un zpool list sau df poate demonstra acest lucru [eclipse]# zpool list NAME SIZE ALLOC FREE CAP HEALTH ALTROOTeclipse_pool 1.98G 134K 1.98G 0% ONLINE -[eclipse]# [eclipse]# df -h eclipse_poolFilesystem size used avail capacity Mounted oneclipse_pool 2.0G 21K 2.0G 1% /eclipse_pool[eclipse]# A fost atasat un alt slice de 1Gb , momentan sistemul de fisiere are 2 GB de spatiu.zpool status va demonstra faptul ca a fost atasat un alt dispozitiv[eclipse]# zpool status -v eclipse_pool pool: eclipse_pool state: ONLINE scrub: none requestedconfig: NAME STATE READ WRITE CKSUM eclipse_pool ONLINE 0 0 0 c1d1s3 ONLINE 0 0 0 c1d1s4 ONLINE 0 0 0errors: No known data errors[eclipse]# In acest mod pot fi atasate diverse alte dispozitive marind sistemul de fisiere in mod dinamic.Un pool poate fi distrus intrun mod foarte simplu si rapid de aceea sintaxele comenzilor ar trebui rulate cu multa atentie.Pentru a distruge tot ce a fost contruit pana in prezent se poate folosi urmatoarea sintaxa.zpool destroy eclipse_poolUn zpool list va demonstra faptul ca nu exista [eclipse]# zpool listno pools available[eclipse]# In exemplele urmatoare voi crea un pool mirror , necesita un minim de doua dispozitive.Voi folosi aceleasi slice care au fost folosite in exemplele precedentec1d1s3 -> 1GBc1d1s4 -> 1GBPentru a crea un mirror din 2 dispozitive se poate folosi urmatoarea sintaxa:zpool create eclipse_mirrorpool mirror c1d1s3 c1d1s4Ca si in exemplu precedent acesta pool va fi montat in mod automat [eclipse]# zpool status -v eclipse_mirrorpool pool: eclipse_mirrorpool state: ONLINE scrub: none requestedconfig: NAME STATE READ WRITE CKSUM eclipse_mirrorpool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 c1d1s3 ONLINE 0 0 0 c1d1s4 ONLINE 0 0 0errors: No known data errors[eclipse]# In schimb acest pool nu va mai avea 2Gb ci jumatate din spatiul alocat deoarece cealalta jumatate va fi folosita pentru mirroringFilesystem size used avail capacity Mounted oneclipse_mirrorpool 984M 21K 984M 1% /eclipse_mirrorpool[eclipse]# Cum am precizat dimensiunea este 984M aproximativ un GB , jumatate din spatiul celor doua slice alocate.Acest sistem de fisiere poate fi populat cu date , iar in urmatoarele exemple voi incerca sa corup unul din dispozitivele atasatepentru a distruge datele.[eclipse]# pwd/eclipse_mirrorpool[eclipse]# mkfile 30M sensitive_data.txt [eclipse]# df -h .Filesystem size used avail capacity Mounted oneclipse_mirrorpool 984M 16M 968M 2% /eclipse_mirrorpool[eclipse]# ls -ltrhtotal 57875-rw------T 1 root root 30M Mar 8 08:14 sensitive_data.txt[eclipse]# Voi copia acest file pe un alt sistem extern pentru a crea un test de integritate [pyth0n3@mc]$ uname -a Linux mc 2.6.32-5-686 #1 SMP Wed Jan 11 12:29:30 UTC 2012 i686 GNU/Linux[pyth0n3@mc]$ scp eclipse:/eclipse_mirrorpool/sensitive_data.txt sensitive_da>sensitive_data.txt 100% 30MB 1.8MB/s 00:17 [pyth0n3@mc]$ /usr/bin/shasum -a 256 sensitive_data.txt > sha256.data.sum[pyth0n3@mc]$ cat sha25675c91b29d5522c8a97c779e50bc33f11e07ed37b2baa31c8c727016e92915c1d sensitive_data.txt[pyth0n3@mc]$ dateThu Mar 8 08:25:05 CET 2012[pyth0n3@mc]$ [pyth0n3@mc]$ O metoda simpla pentru a distruge dispozitive este dd[eclipse]# dateThu Mar 8 08:25:58 CET 2012[eclipse]# dd if=/dev/urandom of=/dev/dsk/c1d1s3 bs=512 count=10241024+0 records in1024+0 records out[eclipse]#[eclipse]# zpool status -v eclipse_mirrorpool pool: eclipse_mirrorpool state: ONLINE scrub: none requestedconfig: NAME STATE READ WRITE CKSUM eclipse_mirrorpool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 c1d1s3 ONLINE 0 0 0 c1d1s4 ONLINE 0 0 0errors: No known data errors[eclipse]#Chiar daca dispozitivul c1d1s3 a fost distrus , zpool status nu arata nici un fel de problema .[pyth0n3@mc]$ dateThu Mar 8 08:27:25 CET 2012[pyth0n3@mc]$ scp eclipse:/eclipse_mirrorpool/sensitive_data.txt sensitive_da>sensitive_data.txt 100% 30MB 2.3MB/s 00:13 [pyth0n3@mc]$ /usr/bin/shasum -c sha256.data.sum sensitive_data.txt: OK[pyth0n3@mc]$ O copie a aceluiasi fisier nu prezinta nici un fel de probleme,testul de integritate arata ca fisierul nu a fost coruptLa inceputul acestui articol am spus ca in zfs sistemele de fisiere pot fi create intro ierarhieMomentan am creat un pool eclipse_mirrorpool care poate gazdui alte sisteme de fisierePentru a crea un alt filesystem in eclipse_mirrorpool spre exemplu un filesystem chemat home se poate folosi urmatoaree sintaxa zfs create eclipse_mirrorpool/homePresupunem ca in /home vrem sa facem un alt sistm de fisiere chemat /testing zfs create eclipse_mirrorpool/home/testingIn momentul in care comenizile vin rulate cu success nu prezinta un output, iar pentru a controla ceea ce a fost creat folosind sintaxele precedente se poate folosi zfs list [eclipse]# zfs listNAME USED AVAIL REFER MOUNTPOINTeclipse_mirrorpool 30.2M 954M 30.0M /eclipse_mirrorpooleclipse_mirrorpool/home 42K 954M 21K /eclipse_mirrorpool/homeeclipse_mirrorpool/home/testing 21K 954M 21K /eclipse_mirrorpool/home/testing[eclipse]# Note:Un lucru important de observat este faptul ca toate sistemele de fisiere create au acelasi spatiu disponibilsi anume 954M.Asta ar insemna ca fiecare poate folosi acest spatiu dar in momentul in care unul din ele va umple acest spatiu celelalte nu il vor putea folosi.Presupunem ca sistemul de fisiere testing ar trebui sa foloseasca doar50Mb din spatiul tolal iar sistemul de fisiere home va trebui sa foloseasca doar 200Mb.Ei bine aceasta limita poatefi imposa de catre o cota.Un lucru important de observat este faptul ca toate sistemele de fisiere create au acelasi spatiu disponibilsi anume 954M.Asta ar insemna ca fiecare poate folosi acest spatiu dar in momentul in care unul din ele va umple acest spatiu celelalte nu il vor putea folosi.Presupunem ca sistemul de fisiere testing ar trebui sa foloseasca doar50Mb din spatiul tolal iar sistemul de fisiere home va trebui sa foloseasca doar 200Mb.Ei bine aceasta limita poatefi imposa de catre o cota.Un lucru important de observat este faptul ca toate sistemele de fisiere create au acelasi spatiu disponibilsi anume 954M.Asta ar insemna ca fiecare poate folosi acest spatiu dar in momentul in care unul din ele va umple acest spatiu celelalte nu il vor putea folosi.Presupunem ca sistemul de fisiere testing ar trebui sa foloseasca doar50Mb din spatiul tolal iar sistemul de fisiere home va trebui sa foloseasca doar 200Mb.Ei bine aceasta limita poatefi imposa de catre o cota.Vom aloca doar 200 de Mb pentru homezfs set quota=200M eclipse_mirrorpool/homeVom aloca doar 50 de MB pentru testing zfs set quota=50M eclipse_mirrorpool/home/testingPentru a observa ceea ce a fost setat pana acum in legatura cu limita sistemelor de fisiere se poate folosi urmatoarea sintaxa[eclipse]# zfs get -r quota eclipse_mirrorpool NAME PROPERTY VALUE SOURCEeclipse_mirrorpool quota none defaulteclipse_mirrorpool/home quota 200M localeclipse_mirrorpool/home/testing quota 50M local[eclipse]# zfs list NAME USED AVAIL REFER MOUNTPOINTeclipse_mirrorpool 30.2M 954M 30.0M /eclipse_mirrorpooleclipse_mirrorpool/home 43K 200M 22K /eclipse_mirrorpool/homeeclipse_mirrorpool/home/testing 21K 50.0M 21K /eclipse_mirrorpool/home/testing[eclipse]# Acum fiecare filesystem poate fi folosit pana in momentul in care spatiul stabilit de catre quota se va umple.Note:Un alt lucru pe care zfs il permite este schimbarea numelui oricarui din sistemele de fisiere create[eclipse]# zfs rename eclipse_mirrorpool/home/testing eclipse_mirrorpool/home/testing2[eclipse]# zfs listNAME USED AVAIL REFER MOUNTPOINTeclipse_mirrorpool 30.2M 954M 30.0M /eclipse_mirrorpooleclipse_mirrorpool/home 43K 200M 22K /eclipse_mirrorpool/homeeclipse_mirrorpool/home/testing2 21K 50.0M 21K /eclipse_mirrorpool/home/testing2[eclipse]# Se poate observa cum fiecare filesystem vine montat separat in mod automat de catre zfs , df sau mount poate demonstra acest lucru eclipse_mirrorpool 984M 30M 954M 4% /eclipse_mirrorpooleclipse_mirrorpool/home 200M 23K 200M 1% /eclipse_mirrorpool/homeeclipse_mirrorpool/home/testing2 50M 21K 50M 1% /eclipse_mirrorpool/home/testing2[eclipse]# mount........../eclipse_mirrorpool on eclipse_mirrorpool read/write/setuid/devices/nonbmand/exec/xattr/atime/dev=2d5000f on Thu Mar 8 07:33:29 2012/eclipse_mirrorpool/home on eclipse_mirrorpool/home read/write/setuid/devices/nonbmand/exec/xattr/atime/dev=2d50010 on Thu Mar 8 08:37:17 2012/eclipse_mirrorpool/home/testing2 on eclipse_mirrorpool/home/testing2 read/write..........Un alt lucru important pe care zfs il are este posibilitatea de a crea un snapshot(o fotografie a unui sistem de fisiere la un anumit timp )sau un clone (un clone este de fapt un link simbolic catre un snapshot dar permite sa fie montat si se poate scrie in filesystem, in schimp un snaphot e readonly) Note:Daca spre exemplu sistemul de fisiere are 1Gb de spatiu si vine creat un fisier de 512Mb vor mai ramane liberi 512 Mb in acel filesystem (Acest lucru e logic).Daca in acest moment vine creat un snapshot n acest sistem de fisierespatiul disponibil al filesystem-ului va fi tot 512Mb , nu vine preluat spatiu suplimentar.Dar in momentul in care fisierul care ocupa deja 512Mb va fi eliminat si va fi creat un alt fisier in aceeasi instanta de 700Mb , snapshot-ul va ocupa aceeasi 512Mb + 700Mb care au fost creati.Deci chiar daca fisierele au fost eliminate si au fost create alte fisiere snapshot-ul va exista si va ocupa acelasi spatiu.Bineinteles daca se va crea un fisier de 700Mb vor mai ramane liberi 300Mb chiar daca un snapshot ocupa deja 512Mb deoarece zfs face o copie inainte de orice operatie de scriere.Pentru a crea un snapshot a sistemului de fisiere creat in precedenta , spre exemplu testing2 se va folosi urmatoarea sintaxa zfs snapshot eclipse_mirrorpool/home/testing2@testingsnapshot1 Snapshot-ul se va gasi in sistemul de fisiere eclipse_mirrorpool/home/testing2 sun urmatorul path /eclipse_mirrorpool/home/testing2/.zfs/snapshot (fiecare snapshot va fi readonly)Note:Un ls -a nu va arata directorul .zfs Pentru a face un restore a unui snapshot se poate executa urmatoarea sintaxa:zfs rollback eclipse_mirrorpool/home/testing2@testingsnapshot1Un snapshot poate fi clonat , cu permisii read/write si montat in oricare alt filesystem Exemplu , vom clona snapshot-ul creat eclipse_mirrorpool/home/testing2@testingsnapshot1 in eclipse_mirrorpool/home zfs clone eclipse_mirrorpool/home/testing2@testingsnapshot1 eclipse_mirrorpool/home/clone_testingsnapshot1Folosind zfs list se pot vedea toate modificarile facute pana in prezen[eclipse]# zfs listNAME USED AVAIL REFER MOUNTPOINTeclipse_mirrorpool 60.3M 924M 30.0M /eclipse_mirrorpooleclipse_mirrorpool/home 30.1M 170M 24K /eclipse_mirrorpool/homeeclipse_mirrorpool/home/clone_testingsnapshot1 0 170M 30.0M /eclipse_mirrorpool/home/clone_testingsnapshot1eclipse_mirrorpool/home/testing2 30.0M 20.0M 21K /eclipse_mirrorpool/home/testing2eclipse_mirrorpool/home/testing2@testingsnapshot1 30.0M - 30.0M -Note:Un snapshot nu poate fi eliminat atata timp cat un clone exista, pot fi eliminate dar impreunazfs destroy -R -f eclipse_mirrorpool/home/testing2@testingsnapshot1Aceasta sintaxa va distrude un snapshot impreuna cu un clone care ii apartine[eclipse]# zfs listNAME USED AVAIL REFER MOUNTPOINTeclipse_mirrorpool 30.2M 954M 30.0M /eclipse_mirrorpooleclipse_mirrorpool/home 44K 200M 23K /eclipse_mirrorpool/homeeclipse_mirrorpool/home/testing2 21K 50.0M 21K /eclipse_mirrorpool/home/testing2[eclipse]#Acest articul a ilustrat doar cateva aspecte ZFS , pentru a intelege mai bine cum funtioneaza acest sistem de fisieresunteti rugati sa cititi manualul http://docs.oracle.com/cd/E19253-01/819-5461/index.htmlDaca aveti intrebari in legatura cu subiectul nu ezitati sa le faceti Quote