前提条件
- 対象はソフトウェアRAID(mdadm)で構成されたRAID1アレイです。
- root 権限で操作できること。
- 交換用のドライブ(容量は同等以上)が用意されていること。
- 既存のアレイは /dev/md0, /dev/md1 のようにパーティション単位で構成されている想定です。
用語定義(1行ずつ):
- RAID1: 同じデータを2台以上のディスクに保持するミラーリング方式。
- mdadm: Linux のソフトウェアRAID管理ユーティリティ。
- sfdisk: パーティションテーブルのバックアップ/復元に使うツール。
概要
この手順は次の流れで進みます。
- 故障ディスクをシミュレートしてアレイを劣化(degraded)させる。
- 新しいドライブにパーティションテーブルをコピーする。
- 古いRAID情報を消去して、新ドライブをアレイに追加する。
- 同期(リビルド)が完了したらブートローダを両ドライブに再インストールする。
重要: 実機で操作する前に必ずバックアップを取り、夜間のメンテナンスウィンドウを確保してください。
テスト:故障ディスクのシミュレーション
ここでは /dev/sdb が故障したことにします(/dev/sda が故障している場合はデバイス名を読み替えてください)。
物理的に取り外すか、ソフトで取り外しをシミュレートできます。ソフト側の例:
mdadm --manage /dev/md0 --fail /dev/sdb1
mdadm --manage /dev/md1 --fail /dev/sdb2
mdadm --manage /dev/md0 --remove /dev/sdb1
mdadm --manage /dev/md1 --remove /dev/sdb2
その後システムをシャットダウンします:
shutdown -h now
新しい /dev/sdb を挿入してシステムを起動します。正しく構成されていれば起動は問題なく終わるはずです。
起動後、アレイが劣化していることを確認します:
cat /proc/mdstat
出力例(劣化状態):
[root@server1 ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sda1[0]
104320 blocks [2/1] [U_]
md1 : active raid1 sda2[0]
10377920 blocks [2/1] [U_]
unused devices:
[root@server1 ~]#
ディスク情報を確認します:
fdisk -l
期待される出力の例(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 13 104391 fd Linux raid autodetect
/dev/sda2 14 1305 10377990 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/md1: 10.6 GB, 10626990080 bytes
2 heads, 4 sectors/track, 2594480 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk /dev/md1 doesn't contain a valid partition table
Disk /dev/md0: 106 MB, 106823680 bytes
2 heads, 4 sectors/track, 26080 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 208844 208782 fd Linux raid autodetect
/dev/sdb2 208845 20964824 20755980 fd Linux raid autodetect
/dev/sdb3 0 - 0 0 Empty
/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 ~]#
注意: sfdisk が sector 0 の署名を警告することがありますが、操作自体は正しくパーティションテーブルを書き込むことが多いです。問題がある場合は –force を検討します。
既存RAID情報の消去とアレイへの追加
古いRAIDメタデータ(スーパーブロック)が残っているとアレイに追加できないため、ゼロ化します。
mdadm --zero-superblock /dev/sdb1
mdadm --zero-superblock /dev/sdb2
その後、新しいパーティションをアレイへ追加します:
mdadm -a /dev/md0 /dev/sdb1
mdadm -a /dev/md1 /dev/sdb2
追加直後に /proc/mdstat を確認します。
cat /proc/mdstat
出力例(リビルド開始):
[root@server1 ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb1[1] sda1[0]
104320 blocks [2/2] [UU]
md1 : active raid1 sdb2[2] sda2[0]
10377920 blocks [2/1] [U_]
[======>..............] recovery = 32.3% (3360768/10377920) finish=1.5min speed=74238K/sec
unused devices:
[root@server1 ~]#
同期の完了を待つ
完全に同期されるまで待ちます。完了後の /proc/mdstat の例:
[root@server1 ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb1[1] sda1[0]
104320 blocks [2/2] [UU]
md1 : active raid1 sdb2[1] sda2[0]
10377920 blocks [2/2] [UU]
unused devices:
[root@server1 ~]#
同期が完了するまでの時間はディスク性能と使用中ロードに依存します。負荷の高い時間帯を避けると短時間で完了しやすいです。
ブートローダの再インストール
両方のディスクにGRUBをインストールしておきます。grub コマンドを起動して、以下の手順を実行します(GRUBのバージョンにより手順は異なるため、環境に合わせてください)。
grub
grub プロンプトで:
root (hd0,0)
setup (hd0)
root (hd1,0)
setup (hd1)
quit
これで新しいディスクからも起動可能になります。
受け入れ基準
- /proc/mdstat にて全ての md デバイスが [UU] になっていること。
- システムが両ドライブから問題なく起動することを確認。
- mdadm –detail でアレイの状態が正常(状態: clean)であること。
チェックリスト(運用者用)
- 交換前にバックアップを取得
- メンテナンスウィンドウを確保
- 劣化を確認(cat /proc/mdstat)
- 新ドライブを挿入
- sfdisk でパーティションを複製
- mdadm –zero-superblock を実行
- mdadm -a で追加
- 同期状況を監視(cat /proc/mdstat)
- 同期後にGRUBを両ディスクへインストール
- 起動テスト実施
SOP(短い手順書)
- 故障ディスクを取り外す/マークする。
- 新ドライブ挿入。
- sfdisk -d /dev/sda | sfdisk /dev/sdb を実行。
- mdadm –zero-superblock で古いメタデータを削除。
- mdadm -a でアレイに追加。
- 同期終了後、grub を両ディスクへインストール。
- 再起動してブート確認。
トラブルシューティング(いつ失敗するか/対処)
- sfdisk が書き込みに失敗する場合:
- デバイス名が正しいか再確認。
- ディスクが不良セクタを含む場合がある。smartctl で健康状態を確認。
- mdadm が追加を拒否する場合:
- –zero-superblock を見落としている可能性。再度実行。
- パーティションのサイズや開始位置が一致しているか確認。
- 同期が非常に遅い/進まない場合:
- I/O 負荷を確認。負荷が高ければオフピークで再試行。
- 転送速度が極端に低いときはケーブルやコントローラ問題を疑う。
- システムが新ドライブから起動できない場合:
- GRUB のインストール先を間違えている可能性。両ディスクにインストール。
- BIOS/UEFI のブート順を確認。
決定フローチャート
以下は基本的な判断フローの例です。
flowchart TD
A[障害検知] --> B{アレイは劣化しているか}
B -- はい --> C[故障ディスクを特定]
B -- いいえ --> Z[運用監視を継続]
C --> D{ディスクを物理交換できるか}
D -- はい --> E[ディスクを交換]
D -- いいえ --> F[ソフトでマークしてリビルド]
E --> G[パーティションをコピー 'sfdisk']
G --> H[zero-superblock & mdadm -a]
H --> I[リビルド監視]
I --> J{同期完了?}
J -- はい --> K[GRUB を両ディスクにインストール]
J -- いいえ --> L[ログ確認・I/O診断]
K --> M[再起動して動作確認]
M --> N[完了]
事実ボックス(参考)
- 再同期速度はディスク性能と負荷に依存。数十MB/s〜数百MB/sが一般的。
- mdadm のリビルドはアレイが稼働中でも実行可能だが、I/O へ影響する。
役割別チェック(簡易)
- システム管理者:
- バックアップ、メンテナンスウィンドウの計画、操作実行。
- オペレーション:
- ログ監視、同期進捗の報告、再起動確認。
- ハードウェア担当:
- 物理交換、ケーブル/トレイ確認、SMART診断。
用語集(1行)
- mdadm: Linux ソフトウェアRAIDの管理ツール。
- sfdisk: パーティションテーブルのダンプ/書き込みツール。
- GRUB: Linux のブートローダ。
まとめ
RAID1 の故障ディスク交換は、パーティションコピー(sfdisk)、スーパーブロックのゼロ化、mdadm による再追加、同期の監視、そしてGRUBの再インストールの順で安全に進められます。事前のバックアップとメンテナンス計画、同期完了とブートテストの確認を忘れないでください。
リンク
- The Software-RAID Howto: http://tldp.org/HOWTO/Software-RAID-HOWTO.html
- CentOS: http://www.centos.org/