Natív ZFS Ubuntu 10.04 alatt

Ha már megjelent, nézzük meg valóban működik-e úgy, ahogy azt állítják. A fordítás nem nehéz, de az alapértelmezett gcc-4.4 helyett gcc-4.3-mal érdemes nekikezdeni, mert 4.4-gyel hibát dob a zfs-0.4.9 fordításánál. A fordításhoz kellenek a szokásos cuccok - binutils, gcc, gawk. Ezen kívül az uuid-dev, zlib1g-dev. Volt aki panaszkodott a splat-tal kapcsolatban a sima awk-ra, nekem a gawk-kal semmi problémám sem volt.

Töltsük le a splat-ot (spl-0.4.9.tar.gz), fordítsuk le és telepítsük (./configure, make, make install, depmod -a). Ha a splat lefordult töltsük be és teszteljük le:


root@playground:/home/trey# modprobe splat

root@playground:/home/trey# splat -a
------------------------------ Running SPLAT Tests ------------------------------
                kmem:kmem_alloc           Pass
                kmem:kmem_zalloc          Pass
                kmem:vmem_alloc           Pass
                kmem:vmem_zalloc          Pass
                kmem:slab_small           Pass
                kmem:slab_large           Pass
                kmem:slab_align           Pass
                kmem:slab_reap            Pass
                kmem:slab_age             Pass
                kmem:slab_lock            Pass
                kmem:slab_overcommit      Pass
                kmem:vmem_size            Pass
               taskq:single               Pass
               taskq:multiple             Pass
               taskq:system               Pass
               taskq:wait                 Pass
               taskq:order                Pass
                krng:freq                 Pass
               mutex:tryenter             Pass
               mutex:race                 Pass
               mutex:owned                Pass
               mutex:owner                Pass
             condvar:signal1              Pass
             condvar:broadcast1           Pass
             condvar:signal2              Pass
             condvar:broadcast2           Pass
             condvar:timeout              Pass
              thread:create               Pass
              thread:exit                 Pass
              rwlock:N-rd/1-wr            Pass
              rwlock:0-rd/N-wr            Pass
              rwlock:held                 Pass
              rwlock:tryenter             Pass
              rwlock:rw_downgrade         Pass
              rwlock:rw_tryupgrade        Pass
                time:time1                Pass
                time:time2                Pass
               vnode:vn_open              Pass
               vnode:vn_openat            Pass
               vnode:vn_rdwr              Pass
               vnode:vn_rename            Pass
               vnode:vn_getattr           Pass
               vnode:vn_sync              Pass
               vnode:vn_getf              Pass
                kobj:open                 Pass
                kobj:size/read            Pass
              atomic:64-bit               Pass
                list:create/destroy       Pass
                list:ins/rm head          Pass
                list:ins/rm tail          Pass
                list:insert_after         Pass
                list:insert_before        Pass
                list:remove               Pass
                list:active               Pass
             generic:ddi_strtoul          Pass
             generic:ddi_strtol           Pass
             generic:ddi_strtoull         Pass
             generic:ddi_strtoll          Pass
                cred:cred                 Pass
                cred:kcred                Pass
                cred:groupmember          Pass

Ha a tesztek lefutnak hiba nélkül, akkor fordítsuk le a zfs-0.4.9-et is (./configure --with-spl=/ahol/az/spl/forraskonyvtar_van, make, make install, depmod -a).

Ha kész, töltsük be a modult:


root@playground:/home/trey# modprobe zfs

Ellenőrizzük:


root@playground:/home/trey# lsmod | grep zfs
zfs                   675319  4 
zcommon                31961  1 zfs
znvpair                46714  2 zfs,zcommon
zavl                    6955  1 zfs
zlib_deflate           21834  1 zfs
zunicode              323231  1 zfs
spl                    98036  6 zfs,zcommon,znvpair,zavl,zunicode,splat

