CentOS で Soft RAID1 を構築

2007-09-29 更新
このページの更新は http://comp.ddo.jp/linux/raid.html で行なっています。(追加記事があります)
既存のシステムを RAID 1 (ミラー)化する試み。
CentOS 3.x、CentOS 4.x で運用しています。 (たぶん mdadm を使用しているデストリならうまくいくと思います)
インストール時の RAID 構築は超簡単なのでここには書きません。
失敗すると起動不能になります。自己責任で行なってください。
(ころばぬ先のバックアップを取りましょう!)
センチュリーのニコイチ+500GBHDD×2 セットを購入して 外付け RAID1 で使おうとしたが Linux (CentOS 4.5) で個別認識ができなかった。
PC内蔵 HDD を 換装しの 500GB の RAID1 にしました。
古い HDD をニコイチに入れてバックアップ用にしました。(コンバインモードではLinux で認識しました)

mdadm を使用します。mdadm の日本語 man は http://www.ioss.jp/sohodiy/mdadm8-1_5.html にあります。

トップ | 目次 調査 HDD増設 パーティション作成 RAID作成 フォーマット コピー RAID起動 hdaを追加 ブートセクタ メンテナンス 後書き

目次



トップ | 目次 調査 HDD増設 パーティション作成 RAID作成 フォーマット コピー RAID起動 hdaを追加 ブートセクタ メンテナンス 後書き

1 現在の構成を調査

1 ディレクトリ構成をメモしておきます。
# df -h
Filesystem          サイズ  使用  残り  使用% マウント位置
/dev/hda1             4.0G  2.1G  1.8G   53% /
none                  189M     0  189M    0% /dev/shm
/dev/hda3             3.4G   38M  3.2G    2% /home
# fdisk -l /dev/hda

Disk /dev/hda: 8455 MB, 8455200768 bytes
255 heads, 63 sectors/track, 1027 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/hda1    *          1         522     4192933+  83  Linux
/dev/hda2             523         587      522112+  82  Linux スワップ
/dev/hda3             588        1027     3534300+  83  Linux


トップ | 目次 調査 HDD増設 パーティション作成 RAID作成 フォーマット コピー RAID起動 hdaを追加 ブートセクタ メンテナンス 後書き

2 HDD 増設

電源を切り hda と同じ容量の HDD を増設します。ここでは hdb に増設しました。
(後で hda も換装するならばより大きな容量の HDD でも良いです。
または、パーティション構成を変えることも可能です)


トップ | 目次 調査 HDD増設 パーティション作成 RAID作成 フォーマット コピー RAID起動 hdaを追加 ブートセクタ メンテナンス 後書き

パーティション作成

hdb を hda と同じパーティションで作成します。ただし、System 83 は fd に変更しま>す。
(パーティションを変更する場合はそれなりに、、、)
(同じ容量の HDD が無かったので 80 MB の HDD を増設しています。)
Units = シリンダ数 of 16065 * 512 = 8225280 bytes の部分が同じならば パーティションサイズをブロック番号で指定できます。
そうでなければ +◯◯MB と hda のサイズを超えないように指定します。
セクタ/トラック、上記の 16065 は fdisk の「特別な機能(エキスパート専用)」 で変更できます。
興味があるならば fdisk を調べてください。
# fdisk /dev/hdb
  ... (メッセージが表示される)
    (既存のパーティションがあれば d コマンドで削除します。)

コマンド (m でヘルプ): p   ← 現在の状態を確認

Disk /dev/hdb: 82.3GB, 82348277760 bytes
255 heads, 63 sectors/track, 10011 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot Start End Blocks Id System

コマンド (m でヘルプ):
n   ← 新たなパーティションを作成
コマンドアクション
   e  拡張
   p  基本領域 (1-4)

p   ← 基本領域を作成
領域番号 (1-4): 1
最初 シリンダ (1-10011, default 1):   ← [Enter]キー(デフォルト値 1)
Using default value 1
終点 シリンダ または +サイズ または +サイズM または +サイズK (1-10011, default 10011):
522   ← hda と同じ

コマンド (m でヘルプ): t   ← システムタイプを変更
Selected partition 1
16進数コード (L コマンドでコードリスト表示): fd
領域のシステムタイプを 1 から fd (Linux raid 自動検出) に変更しました

コマンド (m でヘルプ): a   ← 起動パーティション
領域番号 (1-4): 1

