部屋を掃除したら漫画が沢山出てきたので書く日記

漫画とか合唱とかUNIXとかLinuxとかについて書く日記です。

ZFSでRAID1をしてみよう

今更ながらOracleからSolaris11 Expressがリリースされたので、OpenSolarisで動いている会社の検証サーバもアップグレードしました。
で、散々検証に四苦八苦したWD15EARSというHDDも二本ある事ですので、ZFSでRAID1(いわゆるミラーリング)をしてみました。
ZFSでのミラーリングは簡単に出来るという事で有名なのですが、実際にトラブルが発生してミラーしたDISKからOSを起動させようとすると意外な事につまずいたりしましたので、
ミラーリングの設定方法

ミラーリングの運用方法
について書いてみたいと思います。

前提条件

OSは

Oracle Solaris 11 Express snv_151a X86

で、二本のHDD「WD15EARS」がOSからそれぞれ

c7d0
c8d0

と認識されており、ルートファイルシステムが格納された「rpool」というzpoolが既に「c7d0s0」で構成されているものとします。zpool statusコマンドで確認すると以下のようになります。

# zpool status
  pool: rpool
 state: ONLINE
status: The pool is formatted using an older on-disk format.  The pool can
	still be used, but some features are unavailable.
action: Upgrade the pool using 'zpool upgrade'.  Once this is done, the
	pool will no longer be accessible on older software versions.
 scan: resilvered 371G in 25h27m with 0 errors on Fri Dec 31 00:06:51 2010
config:

	NAME        STATE     READ WRITE CKSUM
	rpool       ONLINE       0     0     0
	  c7d0s0    ONLINE       0     0     0

よって、「rpoolのミラーディスクとしてc8d0を追加する」という作業を行います。
また、以下の全ての作業はスーパユーザにて行うものとします。

注意点

この作業のポイントは、「HDDのスライス単位で設定する」という事です。
色々試した結果、DISK全体を示す「c8d0」ではなく、DISKのスライス0番である「c8d0s0」をミラー設定しないと後からOSを起動できません*1のでご注意下さい。
また、rpoolを構成しているc7d0も、スライス0番を指定して「c7d0s0」で構成しておきます。

■ミラーリングの設定方法

1)ミラーディスクのフォーマット

まず、c8d0のフォーマットを行います。上述の通り、「c8d0s0」に領域を作成します。

# format -e c8d0
〜省略〜
format> p

下記のようになるよう設定した(0番に8番と9番を除いた全ての領域である約1.36TBを設定)。

partition> p
Current partition table (original):
Total disk cylinders available: 60797 + 2 (reserved cylinders)

Part      Tag    Flag     Cylinders         Size            Blocks
  0       root    wm       3 - 60796        1.36TB    (60794/0/0) 2929966830
  1 unassigned    wu       0                0         (0/0/0)              0
  2     backup    wu       0 - 60796        1.36TB    (60797/0/0) 2930111415
  3 unassigned    wu       0                0         (0/0/0)              0
  4 unassigned    wu       0                0         (0/0/0)              0
  5 unassigned    wu       0                0         (0/0/0)              0
  6 unassigned    wu       0                0         (0/0/0)              0
  7 unassigned    wu       0                0         (0/0/0)              0
  8       boot    wu       0 -     0       23.53MB    (1/0/0)          48195
  9 alternates    wm       1 -     2       47.07MB    (2/0/0)          96390

なお、今回二本とも同じDISKを使用していますので、パーティションは「c7d0s0」と同様にすれば良い分けですので、

# prtvtoc /dev/rdsk/c7d0s2 | fmthard -s - /dev/rdsk/c8d0s2

と実行すれば、c7d0と同じパーティション設定をc8d0に実施できますので便利です*2

2)ミラーディスクをrpoolに設定する

c7d0s0というデバイスで構成されているrpoolのミラーディスクとして、c8d0s0を追加します。以下のコマンドを入力します。

# zpool attach -f rpool c7d0s0 c8d0s0

これでミラーリング、すなわちRAID1構成となります。

3)ミラーリングの確認

ミラーリングを実施した後、元のディスクと追加したミラーディスクとの間で同期処理が行われます。完了までには数時間程度時間がかかります。zpool statusコマンドで進捗を確認できます。

# zpool status rpool
  pool: rpool
 state: ONLINE
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 for 0h10m, 2.81% done, 5h53m to go
config:

        NAME        STATE     READ WRITE CKSUM
        rpool       ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            c7d0s0  ONLINE       0     0     0
            c8d0s0  ONLINE       0     0     0  4.27G resilvered

