ZFS-FUSE
(→ZFS adminisztráció) |
a (link a ZFS oldalra) |
||
(egy szerkesztő 60 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 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, amelyet a blokkra mutató pointer mellé tárol el. Az ellenőrző kód 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 === |
||
− | A ZFS architektúrája eltér a hagyományos fájlrendszerekétől, ugyanis egy logikai kötetkezelőt is tartalmaz. |
+ | A ZFS architektúrája eltér a hagyományos fájlrendszerekétől, ugyanis egy logikai kötetkezelőt is tartalmaz.<br> |
+ | 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. <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, 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]] |
||
− | |||
− | Virtual device-okból poolok építhetőek, egy poolon több ZFS létrehozható. Egy fájlrendszer fájlok csooportja a pool-on (dataset). Emiatt egy fájlrendszer méretét sem kell előre megadni.<br> |
||
− | Virtual device lehet blokkeszköz, reguláris fájl, vagy ezek valamilyen összetettebb konfigurációja, például RAID-Z, vagy tükrözés vagy egyszerű összefűzés. |
||
=== 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 === |
||
62. sor: | 57. 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. |
+ | 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 ZFS tranzakció csoportokat, szinkron íráshoz intent(„szándék”) naplózást használ (ebben a művelet elvégzése előtt írja a naplóba, hogy mit fog kiírni). |
+ | 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> |
||
+ | 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. |
||
=== 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 === |
||
− | 128 kbyte-ig változtatható a blokkok mérete az adminisztrátor által. 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. |
+ | 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> |
− | Tervek szerint a fájlrendszer a blokkméret automatikus, terhelés-függő változtatására is képes lesz. 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 === |
||
90. sor: | 85. sor: | ||
=== RAID-Z === |
=== RAID-Z === |
||
− | RAID-5 módszerhez hasonló , de véd az írás megszakításából adódó inkonzisztencia porblémáktól. 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ó zvolume 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 === |
||
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. |
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. |
||
+ | |||
=== Adaptive Replacement Cache === |
=== Adaptive Replacement Cache === |
||
102. sor: | 98. sor: | ||
=== Egyéb tulajdonságok === |
=== Egyéb tulajdonságok === |
||
− | *Fejlettebb ACL kezelés |
+ | *128 bites fájlrendszer: Gyakorlatilag korlátlan, a legtöbb méretkorlát legalább 2<sup>48</sup> nagyságú. |
− | *Egyszerű pool mozgatás zpool export és zpool import segítségével |
+ | *[http://wiki.linux-nfs.org/wiki/index.php/ACLs#ACL_models Posix és NFSv4 ACL modellek] támogatása |
− | *Intelligens 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]] |
− | *Pipeline I/O, jól párhuzamosított és jól skálázódó I/O |
+ | *[http://www.solarisinternals.com/wiki/index.php/ZFS_Performance#Intelligent_prefetch Intelligens prefetch]: például stream szolgáltatás esetén hasznos |
− | *Nincs metaadat-korlát |
+ | *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. |
− | *I/O prioritás |
+ | *Dinamikus metaadat-allokáció |
− | *Minden metaadatot legalább kétszer tárol. Ez írásnál overheadet okoz, de olvasásnál növelheti is a teljesítményt. |
+ | *[http://www.solarisinternals.com/wiki/index.php/ZFS_Performance#Explicit_IO_priority_with_deadline_scheduling 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. |
*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. |
||
117. sor: | 113. sor: | ||
'''FreeBSD''' 8.0 óta támogatja a zpool v13-at, a 8.1 a v14-et. |
'''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 '''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.<br> |
+ | 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.<br> |
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. |
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. |
Linuxra készül egy natív kernel-space és egy userspace verzió, utóbbi a Linux kernel FUSE interfészét használja. |
||
155. sor: | 151. 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 |
||
167. sor: | 163. 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: |
||
225. sor: | 280. 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. |
||
244. sor: | 299. sor: | ||
=== ZFS adminisztráció === |
=== ZFS adminisztráció === |
||
− | + | ||
Egy fájlrendszert a következő módon azonosítunk: |
Egy fájlrendszert a következő módon azonosítunk: |
||
<pool név>/<fájlrendszer név> |
<pool név>/<fájlrendszer név> |
||
271. sor: | 326. 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. |
||
Lekérdezés: |
Lekérdezés: |
||
− | zfs get <attributum> <fájlrendszer azonosító> |
+ | zfs get <attribútum> <fájlrendszer azonosító> |
Attribútum értékének módosítása: |
Attribútum értékének módosítása: |
||
− | zfs set <attributum>=<új érték> <fájlrendszer azonosító> |
+ | zfs set <attribútum>=<új érték> <fájlrendszer azonosító> |
288. sor: | 343. sor: | ||
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. |
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: |
+ | Fontosabb fájlrendszer-attribútumok és lehetséges értékeik: |
*Létrehozás után módosítható attribútumok: |
*Létrehozás után módosítható attribútumok: |
||
**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 |
||
− | **Setuid engedélyezés: setuid = on | off |
+ | **Setuid engedélyezése: setuid = on | off |
− | **Extended attributes engedélyezés: xattr = 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 |
**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: |
*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''': |
||
338. sor: | 393. sor: | ||
fs1 fs1clone |
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 nem: |
+ | 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 |
root@home:/# zfs promote pool1/fs1clone |
||
− | == Teljesítmény mérések == |
+ | === ZFS Volume === |
− | |||
− | Néhány nem mérvadó mérési eredmény a ZFS/Linux-FUSE és OpenSolaris 2009.06 ZFS fájlrendszer teljesítményének összehasonlításáról, azonos fájlrendszeren és hardveren, iozone többszálú méréssel. A pool egy RAID-Z, rajta egy GZIP-tömörített fájlrendszer. A Linux kernel verziója 2.6.36. |
||
− | |||
− | Első írás a fájlrendszerre:<br> |
||
− | [[Fájl:zfs_bench_init_write.png]] |
||
− | |||
− | Újraírás:<br> |
||
− | [[Fájl:zfs_bench_rewrite.png]] |
||
− | |||
− | Véletlenszerű írás:<br> |
||
− | [[Fájl:zfs_bench_random_write.png]] |
||
− | |||
− | Olvasás:<br> |
||
− | [[Fájl:zfs_bench_read.png]] |
||
− | Véletlenszerű olvasás:<br> |
+ | 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. |
− | [[Fájl:zfs_bench_random_read.png]] |
||
− | Az eredmények alapján az írási teljesítményben rosszul teljesít a FUSE megvalósítás az OpenSolarishoz képest. |
+ | Létrehozás: |
− | Az olvasási tesztben a FUSE jóval gyorsabb, ez viszont csak a gyorsítótárazás hatékonyságát tükrözi az OpenSolarissal szemben. |
+ | # 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. |
||
− | == 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., 10: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.
[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:
- adatstruktúrák definiálása
- metaadat-replikáció
- melegtartalék, dupla paritású RAID-Z (RAID-Z2)
- 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.
- röptömörítés a gzip algoritmusával
- bootfs pool attribútum: megadható a poolon belül az elsődleges boot fájlrendszer
- ZFS Intent Log (ZIL)
- a fájlrendszer adminisztrációjának joga root jogosultsággal nem rendelkező felhasználóknak is delegálható
- 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)
- cache device támogatása: operatív memória és diszk-rendszer közé vezet be további cache-réteget
- hibakeresés és újraszinkronizálás teljesítményének javítása
- snapshot attribútumok támogatása
- új, helyfoglalással kapcsolatos fájlrendszer attribútumok hozzáadása (usedby* attribútumok)
- 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
- felhasználóra és csoportra megadható, helyfoglalásra vonatkozó attribútumok hozzáadása(userused, userquota, groupused, groupquota)
- Csak egy javítást tartalmaz, amely Comstar SCSI vezérlőkkel való használat esetén okozott gondot
- tripla paritású RAID-Z (RAID-Z3)
- zfs hold parancs bevezetése: segítségével a felhasználó explicit módon változtathatja egy snapshot referenciaszámlálóját.
- Csak javítást tartalmaz log vdev eltávolítása kapcsán felmerülő problémákra
- röptömörítés a zle algoritmusával
- blokkszintű deduplikáció támogatása
- 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.
- ZIL-el kapcsolatos módosítások
- rendszerattribútumok támogatása
- hibakereséssel és újraszinkronizálással kapcsolatos statisztikák fejlesztése
- snapshot törlésének gyorsítása
- snapshot létrehozásának gyorsítása
- több virtuális eszköz egyidejű cseréjének támogatása
- RAID-Z teljesítményének növelése
- titkosítás támogatása
- 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.
[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:
- ú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