コマンド (m でヘルプ): n
コマンドアクション
   e  拡張
   p  基本領域 (1-4)

p
領域番号 (1-4): 2
最初 シリンダ (523-10011, default 523):
Using default value 523
終点 シリンダ または +サイズ または +サイズM または +サイズK (1-10011, default 10011): 587

コマンド (m でヘルプ): t
領域番号 (1-4): 2
16進数コード (L コマンドでコードリスト表示): 82
領域のシステムタイプを 2 から 82 (Linux スワップ) に変更しました

コマンド (m でヘルプ): n
コマンドアクション
   e  拡張
   p  基本領域 (1-4)

p
領域番号 (1-4): 3
最初 シリンダ (588-10011, default 588):
Using default value 588
終点 シリンダ または +サイズ または +サイズM または +サイズK (1-10011, default 10011):
1027

コマンド (m でヘルプ): t
領域番号 (1-4): 3
16進数コード (L コマンドでコードリスト表示): fd
領域のシステムタイプを 3 から fd (Linux raid 自動検出) に変更しました

コマンド (m でヘルプ): p   ← 設定を確認

Disk /dev/hdb: 82.3GB, 82348277760 bytes
255 heads, 63 sectors/track, 10011 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1         522     4192933+  fd  Linux raid 自動検出
/dev/hda2             523         587      522112+  82  Linux スワップ
/dev/hda3             588        1027     3534300+  fd  Linux raid 自動検出

コマンド (m でヘルプ):
w   ← 設定を書き込んで終了。なにもせず終了ならば q
領域テーブルは交換されました!

ioctl() を呼び出して領域テーブルを再読込みします。
ディスクを同期させます。



トップ | 目次 調査 HDD増設 パーティション作成 RAID作成 フォーマット コピー RAID起動 hdaを追加 ブートセクタ メンテナンス 後書き

4 RAID 作成

増設した HDD に RAID を作成します。
hda は まだ RAID になっていないので missinng とし縮退モードでの RAID になります。
# mdadm -C /dev/md0 -l1 -n2 -x1 missing /dev/hdb1   ← / に対応
mdadm: /dev/hdb1 appears to contain an ext2fs file system
    size=2096384K mtime=Sat Mar 18 01:29:18 2006
mdadm: /dev/hdb1 appears to be part of a raid array:
    level=1 devices=2 ctime=Fri Mar 17 22:37:47 2006
Continue creating array?
y
mdadm: array /dev/md0 started.
# mdadm -C /dev/md1 -l1 -n2 missing /dev/hdb3   ← /home に対応
mdadm: /dev/hdb3 appears to contain an ext2fs file system
    size=3534208K mtime=Fri Mar 17 09:38:41 2006
mdadm: /dev/hdb3 appears to be part of a raid array:
    level=1 devices=2 ctime=Fri Mar 17 01:22:23 2006
Continue creating array?
y
mdadm: array /dev/md1 started.
# cat /proc/mdstat   ← RAID の状況を表示する
Personalities : [raid1]
md1 : active raid1 hdb3[1]
      3534208 blocks [2/1] [_U]   ← _ は未使用、U は使用中

md0 : active raid1 hdb1[1]
      4192832 blocks [2/1] [_U]

unused devices: <none>

mdadm -C のオプション
-lN     (-l は小文字のエルです) N は RAID レベル。通常 1 か 5 を指定します。
-nM     M は使用するハードディスク(パーティション)の数。 RAID1 は 2 台、RAID 5 は 3 台以上となります。
-xX     X はスペアディスクの数。 稼働中のディスクが故障すると自動的にスペアディスクに切替わります。
  例 # mdadm -C /dev/md0 -l1 -n2 -x1 missing /dev/hdb1 missing


トップ | 目次 調査 HDD増設 パーティション作成 RAID作成 フォーマット コピー RAID起動 hdaを追加 ブートセクタ メンテナンス 後書き

5 フォーマット

-j を付けて ext3 型式でフォーマットしました。
# mkfs -j /dev/md0
mke2fs 1.35 (28-Feb-2004)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
524288 inodes, 1048208 blocks
52410 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1073741824
32 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736

Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 34 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
# mkfs -j /dev/md1
mke2fs 1.35 (28-Feb-2004)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
442368 inodes, 883552 blocks
44177 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=905969664
27 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200

Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 26 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
# mkswap /dev/hdb2   ← swap 領域もフォーマット
Setting up swapspace version 1, size = 534638 kB


