OS領域をミラーリングしておくと、耐障害性も向上し、何かと安全です。以下にDiskSuiteを利用したOS領域をミラーリングする手順を記載します。
用語の詳しい意味ややり方は、マニュアル等をご参照下さい。ここでは、あくまで自分の理解したやり方を記載しておきます。
今回のミラー構成は、表と図の通りです。解説に先立ち、簡単に用語の説明をしておきます。自分の解釈もかなり混ざっていますけど、ご了承下さい。
物理パーティション(物理スライス)
デバイス名cWtXdYsZで示されるような通常スライス。
メタデバイス
仮想デバイス(デバイス名dXで示される)。物理パーティション(cWtXdYsZ)の集合体で構成されています。
サブミラーメタデバイス
ミラーを構成するメンバーの1つ。例えばd0のサブミラーは、d10とd20です。
ミラーメタデバイス
サブミラーで構成されたメタデバイス。最終的にこのデバイスをOSからマウントします。
状態データベース
DiskSuiteを使用するには、物理パーティションの1つは、状態データベースを保持するために約20MBくらい用意しておく必要が有ります。その領域にメタデバイスの構成や状態が保存されることになります。
ディスク1台目 | ディスク2台目 | ||||
---|---|---|---|---|---|
ミラー メタデバイス |
マウントポイント | サブミラー | パーティション | サブミラー | パーティション |
d0 | / | d10 | c0t0d0s0 | d20 | c0t1d0s0 |
d1 | swap | d11 | c0t0d0s1 | d21 | c0t1d0s1 |
d3 | /var | d13 | c0t0d0s3 | d23 | c0t1d0s3 |
状態DB | - | - | c0t0d0s4 | - | c0t1d0s4 |
d5 | /opt | d15 | c0t0d0s5 | d25 | c0t1d0s5 |
d6 | /usr | d16 | c0t0d0s6 | d26 | c0t1d0s6 |
d7 | /export | d17 | c0t0d0s7 | d27 | c0t1d0s7 |
ミラーリング手順は以下の通りです。
(1)2台目のディスクのパーティションを1台目に合わせる
(2)設定ファイル準備
(3)状態データベースの作成
(4)1面ミラー作成
(5)ルート(/)メタデバイスの設定、及び/etc/vfstab設定変更
(6)リブート
(7)2面ミラー作成
ミラーリングするためには、両方のディスクのパーティションサイズを揃えておく必要があります。
パーティションサイズを揃える方法として、formatコマンドで合わせても良いのですが、僕はprtvtocコマンドとfmthardコマンドを使ってます。prtvtocコマンドで1台目のディスクのVTOCを表示し、それをfmthardコマンドを使って2台目のディスクのVTOCに書き込むのです。ワンライナーで行けちゃいます。
# prtvtoc /dev/rdsk/c0t0d0s0 | fmthard -s - /dev/rdsk/c0t1d0s0
設定ファイルを準備します。Solaris7以前では、/etc/opt/SUNWmd/md.tabでしたが、Solaris8以降では、/etc/lvm/md.tabです。
記述形式等はマニュアルを参照して下さい。でも、ざっとみてなんとなく大体何を定義しているか分かると思います。
# cd /etc/lvm # cp md.tab md.tab.org # vi md.tab --- mddb01 -c 3 /dev/dsk/c0t0d0s4 /dev/dsk/c0t1d0s4 # / d0 -m d10 d10 1 1 /dev/dsk/c0t0d0s0 d20 1 1 /dev/dsk/c0t1d0s0 # swap d1 -m d11 d11 1 1 /dev/dsk/c0t0d0s1 d21 1 1 /dev/dsk/c0t1d0s1 # /var d3 -m d13 d13 1 1 /dev/dsk/c0t0d0s3 d23 1 1 /dev/dsk/c0t1d0s3 # /opt d5 -m d15 d15 1 1 /dev/dsk/c0t0d0s5 d25 1 1 /dev/dsk/c0t1d0s5 # /usr d6 -m d16 d16 1 1 /dev/dsk/c0t0d0s6 d26 1 1 /dev/dsk/c0t1d0s6 # /export/home d7 -m d17 d17 1 1 /dev/dsk/c0t0d0s7 d27 1 1 /dev/dsk/c0t1d0s7
状態データベースを作成します。状態データベースは、メタデバイスの構成や状態を格納しておく最も重要な場所です。従って障害に備えて複製(レプリカ)を作成しておきます。ここでは、2パーティション(/dev/dsk/c0t0d0s4, /dev/dsk/c0t1d0s4)に3つずつ、計6つ作成します。
状態データベースには、過半数アルゴリズムというのが有ります。
md.tabのmddb01のエントリを利用して作成します。
つまり、-c 3 /dev/dsk/c0t0d0s4 /dev/dsk/c0t1d0s4なので、両パーティションに3つずつ状態データベースを作成します。
# metadb -a -f mddb01
このコマンドにより、/etc/lvm/mddb.cf, /etc/systemファイルが編集されます。
# cat /etc/system --- * Begin MDD database info (do not edit) set md:mddb_bootlist1="sd:127:16 sd:127:1050 sd:127:2084 sd:135:16" set md:mddb_bootlist2="sd:135:1050 sd:135:2084" * End MDD database info (do not edit)
コマンドにて状態データベースが作成されたか確認します。
# metadb -i --- フラグ 最初のブロック ブロックカウント a m p luo 16 1034 /dev/dsk/c0t0d0s4 a p luo 1050 1034 /dev/dsk/c0t0d0s4 a p luo 2084 1034 /dev/dsk/c0t0d0s4 a p luo 16 1034 /dev/dsk/c0t1d0s4 a p luo 1050 1034 /dev/dsk/c0t1d0s4 a p luo 2084 1034 /dev/dsk/c0t1d0s4 o - 複製は最後の mddb 構成変更の前までアクティブでした u - 複製は最新です l - この複製のロケータは無事読み込まれました c - 複製の場所は /etc/lvm/mddb.cf です p - 複製の場所はカーネルにパッチされました m - 複製はマスターです。この複製は入力として選択されています W - 複製にはデバイス書き込みエラーがあります a - 複製はアクティブです。確定操作はこの複製に対して行われます M - 複製はマスターブロックで問題を起こしました D - 複製はデータブロックで問題を起こしました F - 複製はフォーマット問題を起こしました S - 複製は現在のデータベースを入れるには小さすぎます R - 複製はデバイス読み込みエラーを起こしました
1面ミラーを作成します。1面ミラーというのは、サブミラーが1つの構成のミラーです。
先ほど設定したmd.tabの内容で初期化します。
# metainit -a -f --- d10: Concat/Stripe is setup d20: Concat/Stripe is setup d11: Concat/Stripe is setup d21: Concat/Stripe is setup d13: Concat/Stripe is setup d23: Concat/Stripe is setup d15: Concat/Stripe is setup d25: Concat/Stripe is setup d16: Concat/Stripe is setup d26: Concat/Stripe is setup d17: Concat/Stripe is setup d27: Concat/Stripe is setup d0: Mirror is setup d1: Mirror is setup d3: Mirror is setup d5: Mirror is setup d6: Mirror is setup d7: Mirror is setup
最終的にミラーメタデバイス(d0〜d7)をOSからマウントするので、/etc/vfstabを下記のように変更します。
# metaroot d0 # vi /etc/vfstab --- fd - /dev/fd fd - no - /proc - /proc proc - no - /dev/md/dsk/d0 /dev/md/rdsk/d0 / ufs 1 no - /dev/md/dsk/d1 - - swap - no - /dev/md/dsk/d3 /dev/md/rdsk/d3 /var ufs 1 no - /dev/md/dsk/d5 /dev/md/rdsk/d5 /opt ufs 2 yes - /dev/md/dsk/d6 /dev/md/rdsk/d6 /usr ufs 1 no - /dev/md/dsk/d7 /dev/md/rdsk/d7 /export/home ufs 2 yes - swap - /tmp tmpfs - yes -
ここまで来たら一度リブートします。順調ならミラーメタデバイスをマウントして起動してくるはずです。
# init 6
後は、残りのもう一方のサブミラーをアタッチして完成です。アタッチ後は、裏側で同期が開始されています。metastatコマンドで進行状況を確認できます。
# metattach d0 d20 # metattach d1 d21 # metattach d3 d23 # metattach d5 d25 # metattach d6 d26 # metattach d7 d27
確認する。
# metastat
このままでも良いのですが、今の状態だと起動時に/var/adm/messagesに以下のメッセージが出力されます。
WARNING: forceload of misc/md_trans failed WARNING: forceload of misc/md_raid failed WARNING: forceload of misc/md_hotspares failed
しかし、エラーでは有りません。気になる場合は、/etc/systemを編集しましょう。アスタリスク記号でコメントアウトします。
# vi /etc/system --- *forceload: misc/md_trans *forceload: misc/md_raid *forceload: misc/md_hotspares