Ha eddig eljutottunk, akkor elkezdhetünk játszani. Az userspace toolok sírhatnak, hogy nem találják a libspl.so.0-t:


root@playground:/home/trey/zfs-0.4.9# zfs
zfs: error while loading shared libraries: libspl.so.0: cannot open shared object file: No such file or directory

Megoldás:


root@playground:/home/trey# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

vagy az igazán jó (és végleges) megoldás:

Legyünk biztosak afelől, hogy a /etc/ld.so.conf.d/libc.conf fájl tartalmazza a /usr/local/lib útvonalat, majd futtassuk az ldconfig-ot.


root@playground:/home/trey# ldconfig

Most már:


root@playground:/home/trey# zpool list
no pools available
root@playground:/home/trey# zpool status
no pools available

Készítsünk egy "tank" zpool-t, ami négy lemezen elterülő RAIDZ-t tartalmaz.


root@playground:/home/trey# zpool create -f tank raidz /dev/sdb /dev/sdc /dev/sdd /dev/sde

root@playground:/home/trey# zpool status
  pool: tank
 state: ONLINE
 scrub: none requested
config:

	NAME        STATE     READ WRITE CKSUM
	tank        ONLINE       0     0     0
	  raidz1    ONLINE       0     0     0
	    sdb1    ONLINE       0     0     0
	    sdc1    ONLINE       0     0     0
	    sdd1    ONLINE       0     0     0
	    sde1    ONLINE       0     0     0

errors: No known data errors

root@playground:/home/trey# zpool list
NAME   SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
tank  39.8G   135K  39.7G     0%  ONLINE  -

Készítsünk bele egy 20GB-os, "fish" nevű blokk eszközt:


root@playground:/home/trey# zfs create -V 20G tank/fish

Csináljunk rá partíciót:


root@playground:/home/trey# cfdisk /dev/tank/fish

majd ha kész:


root@playground:/home/trey# mkfs.ext2 /dev/tank/fish1
root@playground:/home/trey# mount /dev/tank/fish1 /mnt/tank/fish1

Tegyünk rá valamit:


root@playground:/home/trey# dd if=/dev/zero of=/mnt/tank/fish1/foo.img bs=100M count=10
10+0 records in
10+0 records out
1048576000 bytes (1.0 GB) copied, 51.307 s, 20.4 MB/s

root@playground:/home/trey# zfs list
NAME        USED  AVAIL  REFER  MOUNTPOINT
tank       20.0G  9.27G  26.9K  /tank
tank/fish    20G  28.1G  1.15G  -

root@playground:/home/trey# zpool list
NAME   SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
tank  39.8G  1.79G  38.0G     4%  ONLINE  -

Snapshot:


root@playground:/home/trey# zfs snapshot tank/fish@pristine
root@playground:/home/trey# mkdir /mnt/tank/fish@pristine1
root@playground:/home/trey# mount /dev/tank/fish@pristine1 /mnt/tank/fish\@pristine1/
mount: block device /dev/tank/fish@pristine1 is write-protected, mounting read-only
root@playground:/home/trey# touch /mnt/tank/fish1/foobar
root@playground:/home/trey# ls /mnt/tank/fish1/
foobar foo.img lost+found
root@playground:/home/trey# ls /mnt/tank/fish\@pristine1/
foo.img  lost+found

Scrub:


root@playground:/home/trey# zpool scrub tank
root@playground:/home/trey# zpool status 
  pool: tank
 state: ONLINE
 scrub: scrub completed after 0h1m with 0 errors on Sat Jun  5 12:07:35 2010
config:

	NAME        STATE     READ WRITE CKSUM
	tank        ONLINE       0     0     0
	  raidz1    ONLINE       0     0     0
	    sdb1    ONLINE       0     0     0
	    sdc1    ONLINE       0     0     0
	    sdd1    ONLINE       0     0     0
	    sde1    ONLINE       0     0     0

errors: No known data errors

Destroy:


