9 テスト
ここでは故障したハードドライブをシミュレートします。/dev/sda と /dev/sdb のどちらを選んでも構いませんが、以下の例では /dev/sdb が故障したと仮定します。
故障のシミュレーション方法は2通りあります。
- システムをシャットダウンして物理的にドライブを取り外す(ホットスワップ非対応の環境)。
- ソフト的にドライブを故障扱いにする(稼働中のテストに便利)。
下のコマンドでソフト除外できます(そのまま貼り付けて実行してください)。
mdadm --manage /dev/md0 --fail /dev/sdb1
mdadm --manage /dev/md1 --fail /dev/sdb2
mdadm --manage /dev/md2 --fail /dev/sdb3
mdadm --manage /dev/md0 --remove /dev/sdb1
mdadm --manage /dev/md1 --remove /dev/sdb2
mdadm --manage /dev/md2 --remove /dev/sdb3
システムをシャットダウンします。
shutdown -h now
その後、新しい /dev/sdb ドライブを装着してシステムを起動してください(もし /dev/sda を故障扱いにした場合は、新しいドライブを /dev/sda の位置に差し替え、古い sda を sdb として接続し直す等の物理的配置に注意してください)。正常ならばシステムは問題なく起動するはずです。
次に現在のRAID状態を確認します。
cat /proc/mdstat
以下は想定される劣化(degraded)状態の出力例です。
[root@server1 ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sda1[0]
200704 blocks [2/1] [U_]
md1 : active raid1 sda2[0]
522048 blocks [2/1] [U_]
md2 : active raid1 sda3[0]
9759360 blocks [2/1] [U_]
unused devices:
[root@server1 ~]#
fdiskの出力も確認します。
fdisk -l
出力例(/dev/sdb にパーティションテーブルがない状態):
[root@server1 ~]# fdisk -l
Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 25 200781 fd Linux raid autodetect
/dev/sda2 26 90 522112+ fd Linux raid autodetect
/dev/sda3 91 1305 9759487+ fd Linux raid autodetect
Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sdb doesn't contain a valid partition table
Disk /dev/md2: 9993 MB, 9993584640 bytes
2 heads, 4 sectors/track, 2439840 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk /dev/md2 doesn't contain a valid partition table
Disk /dev/md1: 534 MB, 534577152 bytes
2 heads, 4 sectors/track, 130512 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk /dev/md1 doesn't contain a valid partition table
Disk /dev/md0: 205 MB, 205520896 bytes
2 heads, 4 sectors/track, 50176 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk /dev/md0 doesn't contain a valid partition table
[root@server1 ~]#
パーティションテーブルのコピー
健全なドライブ(この例では /dev/sda)のパーティションテーブルを新しいドライブ(/dev/sdb)にコピーします。
sfdisk -d /dev/sda | sfdisk /dev/sdb
もしエラーが出る場合は –force オプションを試します。
sfdisk -d /dev/sda | sfdisk --force /dev/sdb
出力例:
[root@server1 ~]# sfdisk -d /dev/sda | sfdisk /dev/sdb
Checking that no-one is using this disk right now ...
OK
Disk /dev/sdb: 1305 cylinders, 255 heads, 63 sectors/track
sfdisk: ERROR: sector 0 does not have an msdos signature
/dev/sdb: unrecognized partition table type
Old situation:
No partitions found
New situation:
Units = sectors of 512 bytes, counting from 0
Device Boot Start End #sectors Id System
/dev/sdb1 * 63 401624 401562 fd Linux raid autodetect
/dev/sdb2 401625 1445849 1044225 fd Linux raid autodetect
/dev/sdb3 1445850 20964824 19518975 fd Linux raid autodetect
/dev/sdb4 0 - 0 0 Empty
Successfully wrote the new partition table
Re-reading the partition table ...
If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
to zero the first 512 bytes: dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(See fdisk(8).)
[root@server1 ~]#
RAIDメタデータのクリアと再追加
古いRAID設定の痕跡が残っている可能性があるため、superblock を消去します。
mdadm --zero-superblock /dev/sdb1
mdadm --zero-superblock /dev/sdb2
mdadm --zero-superblock /dev/sdb3
その後、新しいパーティションをRAIDに追加します。
mdadm -a /dev/md0 /dev/sdb1
mdadm -a /dev/md1 /dev/sdb2
mdadm -a /dev/md2 /dev/sdb3
再度 /proc/mdstat を確認します。
cat /proc/mdstat
同期中(recovery)の例:
[root@server1 ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb1[1] sda1[0]
200704 blocks [2/2] [UU]
md1 : active raid1 sdb2[1] sda2[0]
522048 blocks [2/2] [UU]
md2 : active raid1 sdb3[2] sda3[0]
9759360 blocks [2/1] [U_]
[=======>.............] recovery = 39.4% (3846400/9759360) finish=1.7min speed=55890K/sec
unused devices:
[root@server1 ~]#
同期が完了するまで待ちます。
[root@server1 ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb1[1] sda1[0]
200704 blocks [2/2] [UU]
md1 : active raid1 sdb2[1] sda2[0]
522048 blocks [2/2] [UU]
md2 : active raid1 sdb3[1] sda3[0]
9759360 blocks [2/2] [UU]
unused devices:
[root@server1 ~]#
ブートローダのインストール
RAID構成では両方のHDDにGRUBをインストールしておくと冗長性が高まります。grubコマンドを起動して手動でインストールする例を示します。
grub
grubの対話で下記を実行します(環境によってコマンドは異なることがあります。UEFIやgrub2の環境では別手順が必要です)。
root (hd0,0)
setup (hd0)
root (hd1,0)
setup (hd1)
quit
これで故障ドライブの交換処理は完了です。RAID1配列内のドライブを交換して再同期させ、ブートローダを両方のディスクにインストールしました。
よくある注意点とトラブルシューティング
重要: 本番環境では作業前に必ず最新のバックアップを取得してください。さらに、以下を確認してください。
- ケーブルや電源の物理故障をまず疑う(接触不良やSATAケーブルの断線)。
- ホットスワップ対応かどうかを確認。非対応ならシャットダウンが必要。
- RAIDの同期中はI/O負荷を分散し、重要なバッチ処理は避ける。
トラブル例:
- sfdisk がパーティションテーブルを書き込めない: 別プロセスがディスクを使用中でないか確認し、必要なら –force を使用する。
- mdadm による再追加で同期が走らない: /proc/mdstat の状態を確認し、dmesg にエラーがないか確認する。
- ブートしなくなった: GRUB を正しいデバイスにインストールしたか確認し、必要ならライブCD/USBから修復する。
代替アプローチ
- dd でパーティションテーブルの先頭セクタ(512バイト)を直接コピーする方法。シンプルだがパーティション配置の境界が微妙な場合は注意が必要。
- パーティションを手動で作成してから mdadm –add で追加する方法。自動コピーがうまくいかない場合の保険として有効。
- LVM を利用している場合は論理ボリューム単位での再構成を検討する。LVM上にRAIDを構築している場合は手順が変わる。
受入基準
- /proc/mdstat で全ての md デバイスが [UU] になっていること。
- ファイルシステムに対する読み書きが正常に行えること(簡単な読み書きテストを推奨)。
- GRUB が両方のディスクにインストールされ、どちらのディスクからもブートできること(可能なら片方を外して起動確認)。
役割別チェックリスト
システム管理者:
- バックアップの確認
- メンテナンスウィンドウの確保
- ハードウェア互換性の確認
オペレーター:
- コマンド実行ログの保存
- 進捗(/proc/mdstat)の定期チェック
- dmesg と syslog の監視
運用ポリシー担当:
- ロールバック手順の承認
- 予備ディスクの在庫確認
ミニ手法(方法の要約)
- 故障ドライブを取り外す(または mdadm で fail/remove)。
- 新ドライブを装着し、/dev/sda のパーティションテーブルを sfdisk でコピー。
- mdadm –zero-superblock で古いメタデータを消去。
- mdadm -a で RAID に追加。
- /proc/mdstat で同期完了を確認。
- GRUB を両方のディスクにインストール。
リスクマトリクスと軽減策(定性的)
- 人的ミス(高): 手順書の用意、チェックリストと複数承認で軽減。
- データ損失(中): 作業前のバックアップ、同期状態の確認、read-only テスト。
- ハードウェア障害(中): 予備ディスクの在庫、 SMART チェックの定期実施。
1行用語集
- RAID1: ディスクをミラーリングして冗長性を確保するRAIDレベル。
- mdadm: LinuxのソフトウェアRAIDを管理するユーティリティ。
- sfdisk: パーティションテーブルをバックアップ/復元するツール。
- superblock: mdadm がディスク上に書き込むRAIDメタデータ。
まとめ
この手順でRAID1の故障ドライブを安全に交換できます。重要なのは事前のバックアップと、同期完了およびブートの復旧確認です。作業は計画的に、ログを取りながら実行してください。
10 リンク
- The Software-RAID Howto: http://tldp.org/HOWTO/Software-RAID-HOWTO.html
- CentOS: http://www.centos.org/