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になれば復旧完了である。