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 最強。