がらくたネット


SoftwareRAID

SoftwareRAID

ソフトウェアRAID。CentOS5のソフトウェアRAID備忘録というか記録というか…

インストール時にソフトウェアRAID状態でインストール

mdとはMultiple Deviceとのこと

インストール後

ステータス

cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb1[1] sda1[0]
      104320 blocks [2/2] [UU]
md1 : active raid1 sdb2[1] sda2[0]
      4192896 blocks [2/2] [UU]
md2 : active raid1 sdb3[1] sda3[0]
      972462528 blocks [2/2] [UU]
      [====>................]  resync = 24.3% (236707904/972462528) finish=122.1min speed=100413K/sec
unused devices: <none>
だそうだ。 md2のデバイスは現在resync(再同期中)ってなステータス 放置プレイする場合は
watch cat /proc/mdstat
ってな感じ

resync中に再起動すると、再同期処理は全て無効になって最初から同期処理が始まったさ…マジですか:-(

そして、再同期処理ですが、ハードウェアRAIDに比べると比較にならんほど遅い…:-/

正常時の情報を取得しておく事が実は重要。修復時に利用するシーンがくるのだ。

  1. fdiskでのパーティション情報 
    fdisk -l /dev/sda
  2. /proc/mdstatの情報 
    cat /proc/mdstat

grubを両方のHDDにインストールするのだ。これ忘れると2つ目以降のHDDから起動してこなくなるよ。

grub
grub> root (hd0,0)
grub> setup (hd0)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd0)"...  15 sectors are embedded.
succeeded
 Running "install /grub/stage1 (hd0) (hd0)1+15 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded
Done.
grub> root (hd1,0)
grub> setup (hd1)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd1)"...  15 sectors are embedded.
succeeded
 Running "install /grub/stage1 (hd1) (hd1)1+15 p (hd1,0)/grub/stage2 /grub/grub.conf"... succeeded
Done.
grub> quit

mdmonitor

/etc/rc.d/init.d/mdmonitorというデーモンがある。ソフトウェアRAIDモニタリングデーモンだ。
/etc/mdadm.confを読み取って稼働する。このファイル内にMAILADDRかPROGRAMかその両方の変数が定義されている必要がある。
デフォルトはroot宛になってる。

mdadm.confの作成

/etc/mdadm.confの作成方法

  1. DEVICE partitions(おまじない)
  2. MAILADDR root(root部分を通知先メールアドレスに変更)
  3. 3行目以降に次のコマンドの結果を代入
    mdadm -D --scan

なんと簡単な!

MAILADDR mdadmが–monitorモードで稼働している場合に通知する先。1つのアドレスしか書けない
MAILFROM AlertメールのFromアドレス。デフォルトはroot
DEVICE ほとんどの場合、partitionsの指定で問題ない

メール

MDが壊れた時のメールサンプル
今回sdbのHDDを取外して起動してみたのだ。

Subject:DegradedArray event on /dev/md[2]:[hostname]
This is an automatically generated mail message from mdadm
running on [hostname]

A DegradedArray event had been detected on md device /dev/md[2].

Faithfully yours, etc.

P.S. The /proc/mdstat file currently contains the following:

Personalities : [raid1] 
md0 : active raid1 sda1[1]
      104320 blocks [2/1] [_U]
      
md1 : active raid1 sda2[1]
      4192896 blocks [2/1] [_U]
      
md2 : active raid1 sda3[1]
      972462528 blocks [2/1] [_U]
      
unused devices: <none>

修復

HDDが壊れた場合の修復手順

  1. /proc/mdstatから障害HDD内のパーティション情報が消えていなければ手動で削除
    mdadm --manage [RAIDデバイス名] --remove [取外パーティション名]
    例 mdadm --manage /dev/md0 --remove /dev/sdb1
  2. 壊れたHDDを物理的に取外
  3. 修復用HDDを物理的に取付
  4. 修復用HDDにパーティション作成、正常時のfdisk情報を元に
    デバイス名は/proc/partitionsやdmesg内に記述されてるはず
    fdisk /dev/XXX
    シリンダ数指定で正常時のfdisk情報と同じように設定
    作成したシステムIDは通常83(Linux)なので、元のfdisk情報と同じようにfd(LinuxRaid自動検出)に変更
    一つ目のパーティションは起動用のはずなのでブート可能フラグを立てる
  5. 可能なら修復パーティションをアンマウント
  6. 修復用パーティションを追加
    mdadm --manage [RAIDデバイス名] --add [追加パーティション名]
  7. 修復用パーティション処理を全て実行してmdstatが全て完了するまで待つ
  8. アンマウントしてたらマウントしなおす
  9. 起動パーティションが含まれていたらGRUBを再インストールしておく

色々検証

HDDが2本ある状態でどうすれば効率的な管理ができるのか検証してみた。

インストールの際、/sda1と/sdb1をLinux RAIDで作成してRAID1を組み/dev/md0としてデバイスを作成。これを/bootにマウントする。/dev/sdaの残り領域をLVMとして作成して、このLVM内にSWAPと/(root)パーティションを置いた。

デバイス  ID  システム名
/dev/sda1 fd  Linux RAID 自動検出
/dev/sda2 8e  LVM
/dev/sdb1 fd Linux RAID 自動検出

起動後、/dev/sdb側にgrubブートローダーを突っ込む

grub
grub> root (hd1,0)
 Filesystem type is ext2fs, partition type 0xfd ←ここでパーティションIDを確認しておく
grub> setup (hd1)
grub> quit

まず、fdiskで/dev/sdbにLVMパーティションを作成する

fdisk /dev/sdb

PV(Physical Volume)を作成する

pvcreate /dev/sdb2

VG(Volume Group)へ作成したPVを追加する

vgextend VolGroup00 /dev/sdb2

LV(Logical Volume)をミラーモードに変更する

lvconvert -m 1 --mirrorlog core /dev/VolGroup00/LogVol01
 VolGroup00/LogVol01: Converted: 9.1%
 VolGroup00/LogVol01: Converted: 20.5%
[snip]
 VolGroup00/LogVol01: Converted: 100.0%

これで、LVがミラーモードとして稼働しだす。実行結果には少し時間がかかる。

確認してみる

lvs -a -o +devices
 LV                  VG         Attr   LSize Origin Snap%  Move Log Copy%  Convert Devices                    
LogVol00            VolGroup00 mwi-ao 1.00G                        100.00  LogVol00_mimage_0(0),LogVol00_mimage_1(0)
  [LogVol00_mimage_0] VolGroup00 iwi-ao 1.00G                                       /dev/sda2(220)
  [LogVol00_mimage_1] VolGroup00 iwi-ao 1.00G                                       /dev/sdb2(0)
LogVol01            VolGroup00 mwi-ao 6.88G                        100.00LogVol01_mimage_0(0),LogVol01_mimage_1(0)
  [LogVol01_mimage_0] VolGroup00 iwi-ao 6.88G                                       /dev/sda2(0)
  [LogVol01_mimage_1] VolGroup00 iwi-ao 6.88G                                       /dev/sdb2(32)
それぞれのLVMボリュームが/dev/sdaと/dev/sdbに割り振られているのです。