Jump to content
pyth0n3

[Unix/Solaris] ZFS (Zettabyte Filesystem)

Recommended Posts

Posted

Download white paper :

wget http://sprunge.us/JgZi -O zfs_by_example.txt

In 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 discs

ZFS 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 destul

de 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 acelasi

rand 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 fisiere

In 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.10

in 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 -> 1GB

c1d1s4 -> 1GB

Voi folosi 2 servere separate

Hostname pyth0n3 Debian 6 -> pentru a testa integritatea datelor

Hostname eclipse Solaris 10 -> pentru a crea un zfs

Sintaxa pentru a crea un zpool este urmatoarea

zpool nume_pool disk1 disk2 diskX

Se poate crea spre exemplu un zpool mirror cu urmatoarea sintaxa

zpool nume_pool mirror disk1 disk2 mirror disk3 disk4

Spre 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 c1d1s3

O 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_pool
Filesystem size used avail capacity Mounted on
eclipse_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 automat

stocarea oricarui tip de fisier in /eclipse_pool.

[eclipse]# zpool status -v eclipse_pool                                      
pool: eclipse_pool
state: ONLINE
scrub: none requested
config:

NAME STATE READ WRITE CKSUM
eclipse_pool ONLINE 0 0 0
c1d1s3 ONLINE 0 0 0

errors: 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 list
NAME SIZE ALLOC FREE CAP HEALTH ALTROOT
eclipse_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 c1d1s4

eclipse_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 ALTROOT
eclipse_pool 1.98G 134K 1.98G 0% ONLINE -
[eclipse]#
[eclipse]# df -h eclipse_pool
Filesystem size used avail capacity Mounted on
eclipse_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 requested
config:

NAME STATE READ WRITE CKSUM
eclipse_pool ONLINE 0 0 0
c1d1s3 ONLINE 0 0 0
c1d1s4 ONLINE 0 0 0

errors: 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_pool

Un zpool list va demonstra faptul ca nu exista


[eclipse]# zpool list
no 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 precedente

c1d1s3 -> 1GB

c1d1s4 -> 1GB

Pentru a crea un mirror din 2 dispozitive se poate folosi urmatoarea sintaxa:

zpool create eclipse_mirrorpool mirror c1d1s3 c1d1s4

Ca 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 requested
config:

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 0

errors: 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 mirroring


Filesystem size used avail capacity Mounted on
eclipse_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 atasate

pentru a distruge datele.


[eclipse]# pwd
/eclipse_mirrorpool
[eclipse]# mkfile 30M sensitive_data.txt
[eclipse]# df -h .
Filesystem size used avail capacity Mounted on
eclipse_mirrorpool 984M 16M 968M 2% /eclipse_mirrorpool
[eclipse]# ls -ltrh
total 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 sha256
75c91b29d5522c8a97c779e50bc33f11e07ed37b2baa31c8c727016e92915c1d sensitive_data.txt
[pyth0n3@mc]$ date
Thu Mar 8 08:25:05 CET 2012
[pyth0n3@mc]$
[pyth0n3@mc]$

O metoda simpla pentru a distruge dispozitive este dd


[eclipse]# date
Thu Mar 8 08:25:58 CET 2012
[eclipse]# dd if=/dev/urandom of=/dev/dsk/c1d1s3 bs=512 count=1024
1024+0 records in
1024+0 records out
[eclipse]#
[eclipse]# zpool status -v eclipse_mirrorpool
pool: eclipse_mirrorpool
state: ONLINE
scrub: none requested
config:

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 0

errors: No known data errors
[eclipse]#

Chiar daca dispozitivul c1d1s3 a fost distrus , zpool status nu arata nici un fel de problema .


[pyth0n3@mc]$ date
Thu 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 corupt

La inceputul acestui articol am spus ca in zfs sistemele de fisiere pot fi create intro ierarhie

Momentan am creat un pool eclipse_mirrorpool care poate gazdui alte sisteme de fisiere

Pentru a crea un alt filesystem in eclipse_mirrorpool spre exemplu un filesystem chemat home se poate folosi urmatoaree sintaxa

zfs create eclipse_mirrorpool/home

Presupunem ca in /home vrem sa facem un alt sistm de fisiere chemat /testing

zfs create eclipse_mirrorpool/home/testing

In 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 list
NAME USED AVAIL REFER MOUNTPOINT
eclipse_mirrorpool 30.2M 954M 30.0M /eclipse_mirrorpool
eclipse_mirrorpool/home 42K 954M 21K /eclipse_mirrorpool/home
eclipse_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 disponibil

si 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 doar

50Mb din spatiul tolal iar sistemul de fisiere home va trebui sa foloseasca doar 200Mb.Ei bine aceasta limita poate

fi imposa de catre o cota.

Un lucru important de observat este faptul ca toate sistemele de fisiere create au acelasi spatiu disponibil

si 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 doar

50Mb din spatiul tolal iar sistemul de fisiere home va trebui sa foloseasca doar 200Mb.Ei bine aceasta limita poate

fi imposa de catre o cota.

Un lucru important de observat este faptul ca toate sistemele de fisiere create au acelasi spatiu disponibil

si 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 doar

50Mb din spatiul tolal iar sistemul de fisiere home va trebui sa foloseasca doar 200Mb.Ei bine aceasta limita poate

fi imposa de catre o cota.

Vom aloca doar 200 de Mb pentru home

zfs set quota=200M eclipse_mirrorpool/home

Vom aloca doar 50 de MB pentru testing

zfs set quota=50M eclipse_mirrorpool/home/testing

Pentru 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 SOURCE
eclipse_mirrorpool quota none default
eclipse_mirrorpool/home quota 200M local
eclipse_mirrorpool/home/testing quota 50M local
[eclipse]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
eclipse_mirrorpool 30.2M 954M 30.0M /eclipse_mirrorpool
eclipse_mirrorpool/home 43K 200M 22K /eclipse_mirrorpool/home
eclipse_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 list
NAME USED AVAIL REFER MOUNTPOINT
eclipse_mirrorpool 30.2M 954M 30.0M /eclipse_mirrorpool
eclipse_mirrorpool/home 43K 200M 22K /eclipse_mirrorpool/home
eclipse_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_mirrorpool
eclipse_mirrorpool/home
200M 23K 200M 1% /eclipse_mirrorpool/home
eclipse_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 fisiere

spatiul 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@testingsnapshot1

Un 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_testingsnapshot1

Folosind zfs list se pot vedea toate modificarile facute pana in prezen

[eclipse]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
eclipse_mirrorpool 60.3M 924M 30.0M /eclipse_mirrorpool
eclipse_mirrorpool/home 30.1M 170M 24K /eclipse_mirrorpool/home
eclipse_mirrorpool/home/clone_testingsnapshot1 0 170M 30.0M /eclipse_mirrorpool/home/clone_testingsnapshot1
eclipse_mirrorpool/home/testing2 30.0M 20.0M 21K /eclipse_mirrorpool/home/testing2
eclipse_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 impreuna

zfs destroy -R -f eclipse_mirrorpool/home/testing2@testingsnapshot1

Aceasta sintaxa va distrude un snapshot impreuna cu un clone care ii apartine

[eclipse]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
eclipse_mirrorpool 30.2M 954M 30.0M /eclipse_mirrorpool
eclipse_mirrorpool/home 44K 200M 23K /eclipse_mirrorpool/home
eclipse_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 fisiere

sunteti rugati sa cititi manualul http://docs.oracle.com/cd/E19253-01/819-5461/index.html

Daca aveti intrebari in legatura cu subiectul nu ezitati sa le faceti

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...