トップ | 目次 調査 HDD増設 パーティション作成 RAID作成 フォーマット コピー RAID起動 hdaを追加 ブートセクタ メンテナンス 後書き

6 コピー

# mount /dev/md0 /mnt   ← / 対応のマウント
# mkdir /mnt/mnt
# mkdir /mnt/proc   ← 仮想領域
# mkdir /mnt/sys   ← 仮想領域
# mkdir /mnt/selinux   ← 仮想領域
# mkdir /mnt/tmp   ← /tmp の中味はいらない
# mkdir /mnt/home   ← 別パーティション
# cp -a --target-directory=/mnt \
> /bin /boot /dev /etc /initrd /lib /misc /opt \
> /root /sbin /usr /var
  容量により数分から数十分かかります。
# umount /mnt   ← md0 をアンマウント
# mount /dev/md1 /mnt   ← /home 対応のマウント
# cp -a /home/* /mnt
# umount /mnt
System Rescue CD で起動し、各パーティション(例:/dev/hda1と/dev/md0)をマウントすると、仮想領域を考慮しないでコピーできるので楽です。


トップ | 目次 調査 HDD増設 パーティション作成 RAID作成 フォーマット コピー RAID起動 hdaを追加 ブートセクタ メンテナンス 後書き

7 RAID 起動

RAID をサポートする initrd を作成します。
mkinitrd でデバイスを自動検出してくれます。
これは初めて RAID を構築する時のみの作業です。
RAID になった後は # yum update で kernel をアップデートした場合、そのまま再起動できます。
# uname -r    カーネルバージョンを確認
2.6.9-34.EL
# mkinitrd -v /boot/initrd-2.6.9-34.EL.raid.img 2.6.9-34.EL
Creating initramfs
Looking for deps of module ide-disk
Looking for deps of module raid1
Looking for deps of module ext3 jbd
Looking for deps of module jbd
Using modules: ./kernel/drivers/md/raid1.ko ./kernel/fs/jbd/jbd.ko ./kernel/fs/ext3/ext3.ko
/sbin/nash -> /tmp/initrd.ZY3499/bin/nash
/sbin/insmod.static -> /tmp/initrd.ZY3499/bin/insmod
/sbin/udev.static -> /tmp/initrd.ZY3499/sbin/udev
/etc/udev/udev.conf -> /tmp/initrd.ZY3499/etc/udev/udev.conf
/lib/modules/2.6.9-34.EL/./kernel/drivers/md/raid1.ko(elf32-i386) から /tmp/initrd.ZY3499/lib/raid1.ko(elf32-i386) へコピーします
/lib/modules/2.6.9-34.EL/./kernel/fs/jbd/jbd.ko(elf32-i386) から /tmp/initrd.ZY3499/lib/jbd.ko(elf32-i386) へコピーします
/lib/modules/2.6.9-34.EL/./kernel/fs/ext3/ext3.ko(elf32-i386) から /tmp/initrd.ZY3499/lib/ext3.ko(elf32-i386) へコピーします
Loading module raid1
Loading module jbd
Loading module ext3
grub.conf に RAID 用のスクリプトを追加します。
# vi /boot/grub/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You do not have a /boot partition. This means that
#          all kernel and initrd paths are relative to /, eg.
#          root (hd0,0)
#          kernel /boot/vmlinuz-version ro root=/dev/hda1
#          initrd /boot/initrd-version.img
#boot=/dev/hda
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS RAID1 (2.6.9-34.EL)
        root (hd0,0)
        kernel /boot/vmlinuz-2.6.9-34.EL ro root=/dev/md0 rhgb quiet
        initrd /boot/initrd-2.6.9-34.EL.raid.img

title CentOS (2.6.9-34.EL)
        root (hd0,0)
        kernel /boot/vmlinuz-2.6.9-34.EL ro root=LABEL=/ rhgb quiet
        initrd /boot/initrd-2.6.9-34.EL.img
  ... 以下省略
