2009年12月12日土曜日

ただいまZFSの準備中

amd64なFreeBSD 8.0-RELEASEだとZFSの具合がよろしいらしい、ということで、本当に使い物になるのか、ちょっと試しています。



過去記事 (FreeBSD) はじめてのZFS



まずは、NFSサーバーにして、ZFSな領域に他のホストからアクセスできるようにしたいです。



/storage/hogeというのを作りました。



# zfs create storage/hoge
# df /storage/hoge
Filesystem     1K-blocks  Used      Avail Capacity  Mounted on
storage/hoge 4299005312    0 4299005312     0%    /storage/hoge



zfsのマニュアルを参考にしながら・・・
http://www.freebsd.org/cgi/man.cgi?query=zfs&manpath=FreeBSD+8.0-RELEASE



ttt.example.comというホストからのrootアクセスを許可するには、これでいいのかな?



# zfs set sharenfs='root=ttt.example.com' storage/hoge



確認してみると



# showmount -e
Exports list on localhost:
/usr                               nhh.example.com
/mnt_cd                            192.168.0.0



だめっぽい。/usrと/mnt_cdは、/etc/exportsで元々指定してあったものであり、/storage/hogeが現れない。



一応ためしてみるけど・・・だめだった。



ttt.example.com # mount -t nfs サーバー:/storage/hoge /mnt
[tcp] サーバー:/storage/hoge: Permission denied
[tcp6] サーバー:/storage/hoge: Permission denied



もっとシンプルな設定で試してみる。



# zfs set sharenfs=on storage/hoge



これでもだめだった。



というわけで、なんとなく、OSを再起動した。



すると今度は、なんかよさげ



% showmount -e
Exports list on localhost:
/usr                               nhh.example.com
/storage/hoge                    Everyone
/mnt_cd                            192.168.0.0



でも、Everyone、つまりどこからでもアクセス可能、ってんじゃ実用的ではない。



というわけで、アクセス制限つきでやってみようと思うんだけど・・・



# zfs set sharenfs='rw=ttt.example.com,root=ttt.example.com' storage/hoge



なぜかうまくいかない。



# showmount -e
Exports list on localhost:
/usr                               nhh.example.com
/mnt_cd                            192.168.0.0



ところが、sharenfs='on'なら大丈夫なんだよなぁ~



# zfs set sharenfs='on' storage/hoge
# showmount -e
Exports list on localhost:
/usr                               nhh.example.com
/storage/hoge                    Everyone
/mnt_cd                            192.168.0.0





いろいろ調べているうちに、仕組みがわかってきました。



zfs set sharenfs=~を実行すると、/etc/zfs/exportsというファイルに設定が書き込まれます。



# cat /etc/zfs/exports
# !!! DO NOT EDIT THIS FILE MANUALLY !!!



/storage/hoge rw=ttt.example.com root=ttt.example.com


mountdを再起動すればよい、みたいな話もあるようです。



# /etc/rc.d/mountd onerestart
Stopping mountd.
Starting mountd.



・・・で、気がつきました!!!



# ps axww | grep mount
1686  ??  Ss     0:00.01 /usr/sbin/mountd -r /etc/exports /etc/zfs/exports



ああ!/etc/zfs/exportsって、mountdがそのまま読み込んでいるんですね。



ということは、さっきの/etc/zfs/exportsの書式では、まずいじゃないですか。/etc/exportsのときと同じ書式で、sharenfs="..."を指定すればいいんじゃないかと。



こんな感じではないかと・・・



# zfs set sharenfs='-maproot=0 ttt.example.com' storage/hoge
# cat /etc/zfs/exports
# !!! DO NOT EDIT THIS FILE MANUALLY !!!



/storage/hoge -maproot=0 ttt.example.com
# showmount -e
Exports list on localhost:
/usr                               nhh.example.com
/storage/hoge                    ttt.example.com
/mnt_cd                            192.168.0.0



あ~、やっとできました。



やっとこさ、zfsな部分を、NFS exportする方法がわかりました。



これって、zfsのマニュアルに書いてある内容が、間違っているんじゃないか?!
というか、あれって、もしかして、Solaris10のマニュアルそのまんまなんじゃないかという気がしてきました。
あのexportsの書式は、Solarisのもの・・・なんじゃないですか?





さっそく、動作テスト。



よーし、おもいっきり負荷かけちゃうぞ~



NFS serverは、FreeBSD 8.0-RELESAE amd64で、ZFS
NFS clientは、FreeBSD 7.2-STABLE i386



tarで、clientからserverへ、でかいファイルをどかどかコピーしてみました。



えーとですね・・・しばらくして、NFS server側が、kernel panicして止まってました。



NFS server側のログ

