2008年09月07日 19:00 [Edit]

雨降って地固まり、geom mirrorが壊れてZFSを導入する

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

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

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

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

と相成った。

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


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

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


この記事へのトラックバックURL

この記事へのトラックバック
というわけで、zfs導入以来初の「本当」のディスク破損&修復のレポートです。 導入に関しては、以下を参照してください。 404 Blog Not Found:雨降って地固まり、geom mirrorが壊れてZFSを導入する
tips - zfs raidz修復の実際【404 Blog Not Found】at 2009年04月17日 03:21
その壊れた HP Photosmart 2610 の代替機として買ったのがこちらなのだけど.... HP Officejet J6480 All-in-One ヒューレット・パッカード 404 Blog Not Found:雨降って地固まり、geom mirrorが壊れてZFSを導入する火曜日にプリンターが壊れ.... これの満足....
(あまり)プリントしない人も満足 - HP Officejet J6480【404 Blog Not Found】at 2008年09月18日 17:47
この記事へのコメント
竹本淳一 サヤ です。
竹本淳一 サヤは、よく貴殿のHP見てます。
応援してます!記念カキコ。
アマゾン 出版 希望!
Posted by 竹本淳一 サヤ at 2008年09月14日 07:34
対談、拝見させてもらいました。小飼さんには、若さとパワーがあるなぁ。。と感じました。悪いことは重なるものですね。機械のトラブルなどめげず、がんばって下さい。
Posted by 和美 at 2008年09月11日 13:39
体調崩したり、PCの調子が悪くなったりしたときには、素直に休息を取ると言うのもありかと思います。ただでは転ばないのも弾さんらしいですが。

私も弾さんの真似させていただき書評を書いております。
http://ameblo.jp/spcacctg/
Posted by Kano at 2008年09月10日 09:00
釈迦に説法ですが、電圧は大丈夫?
お住まいからしてまさかとは思うけど。
Posted by maru at 2008年09月09日 10:19
同じく ZFS on FreeBSD 7-STABLE で暫く運用してたけど
あまりに kernel panic 頻出だったんで GEOM に戻した俺にとっては
アンタも「人柱」だから。
Posted by hoge at 2008年09月08日 01:20
ZFSもうFreeBSDでも実用に耐えるようになったと判断できたんですね。
Posted by sakurada at 2008年09月08日 01:03
DANさんまた本書いてる?かと思った。
収穫の季節、DANさんの土地の色も黄金に染まりますように。
Posted by . at 2008年09月08日 00:19
週間ダイヤモンド読みました。。
なんだか若い方だと誤解していましたので、
安心しました。

いいですね、骨っぽい感じがしました。

本を掛け算ととらえているのは感心、、。

どんどん紹介して下さいよい作品を!!!!

私も、読んで、学び、ブログで紹介します。。
Posted by マエムキ大吉 at 2008年09月07日 20:56