L
次のページ
H
前のページ
U
上のページ

« アラームは付いてない | Main | 今すぐ欲しいハイテクアイテム »

2009年03月16日

OpenSolaris で rpool をミラーにするにはどうしたらいいのか

最近、zfs という先進的なファイルシステムを使いたくて、あるサーバに OpenSolaris を載せて、元々のサーバはそっくり VirtualBox のゲスト OS に移行することを目論んでいます。でもその肝心の zfs で、ルートとなる rpool のミラーにかなり悩みました。


zfs は凄いぞ

zfs はミラーリングや raid 化、あるいは複数のディスクを一つのファイルシステムにまとめあげる仮想化をシンプルな操作で実現できるだけでなく、スナップショットをとって、Mac OS X の TimeMachine のように幾つもの過去の状態をバックアップでき、しかもそれへの復元がものの数秒で終わるといいます。すんごいファイルシステムなのです。

ということは、ミラーリングや raid によってハードウェア的な障害に一定の担保をした上で、そこに乗っかるデータという意味でのソフトウェア的な障害に対しても担保できるわけです。更にディスク容量が必要になれば後付けでディスクを買ってきてポイっと繋げてポイっとコマンドを打てばもう終わり。これはもう使ってみたいみたい病発症要因として十二分なのであります。

試してみる

もともと OpenSolaris は Mac の Parallels のゲスト OS としてインストールしてありました。zfs によるミラーリングをするためにはディスクが複数無いとならないので、そこで試すとしたらもう一つ仮想ディスクを増やしてやることになります。でももう Mac のディスクにも Parallels 用の外付けディスクにもあまり空き容量がないので、会社の Windows マシンに VirtualBox をインストールしてそこに OpenSolaris をインストールして試してみました。

最新版の OpenSolaris 2008.11 版では、最初からインストール先のディスク(あるいはパーティション)を丸ごと使った rpool というストレージプールができるようになっています。ストレージプールというのは複数のディスクを一つのようにまとめあげたものだったり、ミラーリングや raid で冗長化してあるものだったりする、zfs での管理や使用の単位のことです。まずはこの rpool に二つ目のディスクをミラーリング用途に追加するのが目標です。

OpenSolaris のどのドキュメントを見てもやり方は至って簡単です。同じ容量のディスクが二つ繋いであって、一つ目のディスクを丸ごと OpenSolraris 用としてインストールした状態では次のようにすればよいとのこと。

zpool attach rpool c3d0s0 c3d1s0

しかし二つ目のディスクが Solaris 用になっていないとのことで NG でした。これは直ぐにわかりました。fdisk コマンドでパーティションをきってやればよいのです。fdisk コマンドにはデバイスファイルを指定する必要があり、具体的にどのデバイスファイルかを調べるには /var/adm/messages にあるログを調べることになります。しかしそれは面倒なので代わりに format コマンドを使用するとよいです。

詳しい手順は後で正解を書くので省略して、とにかく二つ目のディスクの全体を Solaris 用にして、そこに区切られるスライスも一つ目(番号 0)に可能な限り容量を確保してからもう一度 zpool コマンドを実行すると、

/dev/dsk/c3d1s0 overlaps /dev/dsk/c3d1s2

と出てきます。

まあそうかもしれませんね。対話モードの format コマンドの中の partition コマンドで表示されたスライスの状態ではスライス 2 がディスク全体を覆っていました。このメッセージとともに -f オプションを使えと書いてあるので使ってみることにします。

zpool attach -f rpool c3d0s0 c3d1s0

すると今度は

cannot attach c3d1s0 to c3d0s0: device is too small

なんだってぇ。

いやあそう言われても、スライスの分割でスライス 9 に勝手に 2 シリンダほど使われてしまいましたし、ドキュメントを漁るとそれは操作できない(してはいけない)スライスだということですし…いったいどうしろというのでしょうか?

OpenSolaris のディスカッションフォーラムで見つけたスレッドでも同じように困っている人がいました。もうどこのスレッドだったか忘れてしまったのですが、それに付いたアドバイスは format コマンドで二つ目のディスクのスライス 0 に容量を集めてからやれというものでした。そうやってできないから質問者も(そして僕も)困っているというのに。

