今週は泣きっ面に蜂であった。

  • 月曜日に(固定)電話が壊れ
  • 火曜日にプリンターが壊れ....

という感じでいろいろなモノの寿命が尽きて、ついに

  • 金曜日にファイルサーバーが壊れ

と相成った。

しかし、こういう時こそものごとを非線形によくするチャンスである。転んでタダで起きるのは弾ではない。特に他は待てるが、ファイルサーバーは待てない。他の直しでもちょっとした発見があったのだが、まずはファイルサーバーの修復、というより大刷新について書いておきたい。

といっても、サーバーをまるごと新調したわけではない。交換したのはディスク、そしてファイルシステム。

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に使ったのも実はこれ。ファイルシステムの演習がノートパソコン上で出来るなんて最高だ。

その時の記録の一部をちょっと披露することにする。

zfs@vmware

これは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