今週は泣きっ面に蜂であった。
- 月曜日に(固定)電話が壊れ
- 火曜日にプリンターが壊れ....
という感じでいろいろなモノの寿命が尽きて、ついに
- 金曜日にファイルサーバーが壊れ
と相成った。
しかし、こういう時こそものごとを非線形によくするチャンスである。転んでタダで起きるのは弾ではない。特に他は待てるが、ファイルサーバーは待てない。他の直しでもちょっとした発見があったのだが、まずはファイルサーバーの修復、というより大刷新について書いておきたい。
といっても、サーバーをまるごと新調したわけではない。交換したのはディスク、そしてファイルシステム。
- Before
- FreeBSD 6-STABLE
- SATA 250GB x 4
- RAID1 by geom (gmirror)
- UFS2 w/ Softupdate
- After
- FreeBSD 7-STABLE
- SATA 1TB x 4
- raidz by zpool
- zfs root
基本的なやり方は、
と同様なのだが、新規インストールではなく移行であるところが違う。具体的にはこうした。
- まずは起動ディスクを除く三本を交換。RAID1は"degrade"状態だが、何とか使える。
- VMWare Fusionで作っておいたFreeBSD-7-Stable (7.1-PRERELEASE)をインストール。具体的にはrsyncで
/usr/{src,obj}を引っ張ってきてからmake installkernel installworld。 - 上記URLのやり方に沿って作業。ただ残り三本をzfs raidz構成にしているところが異なる。具体的なコマンドは
zpool create tank raidz ad6s1h ad8s1h ad10s1h
"d"でなくて"h"にしたのは単なる趣味の問題。 - そこに片肺飛行中の起動ディスクから中身をリストア。ちなみに"How to install FreeBSD 7.0 under ZFS"では
cpioを使っていたが、私はこれは/のみにとどめ、/homeなどはローカルにrsync -Haxv /home /tankとした。 - zfsrootで再起動
- 最後に残ったディスクを稼働したままま取り外し、交換。起動ディスクはkernelの読み込みにしか使われていないので没問題。
- 他のディスクと同じように
fdisk && bsdlabelして、aパーティションにコピー - このディスクを
zpool add tank spare ad4s1h
としてHot Spare登録 - 該当箇所のfstabだけ直して再起動。最終的な構成は
# 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 ad6s1h ONLINE 0 0 0 ad8s1h ONLINE 0 0 0 ad10s1h ONLINE 0 0 0 spares ad4s1h AVAIL errors: No known data errors
- おつかれさま!
しかしこのZFS、FreeBSD 7で入ったばかりの新機能で、
# dmesg |grep ZFS WARNING: ZFS is considered to be an experimental feature in FreeBSD. ZFS filesystem version 6 ZFS storage pool version 6
という具合にきちんと警告される。しかしそれにも関わらず最重要なサーバーの一つをZFS化したのにはわけがある。
まず一つは、ZFSが私にとって「かくあるべき」ファイルシステムだったこと。softupdateもjournalもいいけど、fsckがなくなったわけではない。もうfsckとの付き合いは20年以上になるが、そろそろお別れしたかったのだ。
しかしそれ以上に大きかったのは、VMWare Fusionできちんと予習をしておけたこと。実機で故障対応を訓練するほどの「ガラージ」がなかった私にとって、これは実に大きかった。上で書いたように、make worldに使ったのも実はこれ。ファイルシステムの演習がノートパソコン上で出来るなんて最高だ。
その時の記録の一部をちょっと披露することにする。
これはVMWare上で、1GBの仮想IDE2本(それぞれbootとswap)と、2GBの仮想SCSIを7本をつなげて、sshでそこに入って作業している時の画面である。見ての通りログインプロンプトだけ。しかし下には仮想SCSIのアイコンが青白く光っている。これがきれいなのなんのって。以下はその時の構成の一例。
# zpool create tank raidz2 da0 da1 da2 da3 da4 da5 da6 # zpool status pool: tank state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 raidz2 ONLINE 0 0 0 da0 ONLINE 0 0 0 da1 ONLINE 0 0 0 da2 ONLINE 0 0 0 da3 ONLINE 0 0 0 da4 ONLINE 0 0 0 da5 ONLINE 0 0 0 da6 ONLINE 0 0 0 errors: No known data errors
これのda6に相当する仮想ディスクを壊すと、こうなった。
# zpool status pool: tank state: ONLINE status: One or more devices could not be used because the label is missing or invalid. Sufficient replicas exist for the pool to continue functioning in a degraded state. action: Replace the device using 'zpool replace'. see: http://www.sun.com/msg/ZFS-8000-4J scrub: resilver completed with 0 errors on Fri Sep 4 22:25:30 2008 config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 raidz2 ONLINE 0 0 0 da0 ONLINE 0 0 0 da1 ONLINE 0 0 0 da2 ONLINE 0 0 0 da3 ONLINE 0 0 0 da4 ONLINE 0 0 0 da5 ONLINE 0 0 0 da6 UNAVAIL 0 0 0 corrupted data errors: No known data errors
見ての通り、単に状態を表示するだけではなく、何を成すべきかそっと教えてくれる。geomに限らず、こういう親切さは*BSDのコマンドには少ないと思う。
# zpool replace tank da6
とすると、
# zpool status pool: tank state: DEGRADED status: One or more devices is currently being resilvered. The pool will continue to function, possibly in a degraded state. action: Wait for the resilver to complete. scrub: resilver in progress, 0.08% done, 1h49m to go config: NAME STATE READ WRITE CKSUM tank DEGRADED 0 0 0 raidz2 DEGRADED 0 0 0 da0 ONLINE 0 0 0 da1 ONLINE 0 0 0 da2 ONLINE 0 0 0 da3 ONLINE 0 0 0 da4 ONLINE 0 0 0 da5 ONLINE 0 0 0 replacing DEGRADED 0 0 0 da6/old UNAVAIL 0 0 0 cannot open da6 ONLINE 0 0 0 errors: No known data errors
となる。あとは放置するだけ。
# zpool status pool: tank state: ONLINE scrub: resilver completed with 0 errors on Thu Sep 4 22:54:18 2008 config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 raidz2 ONLINE 0 0 0 da0 ONLINE 0 0 0 da1 ONLINE 0 0 0 da2 ONLINE 0 0 0 da3 ONLINE 0 0 0 da4 ONLINE 0 0 0 da5 ONLINE 0 0 0 da6 ONLINE 0 0 0 errors: No known data errors
めでたし、めでたし。
もちろん、ZFSを導入したのは、FreeBSD初のRoot Diskとして使えるSoftware RAID5だからだけではない(vinumでもRAID5は組めるが、bootは出来なかった....と記憶している。mirrorはOKで、これに関しては今は亡きBSD Magazineに記事を書いた)。実は導入してからこそが、ZFSの醍醐味なのである。たとえば.....
# zfs get all tank/usr/src NAME PROPERTY VALUE SOURCE tank/usr/src type filesystem - tank/usr/src creation Sat Sep 6 19:31 2008 - tank/usr/src used 168M - tank/usr/src available 1.41T - tank/usr/src referenced 168M - tank/usr/src compressratio 3.26x - tank/usr/src mounted yes - tank/usr/src quota none default tank/usr/src reservation none default tank/usr/src recordsize 128K default tank/usr/src mountpoint /usr/src local tank/usr/src sharenfs off default tank/usr/src checksum on default tank/usr/src compression gzip local tank/usr/src atime off inherited from tank tank/usr/src devices on default tank/usr/src exec on default tank/usr/src setuid on default tank/usr/src readonly off default tank/usr/src jailed off default tank/usr/src snapdir hidden default tank/usr/src aclmode groupmask default tank/usr/src aclinherit secure default tank/usr/src canmount on default tank/usr/src shareiscsi off default tank/usr/src xattr off temporary tank/usr/src copies 1 default
そう。ファイルシステムごとに属性を変えられるのである。容量を損なうことなしに。圧縮率を見てほしい。単にディスクの節約になるだけではなく、それだけディスクへのアクセスが減るので高速でもある。
ZFSの魅力を語るには、1 entryではとても足りない。しかし新ファイルシステムの導入というのは、どんな手練にとっても、期待以上に恐怖が勝るもの。背中を押してくれたのは、ネット上の適切な情報と仮想マシン。いい時代になったものです。ZFSをもたらしてくれたSunと、それをFreeBSDにもたらしてくれたpjdと、「人柱」のみなさんに感謝を!そしてfsckにさよならを!
Dan the ZFS Advocate
竹本淳一 サヤは、よく貴殿のHP見てます。
応援してます!記念カキコ。
アマゾン 出版 希望!