DiskSuite
2007/9/12更新
対応バージョン: 4.2.1
前提条件
2つの内蔵ディスクで/(ルート)とswapをミラーリングしている状態で片系ディスクに障害が発生した場合の対応方法を示す。
ミラーの構成は以下のとおりとする。
/(ルート)
ミラー
d0
d0のサブミラー1
d10(/dev/dsk/c0t0d0s0)
d0のサブミラー2
d20(/dev/dsk/c0t1d0s0)
swap
ミラー
d1
d1のサブミラー1
d11(/dev/dsk/c0t0d0s1)
d1のサブミラー2
d21(/dev/dsk/c0t1d0s1)
障害状況の把握
まずmetastatを用いて障害の状況を確認する。
% metastat d0: Mirror Submirror 0: d10 State: Needs maintenance ← (1) Submirror 1: d20 State: Okay ← (2) Pass: 1 Read option: roundrobin (default) Write option: parallel (default) Size: 141192000 blocks d10: Submirror of d0 State: Needs maintenance Invoke: metareplace d0 c0t0d0s0 <new device> ← (3) Size: 141192000 blocks Stripe 0: Device Start Block Dbase State Hot Spare c0t0d0s0 0 No Maintenance ← (4) d20: Submirror of d0 State: Okay Size: 141192000 blocks Stripe 0: Device Start Block Dbase State Hot Spare c0t1d0s0 0 No Okay : (d1も同様)
すると、(1)と(4)でサブミラーd10に障害が発生していることが確認できる。(2)のサブミラーd20は正常に動作している。
また、(3)ではmetareplaceを用いてサブミラーのリプレースを要求している。
障害対応
ディスク交換
システムを止められない状況で、かつディスクがホットスワップ可能であればOSが動作中にディスクを交換する。
ディスクがホットスワップ可能でない、あるいはホッとスワップ可能であってもシステムを止められる状況ならいったんOSをシャットダウンしてディスクを交換する。
以降は後者を選択したものとして説明する。
パーティション設定
OKプロンプトから通常通りブートするが、メタDBの半数以上が障害のためシングルユーザモードで起動する。
ok boot Resetting ... : metainit: host_a: stale databases Insufficient metadevice database replicas located. Use metadb to delete databases which are broken. Ignore any "Read-only file system" error messages. Reboot the system when finished to reload the metadevice database. After reboot, repair any broken database replicas which were deleted. Type control-d to proceed with normal startup, (or give root password for system maintenance): ← rootのパスワード single-user privilege assigned to /dev/console. Entering System Maintenance Mode : #
交換したディスクのスライスを正常に動作しているディスクと同じ設定にする。
# format : (略)
メタDB削除
交換したディスクのメタDBを削除し、マルチユーザモードでブートする。
# metadb ← メタDBの確認 flags first blk block count M p unknown unknown /dev/dsk/c0t0d0s3 M p unknown unknown /dev/dsk/c0t0d0s3 M p unknown unknown /dev/dsk/c0t0d0s3 a m p lu 16 1034 /dev/dsk/c0t1d0s3 a p l 1050 1034 /dev/dsk/c0t1d0s3 a p l 2084 1034 /dev/dsk/c0t1d0s3 # metadb -f -d c0t0d0s3 ← 障害ディスクのメタDBを削除 metadb: host_a: c0t0d0s3: no metadevice database replica on device # metadb ← メタDBが削除されたことを確認 flags first blk block count a m p lu 16 1034 /dev/dsk/c0t1d0s3 a p l 1050 1034 /dev/dsk/c0t1d0s3 a p l 2084 1034 /dev/dsk/c0t1d0s3 # reboot ← リブートしマルチユーザで起動 syncing file systems... done rebooting... :
サブミラー削除
先ほど削除したメタDBを作成し、交換したディスクのサブミラーをミラーから切り離して削除する。
# metadb -a -c 3 c0t0d0s3 ← メタDBを再作成 # metadb flags first blk block count a u 16 1034 /dev/dsk/c0t0d0s3 ← a u 1050 1034 /dev/dsk/c0t0d0s3 ← 再作成したメタDB a u 2084 1034 /dev/dsk/c0t0d0s3 ← a m p luo 16 1034 /dev/dsk/c0t1d0s3 a p luo 1050 1034 /dev/dsk/c0t1d0s3 a p luo 2084 1034 /dev/dsk/c0t1d0s3 # metadetach -f d0 d10 ← /(ルート)のサブミラーを切り離す d0: submirror d10 is detached # metadetach -f d1 d11 ← swapのサブミラーを切り離す d1: submirror d11 is detached # metaclear d10 ← /(ルート)のサブミラーを削除 d10: Concat/Stripe is cleared # metaclear d11 ← swapのサブミラーを削除 d11: Concat/Stripe is cleared # metastat ← 状態確認(削除したサブミラーは表示されない) d0: Mirror Submirror 1: d20 State: Okay Pass: 1 Read option: roundrobin (default) Write option: parallel (default) Size: 141192000 blocks d20: Submirror of d0 State: Okay Size: 141192000 blocks Stripe 0: Device Start Block Dbase State Hot Spare c0t1d0s0 0 No Okay : (d1も同様)
サブミラー作成、再同期
先ほど削除したサブミラーを再作成し、ミラーと接続して再同期する。
# metainit d10 ← /(ルート)のサブミラーを再作成 d10: Concat/Stripe is setup # metainit d11 ← swapのサブミラーを再作成 d11: Concat/Stripe is setup # metattach d0 d10 ← /(ルート)のサブミラーを再同期 d0: submirror d10 is attached # metattach d1 d11← swapのサブミラーを再同期 d1: submirror d11 is attached # metastat ← 状態確認 d0: Mirror Submirror 0: d10 State: Resyncing ← サブミラーd10再同期中 Submirror 1: d20 State: Okay Resync in progress: 18 % done ← 再同期の進捗率 Pass: 1 Read option: roundrobin (default) Write option: parallel (default) Size: 141192000 blocks d10: Submirror of d0 State: Resyncing ← サブミラーd10再同期中 Size: 2097414 blocks Stripe 0: Device Start Block Dbase State Hot Spare c0t0d0s0 0 No Okay d20: Submirror of d0 State: Okay Size: 141192000 blocks Stripe 0: Device Start Block Dbase State Hot Spare c0t1d0s0 0 No Okay : (d1も同様)
metastatを時折実行して再同期が終わるまでチェックし、StateがOkeyになれば復旧完了である。
2007/9/12更新
対応バージョン: 4.2.1
ミラーリング概要
/(ルート)やswapなどのスライスをミラーリングする場合、通常のOSインストール状態において既にその領域が使用されているので以下の方法で設定する必要がある。
まず1面ミラーを作成する
上記からブートし直す
サブミラーを連結する
それ以外のスライスはまず1面ミラーを作成し、直ちにサブミラーを連結することができる。
ミラーリング
ここでは2台の内臓HDDに対してミラーリング設定をするものとし、各スライスの用途を以下のとおりとする。
1台目(c0t0d0)
0 : /
1 : swap
7 : メタDB格納
2台目(c0t1d0)
0 : c0t0d0s0(/)のミラーリング用
1 : c0t0d0s1(swap)のミラーリング用
7 : メタDB格納
1台目のディスク(c0t0d0)はすでにOSがインストールされているものとし、2台目のディスク(c0t1d0)に対してformatコマンドを使用して1台目のディスクと同じレイアウトに設定しておく。
メタDBの複製を作成
2台のディスクそれぞれのスライス7にメタDBの複製を作成する。
# metadb metadb: host_a: there are no existing databases → 最初はメタDBが存在しないので上記のメッセージが出る # metadb -a -f -c 2 c0t0d0s7 c0t1d0s7 # metadb flags first blk block count a u 16 1034 /dev/dsk/c0t0d0s7 a u 1050 1034 /dev/dsk/c0t0d0s7 a u 16 1034 /dev/dsk/c0t1d0s7 a u 1050 1034 /dev/dsk/c0t1d0s7
/(ルート)のミラーリング
# metainit -f d10 1 1 c0t0d0s0 ← ストライプ領域作成(既存の/) # metainit d20 1 1 c0t1d0s0 ← ストライプ領域作成(/のミラー用)
d10、d20に続く最初の1はこのミラーに1つのストライプがあることを示し、次の1は各ストライプが1つのスライスで構成されていることを示す。
# metainit d0 -m d10 ← d10が所属する1面ミラー作成 # metaroot d0 ← d0でブート可能にする → /etc/vfstabの/スライスが以下のように編集される #device device mount FS fsck mount mount #to mount to fsck point type pass at boot options : /dev/md/dsk/d0 /dev/md/rdsk/d0 / ufs 1 no - → /etc/systemに以下の内容が追加される * Begin MDD root info (do not edit) forceload: misc/md_trans ← (*) forceload: misc/md_raid ← (*) forceload: misc/md_hotspares ← (*) forceload: misc/md_sp ← (*) forceload: misc/md_stripe forceload: misc/md_mirror forceload: drv/pcipsy forceload: drv/simba forceload: drv/uata forceload: drv/dad rootdev:/pseudo/md@0:0,0,blk * End MDD root info (do not edit) * Begin MDD database info (do not edit) set md:mddb_bootlist1="dad:3:16 dad:3:1050 dad:11:16 dad:11:1050" * End MDD database info (do not edit)
(*) RAIDの構成によってはOSブート時にこれらドライバのロードエラーが出ることがあるが特に問題はない。気になるようなら記述を削除するか先頭に「*」を付加してコメントアウトすれば次回ブート時からは出力されない。尚、RAID構成がミラーリングの場合はこの4つドライバはロードエラーになる。
参考までに、各ドライバのエラーメッセージとエラーの出力条件を以下に示す。
WARNING: forceload of misc/md_trans failed
トランスデバイス(UFSロギング)が設定されていない。
WARNING: forceload of misc/md_raid failed
RAID5デバイスが設定されていない。
WARNING: forceload of misc/md_hotspares failed
/(ルート)がメタデバイス上にある場合にホットスペアが指定されていない。空のホットスペア集合を定義するとこのメッセージは表示されなくなる。
WARNING: forceload of misc/md_sp failed
ソフトパーティションを設定していない場合。
# lockfs -fa ← ファイルシステムのロック # reboot ← リブート (リブート中) # metattach d0 d20 ← サブミラー連結(マシンの性能によりattachに数十分〜数時間かかる) # metastat d0 d0: Mirror Submirror 0: d10 State: Okay Submirror 1: d20 State: Resyncing ← 同期中 Resync in progress: 3 % done ← ここが100%になるまで待つ Pass: 1 Read option: roundrobin (default) Write option: parallel (default) Size: 141192000 blocks d10: Submirror of d0 State: Okay Size: 141192000 blocks Stripe 0: Device Start Block Dbase State Hot Spare c0t0d0s0 0 No Okay d20: Submirror of d0 State: Resyncing ← 同期が終了するとOkayに変わる Size: 141192000 blocks Stripe 0: Device Start Block Dbase State Hot Spare c0t1d0s0 0 No Okay
swapのミラーリング
# metainit -f d11 1 1 c0t0d0s1 ← ストライプ領域作成(既存のswap) # metainit d21 1 1 c0t1d0s1 ← ストライプ領域作成(swapのミラー用) # metainit d1 -m d11 ← d11が所属する1面ミラー作成 # vi /etc/vfstab ← swapデバイスを上記のメタデバイスに変更 #device device mount FS fsck mount mount #to mount to fsck point type pass at boot options : /dev/md/dsk/d1 - - swap - no - # reboot ← リブート (リブート中) # metattach d1 d21 ← サブミラー連結(マシンの性能によりattachに数分〜数十分かかる) # metastat d1 d1: Mirror Submirror 0: d11 State: Okay Submirror 1: d21 State: Okay Pass: 1 Read option: roundrobin (default) Write option: parallel (default) Size: 2106432 blocks d11: Submirror of d1 State: Okay Size: 2106432 blocks Stripe 0: Device Start Block Dbase State Hot Spare c0t0d0s1 0 No Okay d21: Submirror of d1 State: Okay Size: 2106432 blocks Stripe 0: Device Start Block Dbase State Hot Spare c0t1d0s1 0 No Okay # swap -l swapfile dev swaplo blocks free /dev/md/dsk/d1 85,1 16 2106416 2106416
core dumpの出力先をデフォルトのswap領域(/dev/dsk/s1)からメタデバイス(/dev/md/dsk/d1)に変更
# dumpadm -d swap # dumpadm Dump content: kernel pages Dump device: /dev/md/dsk/d1 (swap) Savecore directory: /var/crash/host_a Savecore enabled: yes
2007/11/21更新
対応バージョン: 4.2.1
例えばミラーd0にサブミラーd10が連結されている状態でd20の連結に失敗する。
# metastat d0 d0: Mirror Submirror 0: d10 State: Okay Submirror 1: d20 State: Okay Pass: 1 Read option: roundrobin (default) Write option: parallel (default) Size: 141192000 blocks d10: Submirror of d0 State: Okay Size: 141192000 blocks Stripe 0: Device Start Block Dbase State Hot Spare c0t0d0s0 0 No Okay # metastat d20 d20: Concat/Stripe Size: 141192000 blocks Stripe 0: Device Start Block Dbase c0t1d0s0 0 No # metattach d0 d20 metattach: host_a: d20: can't attach labeled submirror to an unlabeled mirror
原因
これは以下のようにシリンダ0から始まっていないルートファイルシステムに対してミラーのサブミラーを作成して、それにシリンダ0から始まるサブミラーを接続しようとすると発生する。
0 root wm 1452 - 24611 31.90GB (23160/0/0) 66909240 1 swap wu 0 - 1451 2.00GB (1452/0/0) 4194828 2 backup wm 0 - 24619 33.92GB (24620/0/0) 71127180 3 unassigned wm 0 0 (0/0/0) 0 4 unassigned wm 0 0 (0/0/0) 0 5 unassigned wm 0 0 (0/0/0) 0 6 unassigned wm 0 0 (0/0/0) 0 7 unassigned wm 24612 - 24619 11.29MB (8/0/0) 23112
対応
以下のいずれかの方法で対応する。
ルートファイルシステムと他のサブミラー用のボリュームが両方とも「シリンダ0から始まる」ようにする。
逆に、ルートファイルシステムと他のサブミラー用のボリュームが両方とも「シリンダ0から始まらない」ようにする。
OSのインストールをJumpStartによって行うとデフォルトでswapパーティションがシリンダ0から始まりルートファイルシステムは他の位置から始まるのでこの問題が起きやすい。
DiskSuiteによってルートファイルシステムをミラーリングしたい場合はディスクレイアウトをシリンダ位置に気を配りながら手動で配置するほうがよい。
2007/9/12更新
対応バージョン: 4.2.1
該当のスライスの使用シリンダが別スライスとオーバーラップしている。
formatコマンドで該当のスライスの割当シリンダを調べ、オーバーラップ状態を回避する。
例) スライス1と3の割当シリンダがオーバーラップしている。
Part Tag Flag Cylinders Size Blocks 0 root wm 293 - 1315 1.75GB (1023/0/0) 3673593 1 swap wm 0 - 292 513.75MB (293/0/0) 1052163 ← (*) 2 backup wm 0 - 4923 8.43GB (4924/0/0) 17682084 3 unassigned wm 0 - 6 12.27MB (7/0/0) 25137 ← (*) :
2007/11/21更新
対応バージョン: 4.2.1
メタDBを作成しようとしているスライスのどちらか(あるいは両方)がすでにファイルシステムとしてマウントされている。
例) c0t0d0s7がマウント済
# metadb -a -f -c 2 c0t0d0s7 c0t1d0s7 metadb: host_a: c0t0d0s7: is mounted on /disksuite
このような場合はいったんマウントを解除して再度metadbを実行すれば正常にメタDBが作成される。
# umount /disksuite
また、/etc/vfstabにてOS起動時に自動マウントされるようになっている場合は、当該エントリをvfstabから削除しておく。
2007/9/12更新
対応バージョン: 4.2.1
フラグには正常系/異常系の2種類があり、一つのデバイスに対して複数のフラグが立つ。
例)
# metadb -i flags first blk block count a m p luo 16 1034 /dev/dsk/c0t0d0s7 a p luo 1050 1034 /dev/dsk/c0t0d0s7 a p luo 16 1034 /dev/dsk/c0t1d0s7 a p luo 1050 1034 /dev/dsk/c0t1d0s7
正常系(小文字)
a (active)
レプリカ(複製)はアクティブである。コミット操作はこのレプリカに対して行われる。
m (master)
レプリカはマスタである。このレプリカは入力として選択されている。
p (patched)
レプリカの場所はカーネルに割り当てられた。
l (locator)
レプリカのロケータは正常に読み込まれた。
u (up to date)
レプリカは最新の状態である。
o
レプリカは最後にメタDBの構成が変更されて以降アクティブである。
c
レプリカの場所は/etc/lvm/mddb.cfである。
異常系(大文字)
W
レプリカで書き込みエラーが起きた。
R
レプリカで読み込みエラーが起きた。
M
レプリカのマスタブロックで問題が起きた。
D
レプリカのデータブロックで問題が起きた。
F
レプリカのフォーマットで問題が起きた。
S
レプリカの容量が現在のデータベースを格納するには小さすぎる。
2007/9/12更新
対応バージョン: 4.2.1
当バージョンのDiskSuiteを使用するには「Solaris8 Software 2/2 CD-ROM」の/cdrom/cdrom0/Solaris_8/EA/products/DiskSuite_4.2.1/sparc/Packagesから以下のパッケージをインストールする。
SUNWmdg
Solstice DiskSuite Tool
SUNWmdja
Solstice DiskSuite Japanese localization
SUNWmdnr
Solstice DiskSuite Log Daemon Configuration Files
SUNWmdnu
Solstice DiskSuite Log Daemon
SUNWmdr
Solstice DiskSuite Drivers
SUNWmdu
Solstice DiskSuite Commands
SUNWmdx
Solstice DiskSuite Drivers(64-bit)