* Linux RAID の管理領域 [#o5a7ec80]

Linux のソフトウェア RAID では,各々の子ボリュームに RAID の管理領域を持っている.
この管理領域は RAID の''スーパーブロック''と呼ばれる.
また,スーパーブロックに書かれたデータは RAID の''メタデータ''と呼ばれる.

** RAID メタデータの表示 [#z5d1a9c3]

RAID ボリューム自身の状態を表示させるのには

 # mdadm -D /dev/md0

と実行する.
これは使ったことがある人も多いだろう.

実は,RAID の状態(メタデータ)は各々の子ボリューム上にも保持されていて,例えば

 # mdadm --examine /dev/sda1

で表示させることができる.
これは,RAID を停止させた後も保持されている.
リビルド中に(RAID を正常に停止させて)シャットダウンしても再起動するとリビルドが再開されるのは,ソフトウェア RAID のシステムがこのメタデータを参照しているからである.
このオプションは RAID の障害解析で非常に役立つので,是非とも覚えておいて欲しい.

** メタデータの消去 [#s92568e4]

実験に使っていたディスクを使いまわす時など,メタデータを消去したいときがある.
この場合,例えば

 # mdadm --zero-superblock /dev/sda1

と実行すると,スーパーブロックを 0 で書き潰すことができる.

** 子ボリューム上でのスーパーブロックの位置 [#g12fb22a]

子ボリューム上でメタデータが保持されている場所,すなわちスーパーブロックの位置を調べてみよう.

「[[Linux RAID の実験環境>日記/2008-01-15/Linux RAID の実験環境]]」で示した手順で擬似的な子ボリュームを作成する.
ここでは 64MB 子ボリュームを作成する.

 # dd if=/dev/zero of=d0 bs=1M seek=64 count=0
 # dd if=/dev/zero of=d1 bs=1M seek=64 count=0
 # dd if=/dev/zero of=d2 bs=1M seek=64 count=0
 # dd if=/dev/zero of=d3 bs=1M seek=64 count=0
 # losetup /dev/loop0 d0
 # losetup /dev/loop1 d1
 # losetup /dev/loop2 d2
 # losetup /dev/loop3 d3

RAID を組む前の子ボリュームの中身を見てみよう.

 # hexdump /dev/loop0
 0000000 0000 0000 0000 0000 0000 0000 0000 0000
 *
 4000000

実体は完全な sparse file なので,頭から尻尾まで all 0 である.

新たに RAID を構成する.

 # mdadm -C --level=raid5 --raid-devices=4 --assume-clean /dev/md0 \
   /dev/loop0 /dev/loop1 /dev/loop2 /dev/loop3
 mdadm: array /dev/md0 started.

この状態で再び子ボリュームの中身を覗いてみよう.

 # hexdump /dev/loop0
 0000000 0000 0000 0000 0000 0000 0000 0000 0000
 *
 3ff0000 4efc a92b 0000 0000 005a 0000 0000 0000
 3ff0010 0000 0000 f2b7 7174 9f20 4792 0005 0000
 3ff0020 ffc0 0000 0004 0000 0004 0000 0000 0000
 3ff0030 0000 0000 6e72 99c4 8653 f4d1 0cee c545
 3ff0040 0000 0000 0000 0000 0000 0000 0000 0000
 *
 3ff0080 9f20 4792 0001 0000 0004 0000 0004 0000
 3ff0090 0000 0000 0000 0000 822f fda2 0001 0000
 3ff00a0 0000 0000 0000 0000 0000 0000 0000 0000
 *
 3ff0100 0002 0000 0000 0001 0000 0000 0000 0000
 3ff0110 0000 0000 0000 0000 0000 0000 0000 0000
 *
 3ff0200 0000 0000 0007 0000 0000 0000 0000 0000
 3ff0210 0006 0000 0000 0000 0000 0000 0000 0000
 3ff0220 0000 0000 0000 0000 0000 0000 0000 0000
 *
 3ff0280 0001 0000 0007 0000 0001 0000 0001 0000
 3ff0290 0006 0000 0000 0000 0000 0000 0000 0000
 3ff02a0 0000 0000 0000 0000 0000 0000 0000 0000
 *
 3ff0300 0002 0000 0007 0000 0002 0000 0002 0000
 3ff0310 0006 0000 0000 0000 0000 0000 0000 0000
 3ff0320 0000 0000 0000 0000 0000 0000 0000 0000
 *
 3ff0380 0003 0000 0007 0000 0003 0000 0003 0000
 3ff0390 0006 0000 0000 0000 0000 0000 0000 0000
 3ff03a0 0000 0000 0000 0000 0000 0000 0000 0000
 *
 3ff0f80 0000 0000 0007 0000 0000 0000 0000 0000
 3ff0f90 0006 0000 0000 0000 0000 0000 0000 0000
 3ff0fa0 0000 0000 0000 0000 0000 0000 0000 0000
 *
 4000000

何やらボリュームの末尾にデータが書き込まれている.
これが RAID スーパーブロックである.

> Linux のソフトウェア RAID のスーパーブロックは,子ボリュームの末尾にある

のである.

図で書くと
 子ボリューム
 先頭                                   末尾
 +--------------------------------+--------+
 | データ領域                     |スーパー|
 |                                |ブロック|
 +--------------------------------+--------+
となる.


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS