ZFS-FUSE

A Unix/Linux szerverek üzemeltetése wikiből
(Változatok közti eltérés)
a (link a ZFS oldalra)
 
(egy szerkesztő 45 közbeeső változata nincs mutatva)
1. sor: 1. sor:
 
Írta: Szabó Tamás Zoltán<br>
 
Írta: Szabó Tamás Zoltán<br>
 
2010. december 8.<br><br>
 
2010. december 8.<br><br>
Ez az oldal a ZFS fájlrendszert és a Linux FUSE alrendszeren való használatát mutatja be.
+
Ez az oldal a [[ZFS]] fájlrendszert és a Linux FUSE alrendszeren való használatát mutatja be.
   
   
 
== Története ==
 
== Története ==
   
A ZFS-t a Sun Microsystems fejlesztette ki saját Solaris rendszerére, amelynek tervezésénél az addigi fájlrendszerek problémáit próbálták kiküszöbölni egy funkciókban gazdag, új felépítésű fájlrendszerrel. Először 2005-ben jelent meg a Sun OpenSolaris nevű operációs rendszerében. Elnevezése eredetileg a Zettabyte File System rövidítése, ami a lehetséges méretére vonatkozik, ugyanis 2<sup>64</sup> byte méretű lehet egy fájlrendszer maximális mérete, és a legtöbb fájlrendszerhez köthető méretkorlát legalább zettabyte nagyságendű, ami jelenleg a gyakorlatban korlátlan méretet jelent.<br>
+
A ZFS-t a Sun Microsystems fejlesztette ki saját Solaris rendszerére, amelynek tervezésénél az addigi fájlrendszerek problémáit próbálták kiküszöbölni egy funkciókban gazdag, új felépítésű fájlrendszerrel. Először 2005-ben jelent meg a Sun OpenSolaris nevű operációs rendszerében. Elnevezése eredetileg a Zettabyte File System rövidítése, ami a lehetséges méretére vonatkozik, ugyanis 2<sup>64</sup> byte méretű lehet egy fájlrendszer maximális mérete, és a legtöbb fájlrendszerhez köthető méretkorlát legalább zettabyte nagyságrendű, ami jelenleg a gyakorlatban korlátlan méretet jelent.<br>
 
2010-ben az Oracle megvásárolta a Sun Microsystems-et, ezzel – egyéb Sun termékek mellett – a Solaris is az Oracle tulajdonába került.
 
2010-ben az Oracle megvásárolta a Sun Microsystems-et, ezzel – egyéb Sun termékek mellett – a Solaris is az Oracle tulajdonába került.
   
A ZFS fejlődése során folyamatosan bővül, ezért a fejlődés lépcsőihez inkrementális verziószámot rendelnek (zpool version). Ezek közül a fontosabbak verziószámok szerint:
+
A ZFS fejlődése során folyamatosan bővül, ezért a fejlődés lépcsőihez inkrementális verziószámot rendelnek. Külön kap verziószámot a [[ZFS-FUSE#Storage_pool|pool]] és a fájlrendszer.<br>
*1: adatstruktúrák definiálása
+
A fájlrendszer verziója jelenleg 5-nél tart, míg a poolé 31-nél. A pool fejlődésének lépcsői verziószámok szerint az alábbiak:
*2: metaadat-replikáció
+
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/1 adatstruktúrák definiálása]
*3: melegtartalék, dupla paritású RAID-Z (RAID-Z2)
+
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/2 metaadat-replikáció]
*4: zpool history
+
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/3 melegtartalék, dupla paritású RAID-Z (RAID-Z2)]
*5: röptömörítés a gzip algoritmusával
+
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/4 zpool history]: eltárolja minden poolhoz a rajta végzett adminisztrációs műveleteket, például létrehozás, eszköz hozzáadása.
*6: bootfs pool
+
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/5 röptömörítés a gzip algoritmusával]
*9: CIFS szerver támogatás, fejlettebb kvótarendszer
+
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/6 bootfs pool attribútum]: megadható a poolon belül az elsődleges boot fájlrendszer
*10: cache device támogatása: operatív memória és diszk-rendszer közé vezet be további cache-réteget
+
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/7 ZFS Intent Log (ZIL)]
*11: zpool scrub / resilver teljesítmény növelés
+
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/8 a fájlrendszer adminisztrációjának joga root jogosultsággal nem rendelkező felhasználóknak is delegálható]
*12: snapshot
+
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/9 kvóta rendszer bővítése]: beállítható, hogy a helyfoglalási kvótába beletartozzanak-e a leszármazott fájlrendszerek (snapshotok és klónok)
*17: tripla paritású RAID-Z (RAID-Z3)
+
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/10 cache device támogatása]: operatív memória és diszk-rendszer közé vezet be további cache-réteget
*19: ZFS log device eltávolítás
+
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/11 hibakeresés és újraszinkronizálás teljesítményének javítása]
*20: röptömörítés a zle algoritmusával
+
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/12 snapshot attribútumok támogatása]
*21: blokkszintű deduplikáció
+
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/13 új, helyfoglalással kapcsolatos fájlrendszer attribútumok hozzáadása (usedby* attribútumok)]
*22: zfs receive
+
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/14 az aclinherit attribútum passthrough-x értékkel bővítése]: ez az attribútum a jogosultságok öröklését szabályozza újonnan létrehozott könyvtár vagy fájl esetén
*23: slim ZFS intent log (ZIL)
+
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/15 felhasználóra és csoportra megadható, helyfoglalásra vonatkozó attribútumok hozzáadása(userused, userquota, groupused, groupquota)]
*26: snapshot törlés gyorsítás
+
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/16 Csak egy javítást tartalmaz], amely Comstar SCSI vezérlőkkel való használat esetén okozott gondot
*27: snapshot létrehozás gyorsítás
+
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/17 tripla paritású RAID-Z (RAID-Z3)]
*28: multiple virtual device replacement
+
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/18 zfs hold parancs bevezetése]: segítségével a felhasználó explicit módon változtathatja egy snapshot referenciaszámlálóját.
*29: RAID-Z/mirror hybrid allocator
+
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/19 Csak javítást tartalmaz log vdev eltávolítása kapcsán felmerülő problémákra]
*30: titkosítás
+
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/20 röptömörítés a zle algoritmusával]
+
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/21 blokkszintű deduplikáció támogatása]
A legutolsó verzió (2010. december): 31
+
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/22 zfs send és receive]: segítségével egy fájlrendszer replikálható vagy snapshot készíthető róla egy másik poolban, mint amihez a fájlrendszer tartozik.
  +
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/23 ZIL-el kapcsolatos módosítások]
  +
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/24 rendszerattribútumok támogatása]
  +
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/25 hibakereséssel és újraszinkronizálással kapcsolatos statisztikák fejlesztése]
  +
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/26 snapshot törlésének gyorsítása]
  +
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/27 snapshot létrehozásának gyorsítása]
  +
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/28 több virtuális eszköz egyidejű cseréjének támogatása]
  +
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/29 RAID-Z teljesítményének növelése]
  +
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/30 titkosítás támogatása]
  +
# [http://hub.opensolaris.org/bin/view/Community+Group+zfs/31 fájlrendszerek listázásának gyorsítása]
   
 
== Tulajdonságai ==
 
== Tulajdonságai ==
   
 
=== Adatintegritás===
 