Dec 10 17:55:27 hoge kernel: ad6: TIMEOUT - WRITE_DMA48 retrying (1 retry left) LBA=560749130
Dec 10 17:55:50 hoge kernel: ad8: TIMEOUT - FLUSHCACHE48 retrying (1 retry left)
Dec 10 17:55:56 hoge kernel: ad6: TIMEOUT - FLUSHCACHE48 retrying (1 retry left)
Dec 10 17:56:20 hoge kernel: ad8: TIMEOUT - FLUSHCACHE48 retrying (1 retry left)
Dec 10 17:56:29 hoge kernel: ad8: TIMEOUT - FLUSHCACHE48 retrying (1 retry left)
Dec 10 17:56:48 hoge kernel: ad6: TIMEOUT - WRITE_DMA48 retrying (1 retry left) LBA=1111238095
Dec 10 17:56:57 hoge kernel: ad8: TIMEOUT - WRITE_DMA48 retrying (1 retry left) LBA=1111235017
Dec 10 17:57:13 hoge kernel: ad8: TIMEOUT - FLUSHCACHE48 retrying (1 retry left)
Dec 10 17:57:20 hoge kernel: ad6: TIMEOUT - FLUSHCACHE48 retrying (1 retry left)



なにこれ?



NFS client側のログ
Dec 10 17:55:48 ttt kernel: nfs server hoge:/storage/hoge: not responding
Dec 10 17:55:50 ttt kernel: nfs server hoge:/storage/hoge: is alive again
Dec 10 17:56:46 ttt kernel: nfs server hoge:/storage/hoge: not responding
Dec 10 17:57:13 ttt kernel: nfs server hoge:/storage/hoge: is alive again
Dec 10 17:59:57 ttt kernel: nfs server hoge:/storage/hoge: not responding
Dec 10 18:00:28 ttt last message repeated 8 times
Dec 10 18:02:31 ttt last message repeated 67 times
Dec 10 18:12:36 ttt last message repeated 399 times


まだ、ZFSは、安心して使うことはできないのか?!





気のせいかもしれない、ということで、もうちょっと負荷テストをつづけていて、変なことに気がつきました。



それは

zfs上にあるisoイメージをmdconfigしてmountすると、書き込み中のNFS client側で、permission deniedというエラーが出る。

というもの。



NFSサーバー側で、



# mdconfig -a -t vnode -f /storage/tmp/8.0-RELEASE-amd64-disc1.iso
md1
# mount -t cd9660 /dev/md1 /mnt_cd



とやったとたん、NFSクライアント側(必死に、ファイルをtarで書き込んでいる最中)



x data1/nantoka/kantoka: Write failed: Permission denied: Permission denied



という感じで、Permisson deniedというエラーが出ます。



ちなみに、isoイメージが、UFSなところにある場合は・・・



# mdconfig -a -t vnode -f /usr/local/8.0-RELEASE-amd64-disc1.iso
md2
# mount -t cd9660 /dev/md2 /mnt_cd



大丈夫でした。





make buildworldでもしてみますか。



/usr/src、/usr/objをzfsにしてみる。



まず、src、objを作る。



# zfs create storage/src
# zfs create storage/obj



すると



# mount
~略~
storage/src on /storage/src (zfs, local)
storage/obj on /storage/obj (zfs, local)



となっていますが、マウント場所を変更できます。



# zfs set mountpoint=/usr/src storage/src
# mount
~略~
storage/obj on /storage/obj (zfs, local)
storage/src on /usr/src (zfs, local)



/usr/srcになりました。



同様に
# zfs set mountpoint=/usr/obj storage/obj



なるほどね。zfsっておもしろい。



# zfs list
NAME             USED  AVAIL  REFER  MOUNTPOINT
storage          121G  3.89T   658M  /storage
storage/hoge   121G  3.89T   121G  /storage/hoge
storage/obj     26.9K  3.89T  26.9K  /usr/obj
storage/ports    198M  3.89T   198M  /storage/ports
storage/src     26.9K  3.89T  26.9K  /usr/src



sysinstallでsrcを展開して、make buildworldしてみて、zfsに、それなりに負荷をかけて試験してみました。大丈夫そうだったんですが、別件で、問題発生???



裏では、NFSクライアントが、ひきつづき、ファイルを書き込みつづけていたんですが、突然、ネットワーク・アクセスができなくなりました。



ドライバif_reなんですが、いろいろ試行錯誤しているうちに、わかったのが



ifconfig re0 down ; sleep 5 ; ifconfig re0 up



とかやると、また通信できるようになるが、数秒~数十秒すると、また通信できなくなる。



あとは何度やっても、このくりかえし・・・でした。



突然、通信できなくなったのは、if_reが悪いのか、zfsが悪いのか・・・



ちなみに、サーバーとクライアントをひっくり返して



NFS Server = 7.2-STABLE UFS
NFS Client = 8.0-RELEASE ZFS



client側で、rsyncでコピーしたら(tarを使わなかったのは、差分コピーをしたかったから)、大丈夫でした。



これって、zfsのせいですか?






■ 関連記事







0 件のコメント:

コメントを投稿