root@playground:/home/trey# umount /mnt/tank/fish\@pristine1/
root@playground:/home/trey# umount /mnt/tank/fish1
root@playground:/home/trey# zfs destroy tank/fish\@pristine
root@playground:/home/trey# zfs destroy tank/fish
root@playground:/home/trey# zpool destroy tank
root@playground:/home/trey# zfs list
no datasets available
root@playground:/home/trey# zpool list
no pools available

Mirror, diszkcserével:


root@playground:/tmp/ize# zpool create tank mirror /dev/sdb /dev/sdc
root@playground:/tmp/ize# zpool status
  pool: tank
 state: ONLINE
 scrub: none requested
config:

	NAME        STATE     READ WRITE CKSUM
	tank        ONLINE       0     0     0
	  mirror    ONLINE       0     0     0
	    sdb1    ONLINE       0     0     0
	    sdc1    ONLINE       0     0     0

errors: No known data errors

root@playground:/tmp/ize# zfs create -V 9G tank/fish

root@playground:/tmp/ize# cfdisk /dev/tank/fish
root@playground:/tmp/ize# mkfs.ext2 /dev/tank/fish1
root@playground:/tmp/ize# mount /dev/tank/fish1 /mnt/tank/fish1/
root@playground:/tmp/ize# vi /mnt/tank/fish1/nagyonfontosfajl
root@playground:/tmp/ize# cat /mnt/tank/fish1/nagyonfontosfajl
ez egy nagyon fontos fajl

root@playground:/tmp/ize# zpool detach tank sdb1

root@playground:/tmp/ize# zpool status
  pool: tank
 state: ONLINE
 scrub: none requested
config:

	NAME        STATE     READ WRITE CKSUM
	tank        ONLINE       0     0     0
	  sdc1      ONLINE       0     0     0

errors: No known data errors

root@playground:/tmp/ize# zpool attach tank /dev/sdc1 /dev/sdb1

root@playground:/tmp/ize# zpool status
  pool: tank
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Sat Jun  5 12:50:50 2010
config:

	NAME        STATE     READ WRITE CKSUM
	tank        ONLINE       0     0     0
	  mirror    ONLINE       0     0     0
	    sdc1    ONLINE       0     0     0
	    sdb1    ONLINE       0     0     0  72K resilvered

errors: No known data errors

root@playground:/tmp/ize# cat /mnt/tank/fish1/nagyonfontosfajl
ez egy nagyon fontos fajl

A részletek itt.

Hozzászólások

cool. tényleg. és nem is szeretném ragozni :)

trey++ :)

-----
"Egy jó kapcsolatban a társunkat az ő dolgában kell támogatni, nem a miénkben."

Nagyon jo kis leiras!

Apro eszrevetel:

Az userspace toolok sírhatnak, hogy nem találják a libspl.so.0-t:

/usr/local/lib -nek amugy is ld.so.conf -ban a helye. LD_LIBRARY_PATH alkalmi hekkelesre valo, nem ide. Sokkal celszerubb es 1337366 egy


echo /usr/local/lib >/etc/ld.so.conf.d/locallib.conf
ldconfig

Ez így hogy:

"mkfs.ext2 /dev/tank/fish1"

??

Ugyan négyszer belinkeltem, de belinkelem ötödször is: Example ZVOL

Az első 5 sorban le van írva, hogy jelenleg az userspace-ból csak a ZVOL érhető el. Ez lehetővé teszi virtuális blokk eszköz dataset létrehozását, amit megformázhatsz arra, amire akarsz. Ezt alulról megtámogathatod a neked tetsző ZFS által nyújtott raid szinttel (mirror, raidz, raidz2, ...), képes vagy scrub-olni, illetve snapshotolni. Erre láttál példát.

Itt tart a fejlesztés, de azt ígérik, hogy folytatják.

--
trey @ gépház

