このページの更新は 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
にあります。
目次
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
2 HDD 増設
電源を切り hda と同じ容量の HDD を増設します。ここでは hdb に増設しました。
(後で hda も換装するならばより大きな容量の HDD でも良いです。
または、パーティション構成を変えることも可能です)
パーティション作成
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() を呼び出して領域テーブルを再読込みします。
ディスクを同期させます。
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
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
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)をマウントすると、仮想領域を考慮しないでコピーできるので楽です。
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 が使用されています。
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 の古い設定部分を削除してもかまいません。
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 は手動でインストールしてください。
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 にして再構築の時にこれでハマリました。)
11 後書き
起動FD を作成しておけば USB 外付け HDD と RAID を組み ホットスワップも可能です。
(ただし USB は内蔵HDDより遅い)
現在、ファイル/データベースサーバ、会社のサーバ等いろいろな所で実運用中です。
initrd に RAID モジュールを入れなければならないことを知らずに何度もインストールしなおしたり、hdb には grub-install ができないし、、、
ひたすら google で調べまくりました。
諸先輩方のいろいろなサイトがあったからこのページを完成することができました。
感謝!
End of page