ZFSを試してみる
2009/05/05 22:30 posted by kunkichi
世の中はGW真っ最中ですが、こういうときに限って風邪を引いてしまい、昨日まで寝込んでいました。休み前の忙しさの疲れがドッと出たのかなぁ、、、とりあえず、ずっと寝てたので腰が痛い、アタタタタ、、、
でも今日は熱も下がってやっと回復してきたので、前から気になっていた ZFS を試してみました。
環境
- サーバは前にヤフオクで買った Sun Fire V120。この日のために、元々ディスク1本だったのを、これまたヤフオクで2本目を用意しておきました。36GB玉です。
- OS はもちろん Solaris10 10/08 for SPARC!FreeBSD やOpenSolaris でもできるのだけど、ここはやっぱりネイティブなOSで。
- ディスクは2本なのでRAID1(ミラー)。
ZFSの手順を紹介しているサイトをいろいろ調べてみたけど、どこも大体、既に稼働しているシステムに新たにディスクを追加してその領域だけでZFSを試してる場合が多いみたいで、ルートファイルシステムのディスクは別にあってそっちはZFSにしてなかったりするんだよね。
Sun Fire V120の場合、ディスクは2本だけなので、ルートファイルシステム自体ZFSでミラーにできないと、ZFSを使う意味がない。ということで、目的としては、一般的な Solaris のソフトウェアRAID方式だけど、いろいろめんどくさい Solaris Volume Manager(旧DiskSuite)と比較したいと思います。
手順
- まずはディスク1本だけでSolaris10をインストール。
基本的には通常通りのインストール手順でOK。
UFS か ZFS かを聞かれたときにZFSを指定する。
あと、UFSのときはスライス(一般的にいうパーティション)を細かく切ってからやるのが普通だと思うのだけど、ZFSの場合は1スライスにしちゃうみたいで、ここはちょっと面食らった。まあ確かにスライスごとの容量の概念自体がZFSでは「ない」ようなので当然かも。
ということでスライスをどう切るか?みたいな選択はインストーラではほとんどないに等しいのだけど、/ と /var を分けるか?というオプションはあったので、ここはなんとなく分けておいた。
- OSインストールが終わって起動してきたらいろいろ確認してみる。
- まず現在のZFSプールの一覧を zpool list で確認する
# zpool listrootプールであるrpoolが一つだけ。容量もディスク全部になっているので、まるまるZFSのプールになっていることがわかる。
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
rpool 33.8G 5.66G 28.1G 16% ONLINE -
- 次にZFSプールの状態を zpool status で確認
# zpool status1本目のディスク(c1t0d0s)のみがプールに属している状態ということがわかる。
プール: rpool
状態: ONLINE
スクラブ: 何も要求されませんでした
構成:
NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
c1t0d0s0 ONLINE 0 0 0
エラー: 既知のデータエラーはありません - df -kの結果
ファイルシステム kbytes 使用済み 使用可能 容量 マウント先
rpool/ROOT/s10s_u6wos_07b
34836480 4799940 28392451 15% /
/devices 0 0 0 0% /devices
ctfs 0 0 0 0% /system/contract
proc 0 0 0 0% /proc
mnttab 0 0 0 0% /etc/mnttab
swap 1054048 1304 1052744 1% /etc/svc/volatile
objfs 0 0 0 0% /system/object
sharefs 0 0 0 0% /etc/dfs/sharetab
fd 0 0 0 0% /dev/fd
rpool/ROOT/s10s_u6wos_07b/var
34836480 69509 28392451 1% /var
swap 1052744 0 1052744 0% /tmp
swap 1052776 32 1052744 1% /var/run
rpool/export 34836480 20 28392451 1% /export
rpool/export/home 34836480 24 28392451 1% /export/home
rpool 34836480 94 28392451 1% /rpool
rpool自体が/rpoolとしてマウントされている。で、その中の個々のディレクトリがマウントされている感じ?以前はスライスに分けてマウントしていたような、/、/var、/exportなどは、一応マウントされて入るけど、/rpool配下にあるのがマウントされているだけだし、/ と /var は /rpool配下のROOTディレクトリ配下がマウントされてる。なーんかよくわからん。
- まず現在のZFSプールの一覧を zpool list で確認する
- vfstabの内容
#device device mount FS fsck mount mountvfstabには 全くといっていいほど記載がないね。vfstabによる設定は不要みたいなことが書いてあったけど、ここまでまったくないとは思わなかった。
#to mount to fsck point type pass at boot options
#
fd - /dev/fd fd - no -
/proc - /proc proc - no -
/dev/zvol/dsk/rpool/swap
- - swap - no -
/devices - /devices devfs - no -
sharefs - /etc/dfs/sharetab
sharefs - no -
ctfs - /system/contract
ctfs - no -
objfs - /system/object
objfs - no -
swap - /tmp tmpfs - yes - - 結局のところ、1スライス(/rpool)で切っているので、今までやってたような個々のスライスの容量は意味がなくなってくる。
- df の出力はもうほとんど意味を持たないかも。
- 上にも書いたけど、/と/varはrpool配下のROOT/s10s_u6wos_07b以下なんだけど、/exportと/export/home はrpool直下。この違いは何?
- ディスク2本目を追加して、スライスを切る。
$ format -e事前に1本目のディスクのスライスを確認しておいたのだけど、やっぱり1スライスだけ切って全部割り当ててありました。従って2本目も同じように切ります。
・・・
>p
・・・
Part Tag Flag Cylinders Size Blocks
0 unassigned wm 0 - 49394 33.92GB (49395/0/0) 71128800
1 unassigned wu 0 0 (0/0/0) 0
2 backup wu 0 - 49394 33.92GB (49395/0/0) 71128800
3 unassigned wm 0 0 (0/0/0) 0
4 unassigned wm 0 0 (0/0/0) 0
5 unassigned wm 0 0 (0/0/0) 0
6 unassigned wm 0 0 (0/0/0) 0
7 unassigned wm 0 0 (0/0/0) 0
・・・スライスを切り終わったらlabelする。
> label実はここでかなりはまったんだけど、ディスクのlabelの仕方には二種類あって、新しいより拡張性のあるEFIラベル(1TB以上のディスクとか扱える)ではなくて、昔からあるSMIラベル(VTOCラベル)でないと、rootファイルシステムのZFSミラーはできない、らしいです。(format -eだと両方のラベルを扱える)
[0] SMI Label
[1] EFI Label
Specify Label type[0]:
Ready to label disk, continue? y最初にどうやって追加するかもよくわかんなくていろいろやってるうちに勝手にEFIラベルでlabelしちゃってたみたいで、こんな風になってました。
Part Tag Flag First Sector Size Last Sectorこれ自体はEFIラベルでlabelした場合にはこうなるのでおかしくはないのだけど、なんせ見たことなかったもんで(笑)スライス8消せねーとか言いながら、はまってた訳です(苦笑)formatコマンドも-eオプションつけずに実行してたので今となってはそのときの状況が既によく見えませんが、とりあえず、ZFSのrootプールでは、
0 usr wm 34 33.91GB 71116541
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 71116542 8.00MB 71132925- format コマンドは -e オプションをつけて実行
- スライス0に全部割り当て。
- labelはEFIではなく、SMIで。
と覚えておけば大丈夫ですかね。
- なんとかスライスを切れたので、既存のrootファイルシステムのプールに2本目のディスクをミラーとして追加します。
# zpool attach -f rpool c1t0d0s0 c1t1d0s0特にエラーがなければ何も表示されません。
zpool statusで状態を確認してみます。# zpool statusミラーの同期が行われます。Solaris Volume Manager のころはこの同期に死ぬほど時間がかかったのだけど、ZFSは早いです。数分で終わります。
プール: rpool
状態: ONLINE
状態: 1 つまたは複数のデバイスの再同期化が進行中です。
プールはおそらく縮退状態で動作を継続します。
アクション: 再同期化が完了するまでお待ちください。
スクラブ: resilver が 0h0m で進行中、3.53% 完了、0h4m 開始待ち
構成:
NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
mirror ONLINE 0 0 0
c1t0d0s0 ONLINE 0 0 0
c1t1d0s0 ONLINE 0 0 0
エラー: 既知のデータエラーはありません# zpool status同期が終わりました。
プール: rpool
状態: ONLINE
スクラブ: Tue May 5 20:44:04 2009
上で 0 エラーが発生した 0h5m のあとの resilver completed構成:
NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
mirror ONLINE 0 0 0
c1t1d0s0 ONLINE 0 0 0
c1t0d0s0 ONLINE 0 0 0
エラー: 既知のデータエラーはありません - 同期が終わったら、2本目のディスクからも起動できるようにbookblkを2本目のディスクにコピーします。なんかこの辺LinuxのソフトウェアRAIDでgrubをインストールするのと似てますね。
# installboot -F zfs /usr/platform/`uname -i`/lib/fs/zfs/bootblk /dev/rdsk/c1t1d0s0 - RAIDミラーが正しく構築されているかを確認するために、一旦電源を落として、1本目のディスクを抜いて、2本目だけで起動できるかを確認してみます。ほんとは強制的に引っこ抜いてもいいのだけど、さすがに故障すると怖いので。。。
まずシャットダウン
# shutdown -y -i0 -g0物理的に1本目のディスクを抜きます。一応、念のためにブートデバイスの設定を確認しておきます。OKプロンプトでprintenv boot-deviceを実行。(というか実はPROMのboot-deviceの設定に2番目のディスクが含まれていなかったことに気づかず、一回起動に失敗したことは内緒です)
okprintenv boot-device最初の長いのが1本目のディスク、2番目の”disk”は1本目のディスクを指定するエイリアス。ちなみにエイリアスを確認するにはPROMでdevaliasを実行します。
/pci@1f,0/pci@1/scsi@8/disk@0,0:a disk net
ok devaliasこれをみると、1本目のディスクが”disk”、2本目のディスクは”disk1″となっています。これに併せてさっきの設定をみると、最後がネットワークブートなので、ブートデバイスの順序は、1本目のディスク→1本目のディスク→ネットワークブート、となっており、2本目のディスクがブートでバイスとして含まれていないので、このままだとブートしてもブートデバイスが見つからないということで失敗します。
・・・
disk /pci@1f,0/pci@1/scsi@8/disk@0,0
disk3 /pci@1f,0/pci@1/scsi@8/disk@3,0
disk2 /pci@1f,0/pci@1/scsi@8/disk@2,0
disk1 /pci@1f,0/pci@1/scsi@8/disk@1,0
disk0 /pci@1f,0/pci@1/scsi@8/disk@0,0
・・・
では2本目のディスクをブートデバイスとして含めてあげます。ブートデバイスの変更はsetenvでboot-deviceを指定します。さっきのエイリアスを見ると、disk1というのがそれにあたるので、コマンドは以下。setenv boot-device disk disk1 net長ったらしいのは、結局”disk”と同じなので外しました。
最後にこの設定をNVRAMに記憶しておくために、nvstoreを実行します。ok nvstore
では起動します。ok boot最初は”disk”(1本目のディスク)からブートしようとして失敗して、次に”disk1″(2本目のディスク)から起動しているのがわかりますねー。とりあえず起動してきました。
Sun Fire V120 (UltraSPARC-IIe 648MHz), No Keyboard
OpenBoot 4.0, 1024 MB memory installed, Serial #59084701.
Ethernet address XX:XX:XX:XX:XX:XX, Host ID: 83858f9d.
Executing last command: boot
Drive not ready
Can't read disk label.
Can't open disk label package
Boot device: disk1 File and args:
SunOS Release 5.10 Version Generic_137137-09 64-bit
Copyright 1983-2008 Sun Microsystems, Inc. All rights reserved.
Use is subject to license terms.
SUNW,eri0 : 100 Mbps full duplex link up
Hostname: XXX.YYY.com
Reading ZFS config: done.
Mounting ZFS filesystems: (6/6)
XXX.YYY.com console login: - 正常に起動しているか銅貨を確認するために、片方のディスクだけで起動した状態でZFSのプールの状態を確認してみます。
プール: rpool1本目のディスクが見えないので「縮退」状態になってますが、少なくともこれで片方のディスクに障害が起きても問題なく起動してくることがわかりました。
状態: DEGRADED
状態: 1 つまたは複数のデバイスを開くことができませんでした。
十分な複製が存在するため、プールは縮退状態で動作を継続できます。
アクション: 見つからなかったデバイスを接続し、'zpool online' を使用してオンライラインにしてください。
次のサイトを参照してください: http://www.sun.com/msg/ZFS-8000-2Q
スクラブ: 何も要求されませんでした
構成:
NAME STATE READ WRITE CKSUM
rpool DEGRADED 0 0 0
mirror DEGRADED 0 0 0
c1t1d0s0 ONLINE 0 0 0
c1t0d0s0 UNAVAIL 0 0 0 オープンに失敗しました。
エラー: 既知のデータエラーはありません
次に新しいディスクを追加して元のミラー状態に戻します。新しいディスクを接続してformatコマンドでスライスを切り直す必要がありますが、プールに属しているとformat等が実行できないので、一旦プールから削除します。# zpool detach rpool c1t0d0s0その後、format -eコマンドを実行してスライスを切り直します。SMIラベルでlabelすることを忘れないように。
切り直したら再度プールに追加します。# zpool attach -f rpool c1t1d0s0 c1t0d0s0今度はデバイスの指定が逆になりますね。
最後に2本目のディスクを追加したときと同じようにbootblkをコピーします。# installboot -F zfs /usr/platform/`uname -i`/lib/fs/zfs/bootblk /dev/rdsk/c1t0d0s0これで終わりです。
とりあえずZFSの第一印象としては、
というところかなぁ。この辺はちょっと置いといてとりあえず先に進めます。
最後ちょっと駆け足になっちゃった感がありますが、確かにZFSらくちんです。同期も早いし、Solaris Volume Managerと比べてコマンドや設定が直感的な感がします。
ただし、これまでのスライス(パーティション)単位的な考え方とは全く異なるので、その辺り、ちょっと受け入れ難い人もいるかもしれないです、bootblkをディスクごとにコピーするあたり、あんまりこなれてない気もしますし。
ただそれを差し引いてもこのらくちん差には逆らえないものがあります。
あとは、ヘビーな壊れ方をしたときにどうなるか?とか、書き込みのパフォーマンスとかが気になりますね、この辺がある程度クリアになれば十分本番運用でも使えそうですが、この辺は実際に動かしてノウハウを蓄積していかないとわからないところですね。まずはあまりクリティカルな用途ではないサーバで運用してみようかと思います。






コメント&トラックバック
トラックバックURL: