HDD増強 with gmirror

gentei.orgの主サーバマシン はこれまで250GBのRAID1構成だったが、手狭になって来た。てことで、 Seagate ST31000333AS の2台体勢に移行。追加ではなく置き換え。 既存のパーティションはサイズを大きくした上で引っ越したい。 というときには gmirror と growfs が大活躍。データコピーの間は ほとんどマルチユーザモードのままで行ける。パーティション全部の データコピーはコピー中にコピー元が書き換えられていないかを 保証したりあとで確認したりするのが一番たいへんなのだが、 gmirrorでパーティションレベルコピーをするとその辺心配しなくて よいのが楽すぎ。

たとえば元のパーティションが

gmirror status foo
       Name    Status  Components
 mirror/foo   COMPLETE  ad0s1e
                        ad1s1e

だとする。新しいSATA-HDDを装着したらパーティションを新しいサイズで 作成する。新しいパーティションは ad4s1e ad6s1e でどちらも同じサイズ。 まずはmirror/fooに1台を追加する。

gmirror insert foo ad4s1e
gmirror status foo
       Name    Status   Components
 mirror/foo  DEGRADED    ad0s1e
                         ad1s1e
                         ad4s1e (55%)

statusを見続けて、同期が終わったらad4s1eをgmirrorから外してgrowfs して、元のmirror/fooをそれだけで作り直す。

shutdown now         (シングルユーザモードに落とす)
umount -a
gmirror remove foo ad4s1e
growfs /dev/ad4s1e        (外してgrowfs)
fsck -y /dev/ad4s1e       (念のため)
gmirror remove foo ad0s1e
gmirror remove foo ad1s1e (これでfooが消える)
gmirror label -v -b split foo ad4s1e 
exit                 (マルチユーザモードに復帰)

練習してから手際よくやれば1〜2分くらいの停止でOK。

2011/9 追記: 以下のgmirrorのネスト技はFreeBSD 8 以降ではリブートを挟むと認識されなくなることがあるので注意。 ネストしたgmirrorは臨時のものとして使う必要がある。

さて、うちの場合は gmirror で作成したパーティションにさらに bsdlabelを書いて複数パーティションを使っていたので面倒になってしまってい た。つまり、mirror/m0 というgmirrorのコンポーネントを作ったら

bsdlabel -w mirror/m0
bsdlabel -e mirror/m0

して、mirror/m0{a,e,f,g} なんかを使っていた。そうすると上記のような gmirror insert, gmirror remove, growfs の手順が使えない。おまけに ここが結構巨大なパーティションで普通にコピーしたらすっげー時間かかるから なんとか gmirror に同期を取らす形でコピーしたい。

はい、そんなときは gmirror 上のパーティションをさらに gmirrorに乗せてコピーするですよ。

たとえば、mirror/old0e というパーティションを mirror/new0e というもっと大きなパーティションに引っ越ししたいとする。 まず、mirror/old0e をさらにgmirrorで包含するようなコンポーネントを作って しばらくそっちをマウントして運用する。先に /etc/fstab を書き換えておく。
例:

/dev/mirror/old0e	/bigdisk	ufs	rw
   ↓
/dev/mirror/tmp		/bigdisk	ufs	rw

mirror/old0eを1プロバイダとしてgmirrorを構築。

shutdown now
umount -a
gmirror label -v -b split tmp mirror/old0e
gmirror insert tmp mirror/new0e
exit           # マルチユーザモードに戻せる

gmirror status tmp を観察しながらしばらく待って同期が終わったら 今度は mirror/tmp を解除して mirror/new0e を拡げる。

shutdown now
umount -a
gmirror remove tmp mirror/old0e
gmirror remove tmp mirror/new0e
growfs /dev/mirror/new0e
fsck -y /dev/mirror/new0e

new0eがマウントできることを確認したらfstabを

/dev/mirror/tmp		/bigdisk	ufs	rw
   ↓
/dev/mirror/new0e	/bigdisk	ufs	rw

に更新してマルチユーザモードに戻す。ポイントは gmirrorパーティションはネストできるということと、gmirrorに参加する 前とあとで同じファイルシステムを継続できるということ。gmirror 最強。