ttt

getttyent

ただいまZFSの準備中

2009-12-11 23:57:15 | デジタル・インターネット

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のせいですか?

■ 関連記事