errors: No known data errors

zpool attachの実行直後は同期途中である事を示す

 scrub: resilver in progress for 0h10m, 2.81% done, 5h53m to go

というメッセージが表示されます。ここで表示されるパーセンテージが100%になったら同期完了です。しばらく待ちましょう。

4)GRUBのインストール

ミラーリングが完了したら、次にGRUBというソフトウェアのインストールを行います。
Solaris11 ExpressというOS*3GRUBというソフトウェア(ブートローダと呼ばれます)を使用して起動されますが、OSがインストールされているディスク(ブートデバイスと呼ばれます)毎にインストールが必要のようです。
Oコピー元ディスクであるc7d0s0にはOSインストール時に自動でインストールされていますが、今回ミラーリング設定したc8d0s0にはインストールされていないので、個別にインストールする必要があります。
インストールしないとc7d0s0に何か異常が発生して使用できなくなった場合にc8d0s0から正常にOSを起動する事が出来ません*4ので、以下のコマンドでインストールを行います。

# installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c8d0s0

ここでしつこく注意点ですが、私が試した限りは、OSがインストールされている領域がディスク全体(cXdXs2、あるいはcXdXp0)ではなく、スライス指定でなければ上記コマンドを実行しても正常に起動しませんでした*5

そして私が見つけたZFSでrpoolをミラーリングする手順を開設するサイトほとんど全てが、rpoolを「cXdXs0」で構成していました。
よって、

ルートファイルシステムZFSでミラーするためにはスライス0番(s0)を使用する事

という事を暫定的な決まり事としておくと良さそうです。

もしディスク全体を指定してrpoolが構成されている状態で、installgrubを行う方法をご存知の方は教えて頂けますと幸いです。

少し話題がずれましたが、これでZFSでRAID1を構成出来ました。
次は運用の仕方を説明します。


■ミラーリングの運用方法

まず大前提ですが、HDDをRAID1で構成にする目的は「ディスクに異常が発生した時に備えてミラーディスクに同じ情報を格納しておく」という事です。システムエンジニアが言うところの「冗長性を確保する」というやつですね。

ここではミラー元である「c7d0s0」に何らかの異常が発生したとして運用方法を書きます。

1)ミラーディスクからOSを起動

RAID1の概念からすると本来はしなくても良いはずですが、場合によってはディスクが壊れた時点でリブートが発生し、OSが上がらない状態になる場合があります。その場合はミラーディスクからOSを起動します。ミラーディスクの作成の際にinstallgrubによるGRUBのインストールを行っているので、ミラーしているディスクからも起動が出来ます。
ここではc7d0s0から起動できなくなっている事になりますので、BIOSのブートデバイス選択設定などでc8d0s0からOSを起動しましょう。いつものOS起動画面になるはずです。
OSがダウンしていない場合はこの項は省略しましょう。

2)故障ディスクを取り外す

異常が起きているDISKを取り外します。この場合はc7d0s0が故障していますので、c7d0として認識されているDISKを取り外します。
商用サービスで使用される大抵のサーバ機器では電源オフする事なく無停止での交換(ホットスワップ)ができますが、一般的なパソコンでもSATAのHDDであればホットスワップが出来るはずですので、一回試してみましょう。

で手順ですが、まず以下のコマンドでrpoolを構成するディスクからc7d0s0を外します。

# zpool detach rpool c7d0s0

実施後、zpool statusでrpoolを構成するディスクが「c8d0s0」だけとなっている事を確認します。
その後故障したc7d0s0を物理的に取り外し、交換用ディスクを交換で取り付け、正常に認識されている事を確認します。物理的な交換方法については機器によって様々だと思いますので割愛します。

3)ミラーの再作成

デバイス名に気をつけて(取り付けたDISKのデバイスが「c7d0」だとは限らないので)、前項「ミラーリングの設定方法」に基づいてミラーリングを設定します。

これで一連の運用が出来るはずです。自分で運用してみて問題があったら都度修正したいと思います。

*1:s2にOSをインストールしてinstallgrubを行う方法を知っていたら誰か教えていただきたく。。。

*2:ただしコピー元とコピー先を間違えないよう注意しましょう

*3:厳密には[http://docs.sun.com/app/docs/doc/819-0378/hbx86boot-aaa?l=ja&a=view:title=Solaris 10 1/06以降]らしい

*4:GRUBが無くてもinit 0の状態からブートできるのかもしれませんがx86Solarisでやったことが無いです。出来るの・・・?

*5:GRUBのプロンプトから画面が遷移しなくなる