解法はあった

とにかくスライスの切り方がインストールで使用された一つ目のディスクと、インストール後に付加しようとしている二つ目のディスクが合わないからこうなっているわけです。それを合わせてやればよいと基本方針を立てました。

しかし、そのやりかたがわかりません。やり方を見つけ出すまでの間、本番に使おうとしているマシンで、dd コマンドで一つ目のディスクの内容をそっくりそのまま二つ目のディスクにコピーすることにしました。そっくり同じ内容ならスライスの切り方も同じになるはずです。でもこれはとても時間がかかる操作ですし、容量が必要に応じて増えるタイプの仮想ディスクに行うと、多分、仮想ディスクファイルの大きさは使っている分だけに収まらなくなると予想したからです。もっとちゃんとした方法は VirtualBox の OpenSolraris の方で探すことにしました。

丸一日かけて調べたのですが方法は見つかりませんでした。しかたがないので週末は OpenSolaris のことは考えないで過ごし、週明け、つまり今日もう一度考えることにしました。

改めて色々調べると prtvtoc, fmthard というコマンドがあることがわかりました。一つ目の prtvtoc は引数で指定されたディスクのジオメトリとパーティションの情報をレポートするコマンドです。逆に fmthard はその情報でディスクの VTOC と呼ばれる管理領域をアップデートするコマンドです。これを組み合わせれば一つ目のディスクと同じ状態に二つ目のディスクを持っていけます。次のようにします。

prtvtoc /dev/rdsk/c3d0s0 | fmthard -s - /dev/rdsk/c3d1s0

やりました! これでスライスの切り方が両方同じになりました。そして無事ミラーリングできるようになりました。

でも一つ問題が!

実機で保険としてやっておいた dd の結果、実機ではどうにもできなくなってしまったのです。fdisk コマンドや format コマンドでコピー先のディスクを弄ろうにも zfs の rpool で使っているから駄目と起こられるし、zpool コマンドで attach しようにも、同じ理由で起こられるし。システムで使っている rpool では使われていないから detach できないし。まあだから僕みたいに苦し紛れに dd でコピーなんてしないことです。

まとめ

自分の備忘も兼ねて手順をまとめておきます。以下はもちろん全て root 権限で行います。

  1. format コマンドで二つ目のディスク全体を Solaris 用にする。

    format コマンドを引数無しで実行すると対話モードになります。最初に認識しているディスクが 0 から始まる番号付きでリストされます。これに 1 を指定して二つ目のディスクを操作対象にします。

    次いで format コマンド内の fdisk コマンドを実行します。すると全体を Solaris 用のパーティションにするかどうか訊かれるので y をタイプして改行します。

    最後に quit コマンドを実行して format コマンドの対話モードを終え、format コマンドを終了させます。

  2. 二つ目のディスクを一つ目のディスクと同じようにパーティショニングする。
    prtvtoc /dev/rdsk/c3d0s0 | fmthard -s - /dev/rdsk/c3d1s0
  3. zpool コマンドで rpool に二つ目のディスクをアタッチする。
    zpool attach -f rpool c3d0s0 c3d1s0

    一つ目のディスク c3d0s0 の指定は zpool status をすればわかります。format コマンドで最初にディスク全体を表す c3d1 が表示されるので、それにスライス 0 という指定を付けて c3d1s0 とします。-f オプションはスライス 2 がパーティション全体を覆ったスライスなのでそれと被るから zpool コマンドが用心して受け付けてくれないのを、安心させるために必要です。

  4. installgrub コマンドで二つ目のディスクからも起動できるようにする。

    これをしておかないと、一つ目のディスクに障害が出てそこから起動できなくなったときに、二つ目のディスクから起動できません。次のようにします。

    installgrub /boot/grub/state1 /boot/grub/stage2 /dev/rdsk/c3d1s0

ミラーリングするディスクを更に増やすのも同じ手順です。

last generated
2009-12-29
page view