És ez miért meglepő? Ez csak azt mutatja, hogy kb. mikor kezdték el a munkát. Ha valaki most állna neki, nyilván a legújabbal kezdene, a FreeBSD-ben pedig elsősorban a működésre helyezték a hangsúlyt, mintsem a feature-paritásra.
Talán lassan összejön. :)

suckIT szopás minden nap! Death is just a bug report

Csak meglepődtem, hogy natív zfs-ről van szó, aztán végül mégiscsak ext fs lesz használatban, és a zfs-ből csak a zpool van használva végül...
btw, freebsd -ben rendesen megy a zfs, tehát nem hozunk létre a zpoolon newfs -sel ufs-t, ahnem zfs create tank/fs
és pl. ls -la /tank/fs
stb.
Gondolom a videón a 7.0-current-ben is még nem volt rendesen implementálva a zfs, ezért newfs -ezik a csóka, de nem tudom.

Mi a rak ez a SPLAT ? olyasmi mint a fuse?

A'rpi

Szerintem ilyen állítás, hogy jobb-rosszabb ennél vagy annál senki részéről sem hangzott el, illetve nem hiszem, hogy valami ellen jött létre. Az intézmény kapott egy megbízást (lásd előző cikk), amelynek oldalhajtásaként létrejött ez a kód.

--
trey @ gépház

Azért nem teljesen fuse mert abban az esetben userspace-ban van megvalósítva az fs itt pedig a kernelben ha jól értem. Az spl pedig szerintem az eltérő kernel API-k között fordít, így kvázi nem kell hozzányúlni nagyon magához a zfs kódhoz.

"The Solaris Porting Layer (SPL) is a Linux kernel module which provides many of the Solaris kernel APIs. This shim layer makes it possible to run Solaris kernel code in the Linux kernel with relatively minimal modification. This can be particularly useful when you want to track upstream Solaris development closely and don’t want the overhead of maintaining a large patch which converts Solaris primitives to Linux primitives."

Egyébként a FreeBSD-ben is ilyen rétegen keresztül van implementálva a ZFS, ha jól értem az opensolaris.ko kernel modul pont azt csinálja, mint az spl.

Hogy ez mennyire gány azt nem tudom megítélni.

De majd valaki megcáfol.

Ennyi erovel a FUSE fajlrendszerek is ganyolasnak mondhatok, mert hat azok mennyire nem nativak. Egyebkent tobb mas rendszer is igy implementalta, meg talan a Macesek is. Tudod, tizmilliard legy nem tevedhet...
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

btrfs melle minek egy ZFS ?

Amit nem lehet megirni assemblyben, azt nem lehet megirni.

Lehet követni azt a megközelítést, amit a FreeBSD team: elég 1-2 jó fájlrendszer, a többi meg le van sz.va. Van akinek ez kell. Linux alatt nem ez az irányelv, és ezzel szerintem sokan elégedettek vagyunk. Pl. én sem az alapértelmezett extended fájlrendszereket használom, hanem az xfs-t, és örülök, hogy ha valaki a kezembe ad egy akárhonnan előrángatott vinyót, hogy le kéne róla menteni pár dolgot, jóeséllyel olvasni tudja, bár legtöbbször akár írni is. Annak idején az ntfs-3g-t is fikázták sokan, feleslegesnek tartva.

Izgatottan várom már a PFS-t (Pluggable FS), amely a MySQL-hez hasonlóan többféle backenden képes fájlrendszert "csinálni". Lehetne neki ZFS, BTRFS, ext[2-4], MySQL, memcached, BDB, vagy akár IISS (Internet ICMP Storage System, ahol az adattárolás átmeneti pufferekben történik, amelyeket a fájlrendszer a világ másik végén lévő routereknek küld ICMP echo üzenetben, és mikor visszajön az echo-reply, újraküldi, így használva a hálózatot, illetve a routereket elosztott adattárolásra) is.
Így csak a backendek illesztésével kellene vacakolni, minden más, ami efölött van, közös lenne.

