Tak jsem se konečně dostal k tomu, abych si trošku vyzkoušel nový opěvovaný file system od Sunů – ZFS (Zettabyte File System), který je již součástí Solaris 10. Musím říci, že jsem z něho docela unešenej :-)
Jak už jsem napsal, ZFS je již součástí Solaris 10, takže nebyl žádný problém si ho při pročítání dokumentace trošku osahan naživo. V podstatě jde o souborový systém, který je napsaný zcela od základu a “trošku jinak”, než ostatní file systemy. Zahrnuje v sobě totiž mnoho dalších funkcí, které nejsou v jiných FS dostupné vubec, nebo jsou dotupné nějakou externí utilitou. Těch předností je několik:
# Kapacita ZFS je prakticky nevyčerpatelná. Tím, že se jedná o (první a zatím jediný) 128bitový file system, dokáže obhospodařovat až 16 exabytů, přičemž ani jednotlivé soubory nemají limit.
# Pro všechny oparace zápisu i čtení se počítá kontrolní součet, který slouží pro samoopravné procedury. Ty se spustí vždy, když ZFS detekuje koruptnutá data. Můžete si tak být jisti, že co zapíšete, to také dostanete ;-)
# ZFS dokáže online komprimovat a dekomprimovat data. Má to tu výhodu, že objem fyzicky zapisovaných a čtených dat je menší a tím pádem i rychlejší. Mám připravené testy a porovnání mezi UFS na SVM a ZFS a výsledky tu určitě brzy zveřejním.
# ZFS v sobě zahrnuje i propracovaný volume manager, který je těsně propojen s vlastním file systemem. Výsledkem je kompaktní a rychlý celek, který může být velice rychle rekonfigurován – online, bez ztráty nebo nutnosti přesunu dat. Již se nemusíte starat o partyšny a obávat se o místo, čekat na vytvoření FS. Stačí se rozhodnout, které disky použijete a vytvoříte na nich tzv. pool. Systém se automaticky stará o optimální rozložení dat tak, aby průchodnost systému byla co nejvyšší.
Mirrorovaný pool vytvoříme příkazem:
root@mudstone# zpool create prostor mirror c1t9d0 c1t11d0
root@mudstone# zpool status
pool: prostor
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
prostor ONLINE 0 0 0
mirror ONLINE 0 0 0
c1t9d0 ONLINE 0 0 0
c1t11d0 ONLINE 0 0 0
errors: No known data errors
Systém se nám ihned přimountoval:
root@mudstone# zfs list
NAME USED AVAIL REFER MOUNTPOINT
prostor 78K 16.5G 24.5K /prostor
root@mudstone# df -h /prostor/
Filesystem size used avail capacity Mounted on
prostor 16G 24K 16G 1% /prostor
Pokud potřebujeme jiný mount point, použijeme otion -m při zpool create nebo jej nastavíme dodatečně:
root@mudstone# zfs set mountpoint=/export/prostor prostor
root@mudstone# zfs list
NAME USED AVAIL REFER MOUNTPOINT
prostor 84K 16.5G 24.5K /export/prostor
root@mudstone# mount|grep prostor
/export/prostor on prostor read/write/setuid/devices/exec/atime/dev=4010009
on Fri Sep 1 17:05:57 2006
v tomto poolu můžeme vytvářet další file systemy:
root@mudstone# zfs create prostor/aplikace
root@mudstone# zfs create prostor/data
root@mudstone# df -h |grep prostor
prostor 16G 27K 16G 1% /export/prostor
prostor/aplikace 16G 24K 16G 1% /export/prostor/aplikace
prostor/data 16G 24K 16G 1% /export/prostor/data
Výhodou je, že se nemusíme starat o velikosti, partyšny, disky apod. Všecho je totiž dynamické a později to můžeme kdykoliv změnit bez ztráty dat. Včetně parametrů jako je comprese dat, quota, garantované místo na disku nebo dokonce shareovaní přes nfs.
root@mudstone# zpool add prostor mirror c1t14d0 c1t13d0
root@mudstone# zpool status
pool: prostor
state: ONLINE
scrub: resilver completed with 0 errors on Fri Sep 1 17:18:40 2006
config:
NAME STATE READ WRITE CKSUM
prostor ONLINE 0 0 0
mirror ONLINE 0 0 0
c1t9d0 ONLINE 0 0 0
c1t11d0 ONLINE 0 0 0
mirror ONLINE 0 0 0
c1t14d0 ONLINE 0 0 0
c1t13d0 ONLINE 0 0 0
errors: No known data errors
root@mudstone# df -h|grep prostor
prostor 33G 27K 33G 1% /export/prostor
prostor/aplikace 33G 24K 33G 1% /export/prostor/aplikace
prostor/data 33G 24K 33G 1% /export/prostor/data
root@mudstone# zfs set compression=on prostor/data
root@mudstone# zfs set quota=5G prostor/aplikace
root@mudstone# zfs set reservation=10G prostor/data
root@mudstone# zfs set sharenfs=rw prostor/data
root@mudstone# df -h|grep prostor
prostor 33G 27K 23G 1% /export/prostor
prostor/aplikace 5.0G 24K 5.0G 1% /export/prostor/aplikace
prostor/data 33G 24K 33G 1% /export/prostor/data
# ZFS používá pro zápis proměnlivou velikost bloků. Ty se určují podle toho, jaký typ (velikost, struktura) dat se mají zapisovat.
# Možnost vytváření snapshotů a backupů přímo nástroji ZFS a to bez fyzickeho kopírování dat. Systém si pamatuje stav v okamžiku provedení snapshotu a ukládá pouze rozdíly od tohoto okamžiku. Podle těchto rozdílů je schopen předat na požádání uživateli soubor ve stavu v jakém byl v okamžiku provedení snapshotu. A to bez rootovských práv, takže dostupné pro běžné uživatele systému. Samozřejmostí je možnost vrátit celý FS do stavu v okamžiku snapshotu (tzv. rollback), clonovani, incremental backup atd.
root@mudstone# cd /export/prostor
root@mudstone# for i in `seq 1 2000`
root@mudstone# do echo puvodni text>> data/testfile
root@mudstone# done
root@mudstone# grep -c "puvodni text" data/testfile
2000
root@mudstone# zfs snapshot prostor/data@patek
root@mudstone# >testfile
root@mudstone# for i in `seq 1 500`
root@mudstone# do echo uprava>>data/testfile
root@mudstone# done
root@mudstone# grep -c "puvodni text" data/testfile
0
root@mudstone# grep -c "puvodni text"
> /export/prostor/data/.zfs/snapshot/patek/testfile
2000
root@mudstone# zfs rollback prostor/data@patek
root@mudstone# grep -c "puvodni text" data/testfile
2000
# Možnost velmi detailního nastavení uživatelských práv vycházející z praxe NFS4 a/nebo NT, kdy můžete povolit anebo zakázat některá práva včetně dědění do podadresářů.
# Zatím neuvolněné do ostrého provozu jsou funkce enkrypce dat a bezpečný delete (opravdové smazání dat z disku)
Důležitá upozornění:
1. Zničit celý fs se dá jediným příkazem, který se provede bez sebemenšího dotazu:
root@mudstone# zpool destroy prostor
root@mudstone#
2. Pokud si budete se ZFS hrát, přidáním disku do ZFS poolu se kompletně přepíše partition tabulka disku. Takže už tam nenajdete klasických 7 partitions, ale minimálně 8 a bude vám chybět 2. backup partition přes celý disk.
partition> Current partition table (original):
Total disk sectors available: 35362115 + 16384 (reserved sectors)
Part Tag Flag First Sector Size Last Sector
0 usr wm 34 16.86GB 35362115
1 unassigned wm 0 0 0
2 unassigned wm 0 0 0
3 unassigned wm 0 0 0
4 unassigned wm 0 0 0
5 unassigned wm 0 0 0
6 unassigned wm 0 0 0
8 reserved wm 35362116 8.00MB 35378499
Po oderbání je tento disk bez s2 partition nepoužitelný pro běžnou práci mimo ZFS (pro UFS apod.) Pokusy o přístup na c1t12d0s2 nebo o přepsání nebo vytvoření nové s2 selhávají na chyby “out of range”. Nejrychlejším postupem jak se toho zbavit, je spustit příkaz format -e
a příkazem label
namísto EFI label zapsat zpět původní SMI label:
root@mudstone# format -e c1t12d0
selecting c1t12d0
[disk formatted]
<snip>
format> label
[0] SMI Label
[1] EFI Label
Specify Label type[1]: 0
Warning: This disk has an EFI label. Changing to SMI label will erase all
current partitions.
Continue? yes
Auto configuration via format.dat[no]? yes
partition>
Pro rychlou ukázku toho jak to funguje v praxi se mrkněte na flashovou animaci. Pro podrobnější seznámení a další bádání doporučuji dokumentace z OpenSolaris.org