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 件のコメント:
コメントを投稿