suckIT szopás minden nap! Death is just a bug report

Mert a változatosság gyönyörködtet! :-) Nem lesznek egyformák, mint ahogy a korábbi generáció sem, lesz ami egyik, lesz ami meg másik felhasználási területen nyújt bolhafasznyival többet, és ez pont elég, hogy indokoltnak tűnő magyarázatokkal életben tartsák mindet. És ez így van jól.


root@playground:/home/trey# cfdisk /dev/tank/fish
root@playground:/home/trey# mkfs.ext2 /dev/tank/fish1

Mi ertelme van ra particiot csinalni? Miert nem egyenesen

mkfs.ext2 /dev/tank/fish

? Vagy csak meg akartad mutatni, hogy ilyet is lehet?

Ó, változnak az idők:

root@playground:/home/trey# mkfs.btrfs -m raid10 -d raid10 /dev/sdb /dev/sdc /dev/sdd /dev/sde

WARNING! - Btrfs Btrfs v0.19 IS EXPERIMENTAL
WARNING! - see http://btrfs.wiki.kernel.org before using

adding device /dev/sdc id 2
adding device /dev/sdd id 3
adding device /dev/sde id 4
fs created label (null) on /dev/sdb
nodesize 4096 leafsize 4096 sectorsize 4096 size 40.00GB
Btrfs Btrfs v0.19
root@playground:/home/trey# mount /dev/sdb /mnt
root@playground:/home/trey# mount
[...]
/dev/sdb on /mnt type btrfs (rw)

:)

--
trey @ gépház

Mármint ilyenre gondolsz?

root@playground:/home/trey/devel/spl# btrfs-show
Label: none uuid: a77118e9-f339-420b-b94a-73ded6e49c6c
Total devices 4 FS bytes used 28.00KB
devid 1 size 10.00GB used 2.03GB path /dev/sdb
devid 2 size 10.00GB used 2.01GB path /dev/sdc
devid 4 size 10.00GB used 2.01GB path /dev/sde
devid 3 size 10.00GB used 2.01GB path /dev/sdd

Btrfs Btrfs v0.19

--
trey @ gépház

Brian Behlendorf olvasta ezt a cikket és adott néhány tanácsot:

Thanks for taking the time to try the packages out write up an article. Let me comment about a few things you can do when installing and building the software which should make your like easier.

First off, if you check out the latest version of the SPL from the git repo and not the last 0.4.9 tagged version there is a fix for the gcc problem. I wish I'd caught that before tagging but that's how it goes sometimes. It will be fixed in the next official tag.

git clone git://github.com/behlendorf/spl.git

Also on ubuntu when you configure the package use the --prefix=/usr/ option and things should get installed in to the right places to avoid the LD_LIBRARY_PATH issue.

Kérte, hogy ellenőrizzem le ezeket. Az spl git verziója tényleg lefordul már az Ubuntu 10.04 alapértelmezett verziójával.

Hamarosan kibővítem a cikket.

--
trey @ gépház

"Also on ubuntu when you configure the package use the --prefix=/usr/ option and things should get installed in to the right places to avoid the LD_LIBRARY_PATH issue."

Akit latom, hogy igy forgatja, annak letornem a kezet. Akkor forogjon igy, ha csomagot generalnak belole, egyebkent meg ne szemetelje ossze a rendszerkonyvtarakat, mert leirthatatlan lesz.
Inkabb az ubuntunak kell bugkent bekuldeni, hogy a rendszer nem latja a /usr/local alatt a konyvtarat. Bar, ami azt illeti, azt hiszem van lehetoseg arra, hogy forgataskor beegessuk a binarisba a fuggosegek forditaskori helyet. Esetleg a fejlesztonek lehetne szolni, hogy igy is meg lehetne oldani a kerdest. Persze, ehhez gcc magia kell....

Btw, nem lehet bonyi dolog csomagot csinalni belole, nem nezted, volt-e mar onkentes vallalkozo?
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.