変更したファイルを /dev/md0 にコピーし、 etc/fstab を変更します。
# mount /dev/md0 /mnt
# cp /boot/initrd-2.6.9-34.EL.raid.img /mnt/boot
# cp /boot/grub/grub.conf /mnt/boot/grub
cp: `/mnt/boot/grub/grub.conf' を上書きしてもよろしいですか(yes/no)? y
# vi /mnt/etc/fstab
# This file is edited by fstab-sync - see 'man fstab-sync' for details
/dev/md0                /                       ext3    defaults        1 1
none                    /dev/pts                devpts  gid=5,mode=620  0 0
none                    /dev/shm                tmpfs   defaults        0 0
/dev/md1                /home                   ext3    defaults        1 2
none                    /proc                   proc    defaults        0 0
none                    /sys                    sysfs   defaults        0 0
/dev/hda2               swap                    swap    defaults        0 0
/dev/hdb2               swap                    swap    defaults        0 0
/dev/hdc                /media/cdrecorder       auto    pamconsole,fscontext=sys
tem_u:object_r:removable_t,exec,noauto,managed 0 0
/dev/fd0                /media/floppy           auto    pamconsole,fscontext=sys
tem_u:object_r:removable_t,exec,noauto,managed 0 0
grub をブートセクタに書込みシステムを再起動して確認します。
# grub-install /dev/hda
# reboot
起動時のメニューでは、既定で CentOS RAID1 (2.6.9-34.EL) が選択されているはずです。
# df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/md0              4.0G  2.1G  1.7G  56% /
none                  189M     0  189M   0% /dev/shm
/dev/md1              3.4G   39M  3.2G   2% /home
/dev/md0 と /dev/md1 が使用されています。


トップ | 目次 調査 HDD増設 パーティション作成 RAID作成 フォーマット コピー RAID起動 hdaを追加 ブートセクタ メンテナンス 後書き

8 hda を RAID1 に追加

hda を RAID 用に変更します。
容量を変更する場合は増設した HDD と同じ容量のものと換装してパーティーションを作成します。
# fdisk /dev/hda

このディスクのシリンダ数は 1027 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
(例. DOS FDISK, OS/2 FDISK)

コマンド (m でヘルプ):
p   ← 現在の状態

デバイス Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1         522     4192933+  83  Linux
/dev/hda2             523         587      522112+  82  Linux スワップ
/dev/hda3             588        1027     3534300   83  Linux

コマンド (m でヘルプ):
t   ← ID を変更
領域番号 (1-4): 1   ← hda1
16進数コード (L コマンドでコードリスト表示): fd
領域のシステムタイプを 1 から fd (Linux raid 自動検出) に変更しました

コマンド (m でヘルプ):
t
領域番号 (1-4): 3
16進数コード (L コマンドでコードリスト表示): fd
領域のシステムタイプを 3 から fd (Linux raid 自動検出) に変更しました

コマンド (m でヘルプ):
p   ← 確認

Disk /dev/hda: 8455 MB, 8455200768 bytes
255 heads, 63 sectors/track, 1027 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot Start End Blocks Id System
/dev/hda1   *           1         522     4192933+  fd  Linux raid 自動検出
/dev/hda2             523         587      522112+  82  Linux スワップ
/dev/hda3             588        1027     3534300   fd  Linux raid 自動検出

コマンド (m でヘルプ):
w
領域テーブルは交換されました!

ioctl() を呼び出して領域テーブルを再読込みします。
ディスクを同期させます。

# mdadm /dev/md0 -a /dev/hda1   ← hda1 を>追加
mdadm: hot added /dev/hda1
# mdadm /dev/md1 -a /dev/hda3   ← hda3 を>追加
mdadm: hot added /dev/hda3
# cat /proc/mdstat   ← 状態を確認
Personalities : [raid1]
md1 : active raid1 hda3[2] hdb3[1]
      3534208 blocks [2/1] [_U]
        resync=DELAYED
md0 : active raid1 hda1[2] hdb1[1]
      4192832 blocks [2/1] [_U]
      [>....................] recovery = 1.6% (70656/4192832) finish=15.5min speed=4416K/sec   ← 同期中
unused devices:

同期中でも、パフォーマンスがおちますが通常の操作は可能です。
ここまで来れば grub.conf の古い設定部分を削除してもかまいません。


トップ | 目次 調査 HDD増設 パーティション作成 RAID作成 フォーマット コピー RAID起動 hdaを追加 ブートセクタ メンテナンス 後書き

9 ブートセクタの更新

# grub

    GNU GRUB version 0.95 (640K lower / 3072K upper memory)

 [ Minimal BASH-like line editing is supported. For the first word, TAB
   lists possible command completions. Anywhere else TAB lists the possible
   completions of a device/filename.]

grub>
device (hd0) /dev/hdb   ← hdb の場合

grub> root (hd0,0)
 Filesystem type is ext2fs, partition type 0xfd

grub> install /boot/grub/stage1 (hd0) /boot/grub/stage2 p /boot/grub/grub.conf

grub> quit
/boot を別パーティションにしている場合は root の位置を修正し、install の /boot/grub/... を /grub/... とします。

RAID になってしまうと grub-install /dev/hda としても /dev/md0 does not have any corresponding BIOS drive. とエラーになるので、 hda の grub も手動インストールになります。
(最初の入力行が device (hd0) /dev/hda になります。)
yum update 等でカーネルをアップデートした場合は起動 HDD のブートセクタしか更新されません。
もう片方の HDD は手動でインストールしてください。


トップ | 目次 調査 HDD増設 パーティション作成 RAID作成 フォーマット コピー RAID起動 hdaを追加 ブートセクタ メンテナンス 後書き

10 メンテナンス

RAID の状態を見る

# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 hda3[0] hdb3[1]
      3534208 blocks [2/2] [UU]   ← [UU] ならば正常

md0 : active raid1 hda1[0] hdb1[1]
4192832 blocks [2/2] [UU]

unused devices:

RAID アレイの情報を見る

# mdadm -D /dev/md0
/dev/md0:
        Version : 00.90.01
  Creation Time : Sat Mar 18 11:44:40 2006
     Raid Level : raid1
     Array Size : 4192832 (3.100 GiB 4.29 GB)
    Device Size : 4192832 (3.100 GiB 4.29 GB)
   Raid Devices : 2
  Total Devices : 2
Preferred Minor : 0
    Persistence : Superblock is persistent

    Update Time : Sat Mar 18 13:51:35 2006
          State : clean
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0



    Number   Major   Minor   RaidDevice State
       0       3        1        0      active sync   /dev/hda1
       1       3       65        1      active sync   /dev/hdb1
           UUID : 3a7aa882:d7b0d8cf:b19d3eaf:3ec60cf0
         Events : 0.1301

RAID デバイスを故障扱いにする。

# mdadm /dev/md1 -f /dev/hdb3   ← hda3 を故障状態に
mdadm: set /dev/hdb3 faulty in /dev/md1   ← 状態を確認
# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 hda3[0] hdb3[2](F)   ← hdb3 が故障
      3534208 blocks [2/1] [U_]

md0 : active raid1 hda1[0] hdb1[1]
      4192832 blocks [2/2] [UU]

unused devices:

RAID デバイスを取り外す

正常時は外せません。-f で故障扱いにしてから取り外します。
# mdadm /dev/md1 -r /dev/hdb3
mdadm: hot removed /dev/hdb3

RAID デバイスを追加する

予め fdisk でパーテイションを作成してから追加します。
故障扱い(-f)にした場合は取り外して(-r)から追加します。
# mdadm /dev/md1 -a /dev/hdb3
mdadm: hot added /dev/hdb3
転送速度によりますが 百GB 位ならば同期完了まで半日くらいかかるかもしれません。

RAID の状態変化をメールで知らせる

# mdadm -Fs -m hoge@example.com -d 120 &   120秒間隔でチェック

RAID を停止する

# mdadm -S /dev/md1

以前使っていたパーティションを再構築、追加するときに古いスーパブロックがあると エラーが出て失敗することがあります。
その場合は df コマンド、/proc/mdstat 等でパーティションが使用中でないことを 確認して
# mdadm --zero-superblock /dev/hda2
というようにスーパブロックを削除してから
# mdadm -C ...
または
mdadm /dev/mdn -a ...
します。
(CentOS3 から CentOS4 にして再構築の時にこれでハマリました。)


トップ | 目次 調査 HDD増設 パーティション作成 RAID作成 フォーマット コピー RAID起動 hdaを追加 ブートセクタ メンテナンス 後書き

11 後書き

起動FD を作成しておけば USB 外付け HDD と RAID を組み ホットスワップも可能です。
(ただし USB は内蔵HDDより遅い)

現在、ファイル/データベースサーバ、会社のサーバ等いろいろな所で実運用中です。

initrd に RAID モジュールを入れなければならないことを知らずに何度もインストールしなおしたり、hdb には grub-install ができないし、、、
ひたすら google で調べまくりました。
諸先輩方のいろいろなサイトがあったからこのページを完成することができました。 感謝!


トップ | 目次 調査 HDD増設 パーティション作成 RAID作成 フォーマット コピー RAID起動 hdaを追加 ブートセクタ メンテナンス 後書き
End of page