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

metaclearを使用する。

例) メタデバイスd20を削除する場合

# metaclear d20

2007/9/12更新

対応バージョン: 4.2.1

metadb -dを使用する。

例) 複製c0t1d0s7を削除する場合

# metadb -d c0t1d0s7

2007/9/12更新

対応バージョン: 4.2.1

以下の手順で行う。

ok boot backup-root

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)