=== Adatintegritás===
Minden blokk integritását egy ellenőrző kóddal védi a fájlrendszer, amelyet a blokkra mutató pointer mellé tárol el. Az ellenőrző kód [https://unixlinux.tmit.bme.hu/ZFS-FUSE#ZFS_adminisztr.C3.A1ci.C3.B3 beállítástól] függően lehet 32 bites vagy 256 bites.
+
Minden blokk integritását egy [http://hu.wikipedia.org/wiki/Ellen%C5%91rz%C5%91%C3%B6sszeg ellenőrzőösszeggel] (angolul checksum) védi a fájlrendszer, amelyet a blokkra mutató pointer mellé tárol el. A checksum [[ZFS-FUSE#ZFS_adminisztr.C3.A1ci.C3.B3|beállítástól]] függően lehet 32 bites vagy 256 bites.
 
Bár a diszkek hibajavító kódolást használnak, előfordulhatnak a diszken kívül átviteli hibák, amik hatására a beolvasott adat megsérül. Ennek valószínűsége nagy, kritikus adatmennyiséget kezelő rendszereknél már nem elhanyagolható.
 
Bár a diszkek hibajavító kódolást használnak, előfordulhatnak a diszken kívül átviteli hibák, amik hatására a beolvasott adat megsérül. Ennek valószínűsége nagy, kritikus adatmennyiséget kezelő rendszereknél már nem elhanyagolható.
   
=== 128 bites fájlrendszer ===
 
Gyakorlatilag korlátlan: legtöbb méretkorlát legalább 2<sup>48</sup> nagyságú.
 
   
 
=== Storage pool ===
 
=== Storage pool ===
50. sor: 48. sor:
 
*Összetett, redundanciát biztosító vdev-ek: RAID-Z tömb, mirror.
 
*Összetett, redundanciát biztosító vdev-ek: RAID-Z tömb, mirror.
 
Egy összetett vdev több egyszerű vdevből építhető fel. <br>
 
Egy összetett vdev több egyszerű vdevből építhető fel. <br>
Egy vagy több virtuális eszközből pool építhető, egy poolon több ZFS is létrehozható. Egy fájlrendszer fájlok csoportját jelenti a poolon (dataset), ennek köszönhetően egy fájlrendszer méretét nem kell előre megadni.
+
Egy vagy több virtuális eszközből pool építhető, egy poolon több ZFS is létrehozható. Egy fájlrendszer fájlok csoportját jelenti a poolon, ennek köszönhetően egy fájlrendszer méretét nem kell előre megadni. Egy ilyen fájlrendszert neveznek még dataset-nek is.
   
 
[[Fájl:zfs_pool.gif]]
 
[[Fájl:zfs_pool.gif]]
   
 
=== Hotspare ===
 
=== Hotspare ===
Poolokhoz melegtartalék rendelhető, amely egy diszk meghibásodása esetén átveszi a hibás diszk helyét.
+
Poolokhoz melegtartalék ([http://en.wikipedia.org/wiki/Hot_spare hot spare]) rendelhető, amely egy diszk meghibásodása esetén átveszi a hibás diszk helyét.
   
 
=== Copy-on-write tranzakciókezelés ===
 
=== Copy-on-write tranzakciókezelés ===
64. sor: 62. sor:
 
*új blokkot foglal le, ebbe írja a módosított adatot
 
*új blokkot foglal le, ebbe írja a módosított adatot
 
*minden, az eredeti blokkra közvetlenül vagy indirekten hivatkozó metaadat-blokkokból olyan új példányokat hoz létre, ami a módosított adatot tartalmazó blokkra mutat
 
*minden, az eredeti blokkra közvetlenül vagy indirekten hivatkozó metaadat-blokkokból olyan új példányokat hoz létre, ami a módosított adatot tartalmazó blokkra mutat
*frissíti a superblock-ot (uberblock) is, ez atomi művelet
+
*frissíti a superblock-ot (ezt itt uberblock-nak is nevezik) is, ez atomi művelet
   
 
Mivel az utolsó művelet atomi, ezért a superblock mindig egy konzisztens struktúrára mutat.<br>
 
Mivel az utolsó művelet atomi, ezért a superblock mindig egy konzisztens struktúrára mutat.<br>
Az overhead csökkentése érdekében a szinkron írásokhoz úgynevezett szándéknaplót (ZFS Intent Log, röviden ZIL) és tranzakciócsoportokat [http://www.solarisinternals.com/wiki/index.php/ZFS_Performance#Parallel_Three_phase_transaction_groups] használ.<br>
+
Az overhead csökkentése érdekében a szinkron írásokhoz úgynevezett szándéknaplót (ZFS Intent Log, röviden ZIL) és [http://www.solarisinternals.com/wiki/index.php/ZFS_Performance#Parallel_Three_phase_transaction_groups tranzakciócsoportokat] használ.<br>
 
Intent log esetén az adatot először naplóba írja, majd a tranzakciócsoport kiírásakor írja ki a helyére.<br>
 
Intent log esetén az adatot először naplóba írja, majd a tranzakciócsoport kiírásakor írja ki a helyére.<br>
Háromféle tranzakciócsoportot használ:
+
Három tranzakciócsoportot használ:
 
*open: aktív tranzakciók csoportja, ezek végezhetnek írás műveleteket
 
*open: aktív tranzakciók csoportja, ezek végezhetnek írás műveleteket
 
*quiescing: azok a tranzakciók, amelyek már nem végeznek írás műveletet, de a módosításaik még nincsenek a diszkre kiírva
 
*quiescing: azok a tranzakciók, amelyek már nem végeznek írás műveletet, de a módosításaik még nincsenek a diszkre kiírva
*syncing: ebben a csoportban írja ki a módosításokat a diszkre
+
*syncing: ebbe a csoportba kerülnek azok a tranzakciók, amelyek módosításainak a kiírása folyamatban van.
 
   
 
=== Snapshot ===
 
=== Snapshot ===
A copy-on-write mechanizmust használja ki, vagyis hogy a fájlrendszer módosításnál mindíg új blokkba írja a módosított tartalmat. Snapshot esetén a régi adatokat tartalmazó blokkot nem szabadítja fel, hanem snapshotként jelöli meg, ez a felszabadításnál olcsóbb művelet is, mint snapshot nélkül.
+
A copy-on-write mechanizmust használja ki, vagyis hogy a fájlrendszer módosításnál mindig új blokkba írja a módosított tartalmat. Snapshot esetén a régi adatokat tartalmazó blokkot nem szabadítja fel, hanem snapshotként jelöli meg, ez a felszabadításnál általában olcsóbb művelet, mint snapshot nélkül.
   
 
=== Clone ===
 
=== Clone ===
Fájlrendszer klónozása. Klónozni csak egy fájlrendszer snapshotjából lehet. Lérehozásakor mindkét fájlrendszer ugyanazokat a blokkokat használja. Ha valamelyikben módosítás történik, akkor ahhoz copy-on-write mechanizmus segítségével új blokk jön létre a módosított fájlrendszerhez, a régi blokkot megtartja.
+
Fájlrendszer klónozása. Klónozni csak egy fájlrendszer snapshotjából lehet. Létrehozásakor mindkét fájlrendszer ugyanazokat a blokkokat használja. Ha valamelyikben módosítás történik, akkor ahhoz copy-on-write mechanizmus segítségével új blokk jön létre a módosított fájlrendszerhez, a régi blokkot megtartja.
   
 
=== Automatikus csíkozás ===
 
=== Automatikus csíkozás ===
A poolban lévő eszközöket RAID-0-szerűen csíkozza. Új diszk esetén a csíkozás automatikus kiterjed rá, a copy-on-write mechanizmus segítségével az írások során egyenletesen lesz szétosztva az adat a diszkek közt.
+
A poolban lévő eszközöket [http://hu.wikipedia.org/wiki/RAID#RAID_0_.28.C3.B6sszef.C5.B1z.C3.A9s.29 RAID-0]-szerűen csíkozza. Új diszk esetén a csíkozás automatikusan kiterjed rá, a copy-on-write mechanizmus segítségével az írások során egyenletesen osztja szét az adatokat a diszkek között.
   
 
=== Változó blokkméret ===
 
=== Változó blokkméret ===
A blokkméretet automatikusan változtatja 512 byte és 128 kbyte között, az optimális értéket a terhelés alapján próbálja kiszámítani [http://www.sun.com/bigadmin/features/articles/zfs_part1.scalable.jsp#performance]. Tömörítés esetén a legkisebb blokkméretet használja, amibe az eredeti blokk tömörített formája belefér.<br>
+
A [http://www.sun.com/bigadmin/features/articles/zfs_part1.scalable.jsp#performance blokkméretet automatikusan változtatja] 512 byte és 128 kbyte között, az optimális értéket a terhelés alapján próbálja kiszámítani. Tömörítés esetén a legkisebb blokkméretet használja, amibe az eredeti blokk tömörített formája belefér.<br>
Extenteket nem használ, mert nagy méretük nem ideális copy-on-write és ellenőrző összegek használatára.
+
Extenteket nem használ, mert nagy méretük nem ideális copy-on-write és checksum használatára.
   
 
=== Adaptív bájtsorrend ===
 
=== Adaptív bájtsorrend ===
Az adatokat mindíg natív bytesorrendben írja ki, mellé jelzi, hogy little-endian vagy big-endian a bájtsorrend. Olvasáskor ha az adott architektúra más sorrendet használ, akkor a beolvasott adatot átalakítja a saját formátumára.
+
Az adatokat mindig natív [http://en.wikipedia.org/wiki/Endianness bájtsorrendben] írja ki, mellé jelzi, hogy az little-endian vagy big-endian. Olvasáskor ha az adott architektúra más sorrendet használ, akkor a beolvasott adatot átalakítja a saját formátumára.
   
 
=== Deduplikáció ===
 
=== Deduplikáció ===
A blokk ellenőrző összeg felhasználásánál íráskor képes detektálni az azonos tartalmú blokkokat a blokkokhoz tartozó ellenőrző összegekből felépített adatbázis alapján.
+
A blokk checksum felhasználásánál íráskor képes detektálni az azonos tartalmú blokkokat a blokkokhoz tartozó checksumokból felépített adatbázis alapján.
   
 
=== Live data scrubbing ===
 
=== Live data scrubbing ===
97. sor: 95. sor:
   
 
=== RAID-Z ===
 
=== RAID-Z ===
A RAID5-höz hasonlóan csíkozott paritást használ, de a RAID-5 megoldásával ellentétben az írás -- pl. tápvesztés miatti -- félbeszakadása a ZFS-nél nem vezet inkonzisztenicához. A Sun ajánlása alapján legfeljebb kilenc diszket ajánlott egy RAID-Z konfigurációban használni, ha ennél többet szeretnénk, akkor érdemes kisebb RAID-Z csoportokra felosztani ezeket. Lehet dupla (RAID-Z2) és tripla (RAID-Z3) paritású konfigurációt is választani. Előbbi a RAID-6-hoz hasonló, két hiba javítására, utóbbi három hiba javítására képes.
+
A [http://hu.wikipedia.org/wiki/RAID#RAID_5 RAID5]-höz hasonlóan csíkozott paritást használ, de a RAID-5 megoldásával ellentétben az írás -- pl. tápvesztés miatti -- félbeszakadása a ZFS-nél nem vezet inkonzisztenciához. A Sun ajánlása alapján legfeljebb kilenc diszket ajánlott egy RAID-Z konfigurációban használni, ha ennél többet szeretnénk, akkor érdemes kisebb RAID-Z csoportokra felosztani ezeket. Lehet dupla (RAID-Z2) és tripla (RAID-Z3) paritású konfigurációt is választani. Előbbi a [http://hu.wikipedia.org/wiki/RAID#RAID_6 RAID-6]-hoz hasonló, két hiba javítására, utóbbi három hiba javítására képes.
   
 
=== Transzparens titkosítás ===
 
=== Transzparens titkosítás ===
Aránylag új a ZFS-ben, a ZFS/FUSE megvalósítás nem támogatja. <br>Fájlrendszerenként állítható, swap és dump is titkosítható [[#ZFS Volume]] használatával. Boot fájlrendszeren nem használható.
+
Aránylag új a ZFS-ben, a ZFS/FUSE megvalósítás nem támogatja. <br>Fájlrendszerenként állítható, swap és dump is titkosítható [[ZFS-FUSE#ZFS_Volume|ZFS Volume]] használatával. Boot fájlrendszeren nem használható.
   
 
=== Transzparens tömörítés ===
 
=== Transzparens tömörítés ===
110. sor: 108. sor:
   
 
=== Egyéb tulajdonságok ===
 
=== Egyéb tulajdonságok ===
*Posix és NFSv4 ACL modellek támogatása
+
*128 bites fájlrendszer: Gyakorlatilag korlátlan, a legtöbb méretkorlát legalább 2<sup>48</sup> nagyságú.
*A poolok egyszerűen mozgathatóak gépek között exportálással és importálással [[#Pool importálás és exportálás]]
+
*[http://wiki.linux-nfs.org/wiki/index.php/ACLs#ACL_models Posix és NFSv4 ACL modellek] támogatása
*Intelligens prefetch [http://www.solarisinternals.com/wiki/index.php/ZFS_Performance#Intelligent_prefetch]: például stream szolgáltatás esetén hasznos
+
*A poolok egyszerűen mozgathatóak gépek között [[ZFS-FUSE#Pool importálás és exportálás|exportálással és importálással]]
*I/O pipeline[http://hub.opensolaris.org/bin/view/Community+Group+zfs/source/]: Az adatok a diszk és a fájlrendszer drivere közt egy pipelineon (úgynevezett ZIO-n) haladnak át. Ez a műveleteket csővezetékbe szervezi, ezzel próbálja növelni a párhuzamosíthatóságot. Ilyen műveletek például az ellenőrző kód számítása és a tömörítés.
+
*[http://www.solarisinternals.com/wiki/index.php/ZFS_Performance#Intelligent_prefetch Intelligens prefetch]: például stream szolgáltatás esetén hasznos
  +
*Pipeline I/O: A logikai kötetkezelő legalsó rétege. Minden, a diszkre kiírt vagy beolvasott adat ezen a csővezetéken halad át(ez az úgynevezett [http://hub.opensolaris.org/bin/view/Community+Group+zfs/source/ ZIO]). Ez a műveleteket csővezetékbe szervezi, ezzel próbálja növelni a párhuzamosíthatóságot. Ilyen műveletek például a checksum számítása és a tömörítés.
 
*Dinamikus metaadat-allokáció
 
*Dinamikus metaadat-allokáció
 
*[http://www.solarisinternals.com/wiki/index.php/ZFS_Performance#Explicit_IO_priority_with_deadline_scheduling Prioritásos belső I/O ütemező]
 
*[http://www.solarisinternals.com/wiki/index.php/ZFS_Performance#Explicit_IO_priority_with_deadline_scheduling Prioritásos belső I/O ütemező]
163. sor: 161. sor:
 
zpool create pool1 /dev/sda2 /dev/sda3
 
zpool create pool1 /dev/sda2 /dev/sda3
   
Itt lérehoztuk a pool1 nevű ZFS pool-t a /dev/sda2 és /dev/sda3 blokkeszközökre.
+
Itt létrehoztuk a pool1 nevű ZFS pool-t a /dev/sda2 és /dev/sda3 blokkeszközökre.
 
Ekkor létrejön a pool és csatolódik a /pool1 alá:
 
Ekkor létrejön a pool és csatolódik a /pool1 alá:
 
root@home:~# mount
 
root@home:~# mount
175. sor: 173. sor:
 
'''RAID-Z''' konfiguráció létrehozása:
 
'''RAID-Z''' konfiguráció létrehozása:
 
zpool create <pool név> raidz <vdev lista>
 
zpool create <pool név> raidz <vdev lista>
Itt a raidz az egyszeres paritást jelenti. Lehet ezen kívül raidz2 és raidz3 (a megfelelő fájlrendszer-verziók esetén), ez dupla, illetve tripla paritást jelent. Előbbihez legalább három, utobbihoz legalább négy eszköz szükséges.
+
Itt a raidz az egyszeres paritást jelenti. Lehet ezen kívül raidz2 és raidz3 (a megfelelő fájlrendszer-verziók esetén), ez dupla, illetve tripla paritást jelent. Előbbihez legalább három, utóbbihoz legalább négy eszköz szükséges.<br>
  +
A vdev-eknek azonos méretűeknek kell lenniük. Ha nem azok, akkor az -f kapcsoló megadásával hozható létre a pool. Ebben az esetben minden vdev-en csak akkora helyet használ fel, ami a legkisebb vdev mérete. Létező raidz konfiguráció esetén nem adható hozzá és nem távolítható el eszköz utólag (csak cserélhető spare eszközre).
   
 
Példa dupla paritású RAID-Z építése /dev/sd[abc]1 eszközökre
 
Példa dupla paritású RAID-Z építése /dev/sd[abc]1 eszközökre
 
zpool create pool1 raidz2 /dev/sda1 /dev/sdb1 /dev/sdc1
 
zpool create pool1 raidz2 /dev/sda1 /dev/sdb1 /dev/sdc1
  +
   
 
'''Tükrözés''' használata (mint RAID-1):
 
'''Tükrözés''' használata (mint RAID-1):
 
zpool create <pool név> mirror <vdev lista>
 
zpool create <pool név> mirror <vdev lista>
  +
Itt a vdev-eknek azonos méretűeknek kell lenniük. Ha nem azok, akkor az -f kapcsoló megadásával hozható létre a pool. Ebben az esetben a mirror mérete a legkisebb vdev mérete lesz.<br><br>
  +
Lehetőség van egy létrehozott pool virtuális eszközéhez utólag mirrort rendelni a következő módon:
  +
zpool attach <pool neve> <tükrözendő vdev a poolban> <új mirror vdev>
  +
Itt ha a tükrözendő vdev nincs raid-z vagy mirror konfigurációban, akkor létrejön egy új mirror a parancsban megadott két eszközből. Ha a tükrözendő vdev már egy mirrornak a része, akkor ehhez a mirrorhoz fogja hozzáadni a vdev-et. A tükrözendő vdev nem lehet része raid-z konfigurációnak.
  +
Példa:
  +
Létrehozunk egy pool1 nevű egyszerű poolt a /zfs/vdev1.dat fájlból:
  +
root@home:~# zpool create pool1 /zfs/vdev1.dat
  +
  +
root@home:~# zpool status
  +
pool: pool1
  +
state: ONLINE
  +
scrub: none requested
  +
config:
  +
  +
NAME STATE READ WRITE CKSUM
  +
pool1 ONLINE 0 0 0
  +
/zfs/vdev1.dat ONLINE 0 0 0
  +
  +
errors: No known data errors
  +
  +
Ezután hozzáadunk egy tükröt, ami a /zfs/vdev2.dat fájl lesz:
  +
root@home:~# zpool attach pool1 /zfs/vdev1.dat /zfs/vdev2.dat
  +
  +
root@home:~# zpool status
  +
pool: pool1
  +
state: ONLINE
  +
scrub: resilver completed after 0h0m with 0 errors on Fri Dec 17 01:55:22 2010
  +
config:
  +
  +
NAME STATE READ WRITE CKSUM
  +
pool1 ONLINE 0 0 0
  +
mirror-0 ONLINE 0 0 0
  +
/zfs/vdev1.dat ONLINE 0 0 0
  +
/zfs/vdev2.dat ONLINE 0 0 0 75K resilvered
  +
  +
  +
errors: No known data errors
  +
  +
A status kimenetében jól látható, hogy létrejött egy mirror és újraszinkronizálta azt.
  +
  +
Ezután hozzáadunk egy új eszközt a tükörhöz a következő paranccsal:
  +
root@home:~# zpool attach pool1 /zfs/vdev1.dat /zfs/vdev3.dat
  +
  +
root@home:~# zpool status
  +
pool: pool1
  +
state: ONLINE
  +
scrub: resilver completed after 0h0m with 0 errors on Fri Dec 17 02:01:25 2010
  +
config:
  +
  +
NAME STATE READ WRITE CKSUM
  +
pool1 ONLINE 0 0 0
  +
mirror-0 ONLINE 0 0 0
  +
/zfs/vdev1.dat ONLINE 0 0 0
  +
/zfs/vdev2.dat ONLINE 0 0 0
  +
/zfs/vdev3.dat ONLINE 0 0 0 84K resilvered
  +
  +
errors: No known data errors
  +
   
 
'''Melegtartalék''' használata a poolban:
 
'''Melegtartalék''' használata a poolban:
233. sor: 290. sor:
 
==== Scrub indítása ====
 
==== Scrub indítása ====
 
zpool scrub <pool név>
 
zpool scrub <pool név>
Ez elindít egy hibakeresést a megadott nevű poolon. A hibakeresés eredménye a zpool status parancssal kérdezhető le.
+
Ez elindít egy hibakeresést a megadott nevű poolon. A hibakeresés eredménye a zpool status paranccsal kérdezhető le.
   
 
Az első paranccsal kereshetőek a megadott könyvtárban poolok, a másodikban egy pool exportálható. Exportálás után a pool mozgathatóvá válik, nem használható és nem látható a zpool-al importálásig. Csak olyan poolt lehet exportálni, amin nincs mountolt fájlrendszer. A -D kapcsolóval törölt (destroyed) pool is importálható. Az -a kapcsolóval egyidejűleg keres és importálja a megtalált poolokat.
 
Az első paranccsal kereshetőek a megadott könyvtárban poolok, a másodikban egy pool exportálható. Exportálás után a pool mozgathatóvá válik, nem használható és nem látható a zpool-al importálásig. Csak olyan poolt lehet exportálni, amin nincs mountolt fájlrendszer. A -D kapcsolóval törölt (destroyed) pool is importálható. Az -a kapcsolóval egyidejűleg keres és importálja a megtalált poolokat.
279. sor: 336. sor:
 
zfs umount <pool név>/<fájlrendszer név>
 
zfs umount <pool név>/<fájlrendszer név>
 
 
'''Fájlrendszer-attribútumok beállítása és lekérdezése''':
+
'''Fájlrendszer-attribútumok beállítása és lekérdezése''':<br>
 
Egy fájlrendszerhez számos attribútum tartozik, például tömörítsen-e.
 
Egy fájlrendszerhez számos attribútum tartozik, például tömörítsen-e.
   
300. sor: 357. sor:
 
**Csak olvasható mód: readonly = on | off
 
**Csak olvasható mód: readonly = on | off
 
**Tömörítés: compression = on | off | lzjb | gzip | gzip-[1-9] | zle
 
**Tömörítés: compression = on | off | lzjb | gzip | gzip-[1-9] | zle
**Másolatok számának beállítása: copies = [1-3] . Ebben az esetben a fájlrendszert több másolatban tárolja, ha lehetséges, akkor külön eszközön.
+
**Másolatok számának beállítása: copies = [1-3] <br> Ebben az esetben az adatokat több másolatban tárolja, ha lehetséges, akkor külön eszközön. Ez nem azonos a pool szintű mirror-al, mert itt nem garantált több eszköz esetén sem az, hogy ugyanazon adat replikái különböző eszközökre kerülnek. Ezen kívül ha mirrorba különböző méretű eszközöket teszünk, akkor a nagyobb eszközökön kihasználatlan hely marad, míg Copies esetén minden eszközt teljesen ki lehet használni. Különbség továbbá az, hogy ez a tulajdonság online módon változtatható és csak az újonnan kiírt adatokra vonatkozik, ezért előállhat olyan eset, hogy különböző adatok különböző számú másolatban tárolódnak egy fájlrendszeren belül.
**Deduplikáció: dedup = on, off
+
**Deduplikáció: dedup = on | off
 
**Hozzáférési idő használata: atime = on | off
 
**Hozzáférési idő használata: atime = on | off
**Adatintegritás-ellenőrzés: checksum = on | off | fletcher2 | fletcher4 | sha256 . Ezt nem ajánlott kikapcsolni, alapértelmezetten be van kapcsolva, fletcher4 algoritmus az alapértelmezett.
+
**Adatintegritás-ellenőrzés: checksum = on | off | fletcher2 | fletcher4 | sha256 <br> Ezt nem ajánlott kikapcsolni, alapértelmezetten be van kapcsolva, fletcher4 algoritmus az alapértelmezett.
 
**Végrehajtás engedélyezése a fájlrendszeren: exec = on | off
 
**Végrehajtás engedélyezése a fájlrendszeren: exec = on | off
 
**Fájlrendszerméret-korlátozás: quota = <méret> | none
 
**Fájlrendszerméret-korlátozás: quota = <méret> | none
311. sor: 368. sor:
 
*Létrehozás után nem módosítható attribútumok:
 
*Létrehozás után nem módosítható attribútumok:
 
**fájlnév case sensitivity: casesensitivity = sensitive | insensitive | mixed
 
**fájlnév case sensitivity: casesensitivity = sensitive | insensitive | mixed
**Unicode fájlnevek [http://en.wikipedia.org/wiki/Unicode_equivalence#Normalization normalizálásának] algoritmusa: normalization = none | formC | formD | formKC | formKD . Ha engedélyezzük, akkor a fájlneveken végzett össszehasonlító műveletek esetén a fájlneveket unicode kódolásúnak értelmezi és ezek normalizált alakjait hasonlítja össze. Kikapcsolása esetén összehasonlításnál nem értelmezi kódolás szerint a fájlneveket.
+
**Unicode fájlnevek [http://en.wikipedia.org/wiki/Unicode_equivalence#Normalization normalizálásának] algoritmusa: normalization = none | formC | formD | formKC | formKD <br> Ha engedélyezzük, akkor a fájlneveken végzett összehasonlító műveletek esetén a fájlneveket unicode kódolásúnak értelmezi és ezek normalizált alakjait hasonlítja össze. Kikapcsolása esetén összehasonlításnál nem értelmezi kódolás szerint a fájlneveket.
**Csak UTF-8 karakterek engedélyezése: utf8only = on | off . Ha be van kapcsolva, akkor visszautasít olyan fájlneveket, ami az UTF-8 karakterkészletében nem szereplő karaktert tartalmaz. Kikapcsolása esetén nem értelmezi a fájlneveket.
+
**Csak UTF-8 karakterek engedélyezése: utf8only = on | off <br> Ha be van kapcsolva, akkor visszautasít olyan fájlneveket, ami az UTF-8 karakterkészletében nem szereplő karaktert tartalmaz. Kikapcsolása esetén nem értelmezi a fájlneveket.
   
 
'''Snapshotok''':
 
'''Snapshotok''':
351. sor: 408. sor:
 
=== ZFS Volume ===
 
=== ZFS Volume ===
   
Egy poolhoz nem csak fájlrendszer, hanem kötet is hozzárendelhető, amelyet blokkeszközként érhetünk el. Ez a funkció a 0.6.9-es verziójú ZFS/FUSE-ban még nincs megvalósítva!
+
Egy poolon nem csak fájlrendszer, hanem [http://dlc.sun.com/osol/docs/content/ZFSADMIN/gaypf.html ZFS kötet] is létrehozható, amelyet blokkeszközként érhetünk el. Ez a funkció a 0.6.9-es verziójú ZFS/FUSE-ban még nincs megvalósítva.
   
 
Létrehozás:
 
Létrehozás:
357. sor: 414. sor:
 
Ekkor létrejön a kötet a /dev/zvol könyvtárban.
 
Ekkor létrejön a kötet a /dev/zvol könyvtárban.
   
== Források ==
+
== Irodalomjegyzék ==
   
http://hub.opensolaris.org<br>
+
[http://en.wikipedia.org/wiki/ZFS Angol Wikipédia cikk]<br>
http://zfs-fuse.net<br>
+
[http://zfs-fuse.net ZFS/FUSE projekt weboldala]<br>
http://www.sun.com
+
http://www.sun.com/bigadmin/features/articles/zfs_part1.scalable.jsp<br>
  +
http://hub.opensolaris.org/bin/view/Community+Group+zfs/source<br>
  +
http://blogs.sun.com/roch/entry/the_new_zfs_write_throttle<br>
  +
http://www.solarisinternals.com/wiki/index.php/ZFS_Performance<br>
  +
http://www.solarisinternals.com/wiki/index.php/ZFS_Best_Practices_Guide<br>
  +
http://hub.opensolaris.org/bin/view/Community+Group+zfs/1<br>
  +
http://docs.sun.com/app/docs/doc/819-5461/gcvjg?a=view<br>

A lap jelenlegi, 2015. február 3., 09:40-kori változata

Írta: Szabó Tamás Zoltán
2010. december 8.

Ez az oldal a ZFS fájlrendszert és a Linux FUSE alrendszeren való használatát mutatja be.


Tartalomjegyzék

[szerkesztés] 1 Története

A ZFS-t a Sun Microsystems fejlesztette ki saját Solaris rendszerére, amelynek tervezésénél az addigi fájlrendszerek problémáit próbálták kiküszöbölni egy funkciókban gazdag, új felépítésű fájlrendszerrel. Először 2005-ben jelent meg a Sun OpenSolaris nevű operációs rendszerében. Elnevezése eredetileg a Zettabyte File System rövidítése, ami a lehetséges méretére vonatkozik, ugyanis 264 byte méretű lehet egy fájlrendszer maximális mérete, és a legtöbb fájlrendszerhez köthető méretkorlát legalább zettabyte nagyságrendű, ami jelenleg a gyakorlatban korlátlan méretet jelent.
2010-ben az Oracle megvásárolta a Sun Microsystems-et, ezzel – egyéb Sun termékek mellett – a Solaris is az Oracle tulajdonába került.

A ZFS fejlődése során folyamatosan bővül, ezért a fejlődés lépcsőihez inkrementális verziószámot rendelnek. Külön kap verziószámot a pool és a fájlrendszer.
A fájlrendszer verziója jelenleg 5-nél tart, míg a poolé 31-nél. A pool fejlődésének lépcsői verziószámok szerint az alábbiak:

  1. adatstruktúrák definiálása
  2. metaadat-replikáció
  3. melegtartalék, dupla paritású RAID-Z (RAID-Z2)
  4. zpool history: eltárolja minden poolhoz a rajta végzett adminisztrációs műveleteket, például létrehozás, eszköz hozzáadása.
  5. röptömörítés a gzip algoritmusával
  6. bootfs pool attribútum: megadható a poolon belül az elsődleges boot fájlrendszer
  7. ZFS Intent Log (ZIL)
  8. a fájlrendszer adminisztrációjának joga root jogosultsággal nem rendelkező felhasználóknak is delegálható
  9. kvóta rendszer bővítése: beállítható, hogy a helyfoglalási kvótába beletartozzanak-e a leszármazott fájlrendszerek (snapshotok és klónok)
  10. cache device támogatása: operatív memória és diszk-rendszer közé vezet be további cache-réteget
  11. hibakeresés és újraszinkronizálás teljesítményének javítása
  12. snapshot attribútumok támogatása
  13. új, helyfoglalással kapcsolatos fájlrendszer attribútumok hozzáadása (usedby* attribútumok)
  14. az aclinherit attribútum passthrough-x értékkel bővítése: ez az attribútum a jogosultságok öröklését szabályozza újonnan létrehozott könyvtár vagy fájl esetén
  15. felhasználóra és csoportra megadható, helyfoglalásra vonatkozó attribútumok hozzáadása(userused, userquota, groupused, groupquota)
  16. Csak egy javítást tartalmaz, amely Comstar SCSI vezérlőkkel való használat esetén okozott gondot
  17. tripla paritású RAID-Z (RAID-Z3)
  18. zfs hold parancs bevezetése: segítségével a felhasználó explicit módon változtathatja egy snapshot referenciaszámlálóját.
  19. Csak javítást tartalmaz log vdev eltávolítása kapcsán felmerülő problémákra
  20. röptömörítés a zle algoritmusával
  21. blokkszintű deduplikáció támogatása
  22. zfs send és receive: segítségével egy fájlrendszer replikálható vagy snapshot készíthető róla egy másik poolban, mint amihez a fájlrendszer tartozik.
  23. ZIL-el kapcsolatos módosítások
  24. rendszerattribútumok támogatása
  25. hibakereséssel és újraszinkronizálással kapcsolatos statisztikák fejlesztése
  26. snapshot törlésének gyorsítása
  27. snapshot létrehozásának gyorsítása
  28. több virtuális eszköz egyidejű cseréjének támogatása
  29. RAID-Z teljesítményének növelése
  30. titkosítás támogatása
  31. fájlrendszerek listázásának gyorsítása

[szerkesztés] 2 Tulajdonságai

[szerkesztés] 2.1 Adatintegritás

Minden blokk integritását egy ellenőrzőösszeggel (angolul checksum) védi a fájlrendszer, amelyet a blokkra mutató pointer mellé tárol el. A checksum beállítástól függően lehet 32 bites vagy 256 bites. Bár a diszkek hibajavító kódolást használnak, előfordulhatnak a diszken kívül átviteli hibák, amik hatására a beolvasott adat megsérül. Ennek valószínűsége nagy, kritikus adatmennyiséget kezelő rendszereknél már nem elhanyagolható.


[szerkesztés] 2.2 Storage pool

A ZFS architektúrája eltér a hagyományos fájlrendszerekétől, ugyanis egy logikai kötetkezelőt is tartalmaz.
A fájlrendszer virtuális eszközöket definiál (virtual device, röviden vdev). A vdev-eket két fő csoportra lehet osztani:

  • Egyszerű vdev: Blokkeszközök, reguláris fájlok
  • Összetett, redundanciát biztosító vdev-ek: RAID-Z tömb, mirror.

Egy összetett vdev több egyszerű vdevből építhető fel.
Egy vagy több virtuális eszközből pool építhető, egy poolon több ZFS is létrehozható. Egy fájlrendszer fájlok csoportját jelenti a poolon, ennek köszönhetően egy fájlrendszer méretét nem kell előre megadni. Egy ilyen fájlrendszert neveznek még dataset-nek is.

Fájl:zfs pool.gif

[szerkesztés] 2.3 Hotspare

Poolokhoz melegtartalék (hot spare) rendelhető, amely egy diszk meghibásodása esetén átveszi a hibás diszk helyét.

[szerkesztés] 2.4 Copy-on-write tranzakciókezelés

Egy blokkot a fájlrendszer nem helyben módosít, hanem a következő módszerrel:

Fájl:zfs cow.jpg

  • új blokkot foglal le, ebbe írja a módosított adatot
  • minden, az eredeti blokkra közvetlenül vagy indirekten hivatkozó metaadat-blokkokból olyan új példányokat hoz létre, ami a módosított adatot tartalmazó blokkra mutat
  • frissíti a superblock-ot (ezt itt uberblock-nak is nevezik) is, ez atomi művelet

Mivel az utolsó művelet atomi, ezért a superblock mindig egy konzisztens struktúrára mutat.
Az overhead csökkentése érdekében a szinkron írásokhoz úgynevezett szándéknaplót (ZFS Intent Log, röviden ZIL) és tranzakciócsoportokat használ.
Intent log esetén az adatot először naplóba írja, majd a tranzakciócsoport kiírásakor írja ki a helyére.
Három tranzakciócsoportot használ:

  • open: aktív tranzakciók csoportja, ezek végezhetnek írás műveleteket
  • quiescing: azok a tranzakciók, amelyek már nem végeznek írás műveletet, de a módosításaik még nincsenek a diszkre kiírva
  • syncing: ebbe a csoportba kerülnek azok a tranzakciók, amelyek módosításainak a kiírása folyamatban van.

[szerkesztés] 2.5 Snapshot

A copy-on-write mechanizmust használja ki, vagyis hogy a fájlrendszer módosításnál mindig új blokkba írja a módosított tartalmat. Snapshot esetén a régi adatokat tartalmazó blokkot nem szabadítja fel, hanem snapshotként jelöli meg, ez a felszabadításnál általában olcsóbb művelet, mint snapshot nélkül.

[szerkesztés] 2.6 Clone

Fájlrendszer klónozása. Klónozni csak egy fájlrendszer snapshotjából lehet. Létrehozásakor mindkét fájlrendszer ugyanazokat a blokkokat használja. Ha valamelyikben módosítás történik, akkor ahhoz copy-on-write mechanizmus segítségével új blokk jön létre a módosított fájlrendszerhez, a régi blokkot megtartja.

[szerkesztés] 2.7 Automatikus csíkozás

A poolban lévő eszközöket RAID-0-szerűen csíkozza. Új diszk esetén a csíkozás automatikusan kiterjed rá, a copy-on-write mechanizmus segítségével az írások során egyenletesen osztja szét az adatokat a diszkek között.

[szerkesztés] 2.8 Változó blokkméret

A blokkméretet automatikusan változtatja 512 byte és 128 kbyte között, az optimális értéket a terhelés alapján próbálja kiszámítani. Tömörítés esetén a legkisebb blokkméretet használja, amibe az eredeti blokk tömörített formája belefér.
Extenteket nem használ, mert nagy méretük nem ideális copy-on-write és checksum használatára.

[szerkesztés] 2.9 Adaptív bájtsorrend

Az adatokat mindig natív bájtsorrendben írja ki, mellé jelzi, hogy az little-endian vagy big-endian. Olvasáskor ha az adott architektúra más sorrendet használ, akkor a beolvasott adatot átalakítja a saját formátumára.

[szerkesztés] 2.10 Deduplikáció

A blokk checksum felhasználásánál íráskor képes detektálni az azonos tartalmú blokkokat a blokkokhoz tartozó checksumokból felépített adatbázis alapján.

[szerkesztés] 2.11 Live data scrubbing

Időnként automatikusan vagy manuálisan elindul egy adatellenőrzés a poolon. Ha hibát talál, akkor kijavítja automatikusan, ha lehetséges.

[szerkesztés] 2.12 RAID-Z

A RAID5-höz hasonlóan csíkozott paritást használ, de a RAID-5 megoldásával ellentétben az írás -- pl. tápvesztés miatti -- félbeszakadása a ZFS-nél nem vezet inkonzisztenciához. A Sun ajánlása alapján legfeljebb kilenc diszket ajánlott egy RAID-Z konfigurációban használni, ha ennél többet szeretnénk, akkor érdemes kisebb RAID-Z csoportokra felosztani ezeket. Lehet dupla (RAID-Z2) és tripla (RAID-Z3) paritású konfigurációt is választani. Előbbi a RAID-6-hoz hasonló, két hiba javítására, utóbbi három hiba javítására képes.

[szerkesztés] 2.13 Transzparens titkosítás

Aránylag új a ZFS-ben, a ZFS/FUSE megvalósítás nem támogatja.
Fájlrendszerenként állítható, swap és dump is titkosítható ZFS Volume használatával. Boot fájlrendszeren nem használható.

[szerkesztés] 2.14 Transzparens tömörítés

LZJB, GZIP és ZLE tömörítési eljárásokat támogat. A tömörítés használat közben be- és kikapcsolható, a változtatás csak az újonnan kiírt adatokat érinti.


[szerkesztés] 2.15 Adaptive Replacement Cache

Újabb gyorsítótár-kezelés, ami az elterjedt LRU-nál (Least Recently Used) jobban teljesít.

[szerkesztés] 2.16 Egyéb tulajdonságok

  • 128 bites fájlrendszer: Gyakorlatilag korlátlan, a legtöbb méretkorlát legalább 248 nagyságú.
  • Posix és NFSv4 ACL modellek támogatása
  • A poolok egyszerűen mozgathatóak gépek között exportálással és importálással
  • Intelligens prefetch: például stream szolgáltatás esetén hasznos
  • Pipeline I/O: A logikai kötetkezelő legalsó rétege. Minden, a diszkre kiírt vagy beolvasott adat ezen a csővezetéken halad át(ez az úgynevezett ZIO). Ez a műveleteket csővezetékbe szervezi, ezzel próbálja növelni a párhuzamosíthatóságot. Ilyen műveletek például a checksum számítása és a tömörítés.
  • Dinamikus metaadat-allokáció
  • Prioritásos belső I/O ütemező
  • Minden metaadatot legalább két példányban tárol. Ez írásnál overheadet okoz, de egyrészt javítja a megbízhatóságot, másrészt olvasásnál növelheti is a teljesítményt.
  • Nincs töredezettség-mentesítő eszköz hozzá, pedig copy-on-write használata miatt sok írásnál töredezetté válhat a fájlrendszer.

[szerkesztés] 3 Operációs rendszerek

A ZFS elsődleges platformja a Sun saját operációs rendszere, a Solaris/OpenSolaris.
Mivel nyílt forráskódú, ezért további rendszerekbe is bekerült:
FreeBSD 8.0 óta támogatja a zpool v13-at, a 8.1 a v14-et. A NetBSD ZFS port fejlesztés alatt áll. A Linux kernelbe hivatalosan az eredeti kód nem kerülhet bele, mivel a ZFS kódja CDDL licenc alatt érhető el, ami nem kompatibilis a Linux GPL licenszével. A kernelbe csak egy olyan ZFS driver reimplementáció kerülhet bele, amelynek kódja GPL kompatibilis. Ilyen megvalósításon dolgozik például a http://zfsonlinux.org/ projekt.
Linuxon a ZFS alternatívája lehet a btrfs, amely tervek szerint a ZFS-hez hasonló funkcionalitással fog rendelkezni. Ez azonban még fejlesztés alatt áll, éles használatra nem alkalmas. Linuxra készül egy natív kernel-space és egy userspace verzió, utóbbi a Linux kernel FUSE interfészét használja. A FUSE előnye a kernel-space megvalósítással szemben, hogy a fájlrendszer kódjának nem kell GPL kompatibilisnek lennie, valamint a driver összeomlása nem okozza az egész rendszer leállását, cserébe viszont kisebb teljesítménnyel bír.

[szerkesztés] 4 ZFS/Linux-FUSE

A forráskód letölthető a http://zfs-fuse.net oldalról. Ez tartalmazza a userspace driver-t, programkönyvtárakat és userspace eszközöket. Ez az írás a 0.6.9-es verziót mutatja be, amely a ZFS 23-as verzióját támogatja.

[szerkesztés] 4.1 Telepítés

A használatához legalább 2.6-os verziójú FUSE-t támogató kernel szükséges. A függőségek és SCons telepítése után lefordítani a következő parancsokkal lehet:

root@home:/# cd src
root@home:/# scons

Ha sikeresen lefordult, telepíteni a következő paranccsal lehet:

root@home:/# scons install

[szerkesztés] 4.2 ZFS/FUSE daemon indítása

Mivel a fájlrendszer driver user-space, ezért használatához egy daemon processz indítása szükséges:

root@home:/# zfs-fuse

[szerkesztés] 4.3 ZFS eszközök

A fuse-zfs telepítése után az alábbi fontosabb eszközöket kapjuk:

  • zpool: poolok adminisztrációja
  • zfs: ZFS fájlrendszerek adminisztrációja
  • zdb: ZFS debugger, verziószám lekérdezése

[szerkesztés] 4.4 Poolok adminisztrációja

[szerkesztés] 4.4.1 Pool létrehozása

Összefűzés RAID-0-szerűen:

zpool create -m <csatolási pont> <pool név> <vdev lista>

Egy példa:

zpool create pool1 /dev/sda2 /dev/sda3

Itt létrehoztuk a pool1 nevű ZFS pool-t a /dev/sda2 és /dev/sda3 blokkeszközökre. Ekkor létrejön a pool és csatolódik a /pool1 alá:

root@home:~# mount 
pool1 on /pool1 type fuse (rw,allow_other) 
...

Az -m kapcsolóval más mount pontot is meg lehet adni, alapértelmezetten a gyökérbe csatol.

Az új pool önálló fájlrendszerként is használható, de a ZFS lehetőségei nem használhatóak így ki. Ha létrehozunk erre a poolra egy ZFS fájlrendszert, akkor azt a pool könyvtárába csatolja.


RAID-Z konfiguráció létrehozása:

zpool create <pool név> raidz <vdev lista>

Itt a raidz az egyszeres paritást jelenti. Lehet ezen kívül raidz2 és raidz3 (a megfelelő fájlrendszer-verziók esetén), ez dupla, illetve tripla paritást jelent. Előbbihez legalább három, utóbbihoz legalább négy eszköz szükséges.
A vdev-eknek azonos méretűeknek kell lenniük. Ha nem azok, akkor az -f kapcsoló megadásával hozható létre a pool. Ebben az esetben minden vdev-en csak akkora helyet használ fel, ami a legkisebb vdev mérete. Létező raidz konfiguráció esetén nem adható hozzá és nem távolítható el eszköz utólag (csak cserélhető spare eszközre).

Példa dupla paritású RAID-Z építése /dev/sd[abc]1 eszközökre

zpool create pool1 raidz2 /dev/sda1 /dev/sdb1 /dev/sdc1


Tükrözés használata (mint RAID-1):

zpool create <pool név> mirror <vdev lista>

Itt a vdev-eknek azonos méretűeknek kell lenniük. Ha nem azok, akkor az -f kapcsoló megadásával hozható létre a pool. Ebben az esetben a mirror mérete a legkisebb vdev mérete lesz.

Lehetőség van egy létrehozott pool virtuális eszközéhez utólag mirrort rendelni a következő módon:

zpool attach <pool neve> <tükrözendő vdev a poolban> <új mirror vdev>

Itt ha a tükrözendő vdev nincs raid-z vagy mirror konfigurációban, akkor létrejön egy új mirror a parancsban megadott két eszközből. Ha a tükrözendő vdev már egy mirrornak a része, akkor ehhez a mirrorhoz fogja hozzáadni a vdev-et. A tükrözendő vdev nem lehet része raid-z konfigurációnak. Példa: Létrehozunk egy pool1 nevű egyszerű poolt a /zfs/vdev1.dat fájlból:

root@home:~# zpool create pool1 /zfs/vdev1.dat 
root@home:~# zpool status
 pool: pool1
state: ONLINE
scrub: none requested
config:

	NAME              STATE     READ WRITE CKSUM
	pool1             ONLINE       0     0     0
	  /zfs/vdev1.dat  ONLINE       0     0     0

errors: No known data errors

Ezután hozzáadunk egy tükröt, ami a /zfs/vdev2.dat fájl lesz:

root@home:~# zpool attach pool1 /zfs/vdev1.dat /zfs/vdev2.dat 
root@home:~# zpool status
 pool: pool1
state: ONLINE
scrub: resilver completed after 0h0m with 0 errors on Fri Dec 17 01:55:22 2010
config:

	NAME                STATE     READ WRITE CKSUM
	pool1               ONLINE       0     0     0
	  mirror-0          ONLINE       0     0     0
	    /zfs/vdev1.dat  ONLINE       0     0     0
	    /zfs/vdev2.dat  ONLINE       0     0     0  75K resilvered


errors: No known data errors

A status kimenetében jól látható, hogy létrejött egy mirror és újraszinkronizálta azt.

Ezután hozzáadunk egy új eszközt a tükörhöz a következő paranccsal:

root@home:~# zpool attach pool1 /zfs/vdev1.dat /zfs/vdev3.dat 
root@home:~# zpool status
 pool: pool1
state: ONLINE
scrub: resilver completed after 0h0m with 0 errors on Fri Dec 17 02:01:25 2010
config:

	NAME                STATE     READ WRITE CKSUM
	pool1               ONLINE       0     0     0
	  mirror-0          ONLINE       0     0     0
	    /zfs/vdev1.dat  ONLINE       0     0     0
	    /zfs/vdev2.dat  ONLINE       0     0     0
	    /zfs/vdev3.dat  ONLINE       0     0     0  84K resilvered

errors: No known data errors


Melegtartalék használata a poolban:

zpool create <pool név> <vdev lista> spare <tartalék vdev-ek>

Log eszköz használata:

zpool create <pool név> <vdev lista> log <vdev eszköz>

Összetettebb példa: Hozzunk létre pool1 néven a /dev/sda2 és /dev/sdb3 blokkeszközökre egy RAID-Z konfigurációt /zfs.log naplófájllal és /zfs.spare tartalékkal. Utóbbi kettő reguláris fájlok.

root@home:/# zpool create pool1 raidz /dev/sda2 /dev/sdb3 log /zfs.log spare /zfs.spare

[szerkesztés] 4.4.2 Pool törlése

zpool destroy <pool név>

Ez törli a megadott poolt és felszabadítja a használt eszközöket. Előtte le kell csatolnia a rajta létrehozott fájlrendszereket, így a művelet csak akkor sikeres, ha nem használja semmi a fájlrendszert vagy ha -f kapcsolót használjuk.

[szerkesztés] 4.4.3 Poolok listázása

root@home:/# zpool list 
NAME    SIZE      ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT 
pool1   3,88G     81K     3,87G     0%  1.00x ONLINE     - 

Ez kilistázza az összes olyan észlelt poolt, amit az adott verziójú ZFS driver kezelni tud.

[szerkesztés] 4.4.4 Poolok állapotai

root@home:/# zpool status 
pool: pool1 
state: ONLINE 
scrub: scrub completed after 0h0m with 0 errors on Wed Dec  8 00:18:31 2010 
config: 

NAME        STATE     READ WRITE CKSUM 
pool1       ONLINE       0     0     0 
  sda2      ONLINE       0     0     0 
  sda3      AVAIL  

Ez információkat ad a pool állapotáról, például a legutóbbi scrub hibakeresés eredménye és a poolban lévő eszközök állapota.


[szerkesztés] 4.4.5 Pool frissítés

zpool upgrade -a

Ha van olyan pool a rendszerben, ami a jelenleginél régebbi ZFS verziójú, akkor ezzel a paranccsal frissíteni lehet a verzióját.

[szerkesztés] 4.4.6 Pool importálás és exportálás

Pool importálása:

zpool import -d <könyvtár>

Pool exportálása:

zpool export <poolnév>

[szerkesztés] 4.4.7 Scrub indítása

zpool scrub <pool név>

Ez elindít egy hibakeresést a megadott nevű poolon. A hibakeresés eredménye a zpool status paranccsal kérdezhető le.

Az első paranccsal kereshetőek a megadott könyvtárban poolok, a másodikban egy pool exportálható. Exportálás után a pool mozgathatóvá válik, nem használható és nem látható a zpool-al importálásig. Csak olyan poolt lehet exportálni, amin nincs mountolt fájlrendszer. A -D kapcsolóval törölt (destroyed) pool is importálható. Az -a kapcsolóval egyidejűleg keres és importálja a megtalált poolokat.

Példa:

root@home:/# zpool export pool1   # Exportáljuk a pool1-et
root@home:/# zpool import -a -d /dev

Ez utóbbi megkeresi a blokkeszközök alapján a poolokat és importálja azokat.

[szerkesztés] 4.4.8 Device cseréje

Lehetőség van a poolban egy eszköz lecserélésére, például tartalékra.

Példa: a pool1-ben kicseréljük a /dev/sda3 eszközt /dev/sda4-re:

root@home:/# zpool offline pool1 /dev/sda3
Bringing device /dev/sda3 offline
root@home:/# zpool replace pool1 /dev/sda3 /dev/sda4

[szerkesztés] 4.5 ZFS adminisztráció

Egy fájlrendszert a következő módon azonosítunk: <pool név>/<fájlrendszer név>

Fájlrendszer létrehozása:

zfs create <létező pool>/<új fájlrendszer neve>

Példa:

root@home:/# zfs create pool1/fs1

Itt létrehozunk a pool1-en egy fs1 nevű fájlrendszert. A létrehozott fájlrendszer rögtön csatolva is lesz a /pool1/fs1 pontra.

Létrehozás attribútum megadásával:

zfs create -o <attribútum>=<érték> <létező pool>/<új fájlrendszer neve>

Átnevezés:

zfs rename <régi név> <új név>

Fájlrendszer törlése:

zfs destroy <fájlrendszer azonosító>

Létező fájlrendszer csatolása:

zfs mount <pool név>/<fájlrendszer név>

Lecsatolás:

zfs umount <pool név>/<fájlrendszer név>

Fájlrendszer-attribútumok beállítása és lekérdezése:
Egy fájlrendszerhez számos attribútum tartozik, például tömörítsen-e.

Lekérdezés:

zfs get <attribútum> <fájlrendszer azonosító>

Attribútum értékének módosítása:

zfs set <attribútum>=<új érték> <fájlrendszer azonosító>


Példa: tömörítés lekérdezése:

root@home:/# zfs get compression pool1/fs1 
NAME          PROPERTY     VALUE     SOURCE 
pool1/fs1     compression  gzip      local

A legtöbb attribútum használat közben módosítható, de néhány attribútumot csak létrehozásnál lehet megadni.

Fontosabb fájlrendszer-attribútumok és lehetséges értékeik:

  • Létrehozás után módosítható attribútumok:
    • Csak olvasható mód: readonly = on | off
    • Tömörítés: compression = on | off | lzjb | gzip | gzip-[1-9] | zle
    • Másolatok számának beállítása: copies = [1-3]
      Ebben az esetben az adatokat több másolatban tárolja, ha lehetséges, akkor külön eszközön. Ez nem azonos a pool szintű mirror-al, mert itt nem garantált több eszköz esetén sem az, hogy ugyanazon adat replikái különböző eszközökre kerülnek. Ezen kívül ha mirrorba különböző méretű eszközöket teszünk, akkor a nagyobb eszközökön kihasználatlan hely marad, míg Copies esetén minden eszközt teljesen ki lehet használni. Különbség továbbá az, hogy ez a tulajdonság online módon változtatható és csak az újonnan kiírt adatokra vonatkozik, ezért előállhat olyan eset, hogy különböző adatok különböző számú másolatban tárolódnak egy fájlrendszeren belül.
    • Deduplikáció: dedup = on | off
    • Hozzáférési idő használata: atime = on | off
    • Adatintegritás-ellenőrzés: checksum = on | off | fletcher2 | fletcher4 | sha256
      Ezt nem ajánlott kikapcsolni, alapértelmezetten be van kapcsolva, fletcher4 algoritmus az alapértelmezett.
    • Végrehajtás engedélyezése a fájlrendszeren: exec = on | off
    • Fájlrendszerméret-korlátozás: quota = <méret> | none
    • Setuid engedélyezése: setuid = on | off
    • Bővített attribútumok engedélyezése: xattr = on | off
    • Titkosítás (jelenlegi fuse-zfs verzió még nem támogatja!): encryption = on | off
  • Létrehozás után nem módosítható attribútumok:
    • fájlnév case sensitivity: casesensitivity = sensitive | insensitive | mixed
    • Unicode fájlnevek normalizálásának algoritmusa: normalization = none | formC | formD | formKC | formKD
      Ha engedélyezzük, akkor a fájlneveken végzett összehasonlító műveletek esetén a fájlneveket unicode kódolásúnak értelmezi és ezek normalizált alakjait hasonlítja össze. Kikapcsolása esetén összehasonlításnál nem értelmezi kódolás szerint a fájlneveket.
    • Csak UTF-8 karakterek engedélyezése: utf8only = on | off
      Ha be van kapcsolva, akkor visszautasít olyan fájlneveket, ami az UTF-8 karakterkészletében nem szereplő karaktert tartalmaz. Kikapcsolása esetén nem értelmezi a fájlneveket.

Snapshotok: Snapshot létrehozása:

zfs snapshot <fájlrendszer azonosító>@<snapshot név>

Példa: Egy 201012 nevű, majd egy 201012_2 nevű snapshotot hozunk létre az fs1 fájlrendszerről:

root@home:/# zfs snapshot pool1/fs1@201012
root@home:/# zfs snapshot pool1/fs1@201012_2

A snapshotokat a következő paranccsal lehet kilistázni táblázatos formában:

root@home:/# zfs list -t snapshot 
NAME                 USED  AVAIL  REFER  MOUNTPOINT 
pool1/fs1@201012      21K      -  13,4M  - 
pool1/fs1@201012_2    20K      -  13,4M  - 

Korábbi snapshot visszaállítása:

zfs rollback <fájlrendszer azonosító>@<snapshot név>

Példa: Állítsuk vissza az fs1 fájlrendszert a 201012 nevű snapshotra:

root@home:/# zfs rollback pool1/fs1@201012

Klónozás:

Egy fájlrendszernek csak egy snapshotjából lehet klónt létrehozni:

zfs clone <fájlrendszer azonosító>@<snapshot név> <klónozott fájlrendszer neve>

Példa: hozzuk létre fs1-nek a 201012 snapshotból készített klónját

root@home:/# zfs clone pool1/fs1@201012 pool1/fs1clone

Ekkor létrejön a pool1-ben a klónozott fájlrendszer:

root@home:/# ls 
fs1  fs1clone 

Egy klón fájlrendszer függetlenné tehető a snapshot-tól a következő paranccsal, így a snapshot törölhető, egyébként a klón törléséig ez nem tehető meg:

root@home:/# zfs promote pool1/fs1clone

[szerkesztés] 4.6 ZFS Volume

Egy poolon nem csak fájlrendszer, hanem ZFS kötet is létrehozható, amelyet blokkeszközként érhetünk el. Ez a funkció a 0.6.9-es verziójú ZFS/FUSE-ban még nincs megvalósítva.

Létrehozás:

# zfs create -V <kötet méret> <pool név>/<kötet név>

Ekkor létrejön a kötet a /dev/zvol könyvtárban.

[szerkesztés] 5 Irodalomjegyzék

Angol Wikipédia cikk
ZFS/FUSE projekt weboldala
http://www.sun.com/bigadmin/features/articles/zfs_part1.scalable.jsp
http://hub.opensolaris.org/bin/view/Community+Group+zfs/source
http://blogs.sun.com/roch/entry/the_new_zfs_write_throttle
http://www.solarisinternals.com/wiki/index.php/ZFS_Performance
http://www.solarisinternals.com/wiki/index.php/ZFS_Best_Practices_Guide
http://hub.opensolaris.org/bin/view/Community+Group+zfs/1
http://docs.sun.com/app/docs/doc/819-5461/gcvjg?a=view

Személyes eszközök