前提条件
- 対象はLinuxのソフトウェアRAID(mdadm)で構築されたRAID1アレイです。
- この記事では例として /dev/sdb が故障した想定で手順を説明しますが、/dev/sdaが故障した場合はデバイス名を入れ替えてください。
- 重要なデータは事前にバックアップしてください。
テスト: HDD故障のシミュレーション
まずは故障をシミュレートします。実際の取り外しを行うか、ソフト的に取り外す場合は次のコマンドを実行します。
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/sdaを故障と想定している場合は、/dev/sdaの位置に新しいディスクを装着して/dev/sdbとして接続しないよう注意してください。常にデバイス名を確認すること。)
システム起動後に次を確認します:
cat /proc/mdstat
例(省略なしの出力はそのまま表示されます):
[root@server1 ~]# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md0 : active raid1 sda1[0]
200704 blocks [2/1] [U_]
md1 : active raid1 sda2[0]
5036288 blocks [2/1] [U_]
unused devices:
[root@server1 ~]#
fdisk出力の例(確認用):
[root@server1 ~]# fdisk -l
Disk /dev/sda: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x0008b885
Device Boot Start End Blocks Id System
/dev/sda1 * 1 25 200781 fd Linux raid autodetect
/dev/sda2 26 652 5036377+ fd Linux raid autodetect
Disk /dev/sdb: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000
Disk /dev/sdb doesn't contain a valid partition table
Disk /dev/md1: 5157 MB, 5157158912 bytes
2 heads, 4 sectors/track, 1259072 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk identifier: 0x00000000
Disk /dev/md1 doesn't contain a valid partition table
Disk /dev/dm-0: 4462 MB, 4462739456 bytes
255 heads, 63 sectors/track, 542 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000
Disk /dev/dm-0 doesn't contain a valid partition table
Disk /dev/dm-1: 637 MB, 637534208 bytes
255 heads, 63 sectors/track, 77 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x30307800
Disk /dev/dm-1 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 identifier: 0x00000000
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: 652 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 10474379 10072755 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 ~]#
既存のRAID情報をクリアして再追加する
古いスーパーブロック情報を消去します:
mdadm --zero-superblock /dev/sdb1
mdadm --zero-superblock /dev/sdb2
そして新ディスクをRAIDに追加します:
mdadm -a /dev/md0 /dev/sdb1
mdadm -a /dev/md1 /dev/sdb2
進行状況を確認:
cat /proc/mdstat
同期中の例:
[root@server1 ~]# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md0 : active raid1 sdb1[1] sda1[0]
200704 blocks [2/2] [UU]
md1 : active raid1 sdb2[2] sda2[0]
5036288 blocks [2/1] [U_]
[=====>...............] recovery = 29.8% (1502656/5036288) finish=18.8min speed=3116K/sec
unused devices:
[root@server1 ~]#
同期が完了するまで待ちます。
[root@server1 ~]# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md0 : active raid1 sdb1[1] sda1[0]
200704 blocks [2/2] [UU]
md1 : active raid1 sdb2[1] sda2[0]
5036288 blocks [2/2] [UU]
unused devices:
[root@server1 ~]#
ブートローダを両方のHDDにインストールする
同期完了後、GRUBを両方のディスクにインストールしてブート可能にします。grubコマンドを起動して次を順に実行します:
grub
grubプロンプト内で:
root (hd0,0)
setup (hd0)
root (hd1,0)
setup (hd1)
quit
これでRAID1の故障ディスク交換と再同期は完了です。
重要な注意点
- デバイス名(/dev/sda, /dev/sdb)は環境により変わるため、必ずlsblkやblkidで確認してください。誤ったディスクに操作するとデータ消失の危険があります。
- 新ディスクの容量が元のディスクより小さいとパーティションを正常に作成できません。容量を確認してください。
- 本番環境では可能な限りホットスワップや冗長なバックアップを準備してください。
トラブルケースと対処(いつうまくいかないか)
- sfdiskでエラーが出てパーティションを書き込めない: –force を試す。さらに失敗する場合は parted や sgdisk を使って手動でパーティションを作成する。
- mdadmが新ディスクを受け付けない:
mdadm --examine /dev/sdb1
でスーパーブロックを確認し、必要ならmdadm --zero-superblock
を使って消去する。 - 同期が遅すぎる/止まる: I/O負荷やケーブル不良、ディスクの不調が原因のことがある。dmesgやsmartctlでハードウェアログを確認する。
代替アプローチ
- パーティションを手動で作成してからsfdiskではなく
dd
でMBRをコピーする(注意: GPTや大容量ディスクでは注意が必要)。 - 完全なバックアップからリストアして再構築する(RAID以外の方法で復旧する場合)。
- LVM上に構築されたRAIDなど、構成に応じた特別手順を用いる。
ミニ手順(短いチェックリスト)
- lsblk, blkidでディスク構成を確認する。
- mdadmで障害をシミュレーションまたは物理的にディスクを取り外す。
- 新ディスクを接続し、sfdiskでパーティションをコピー。
- mdadm –zero-superblock で古い情報を消去。
- mdadm -a でRAIDに追加し、/proc/mdstatで同期を監視。
- 同期完了後、GRUBを両ディスクにインストール。
- 再起動して正常にブートすることを確認。
役割別チェックリスト
- システム管理者: 事前バックアップ、メンテナンスウィンドウ設定、全コマンドの実行とログ取得。
- オペレーター: ケーブル交換やディスクの差し替え、コンソール出力の監視、進捗報告。
コマンドチートシート
- RAID確認: cat /proc/mdstat
- パーティションコピー: sfdisk -d /dev/sda | sfdisk /dev/sdb
- スーパーブロック消去: mdadm –zero-superblock /dev/sdb1
- RAID追加: mdadm -a /dev/md0 /dev/sdb1
- GRUBインストール: grub → root / setup / quit
1行用語集
- mdadm: ソフトウェアRAIDを管理するツール。
- /proc/mdstat: カーネルが管理するRAIDの状態情報。
- sfdisk: パーティションテーブルのバックアップ/復元ツール。
- GRUB: ブートローダ。
終わりに(要点まとめ)
RAID1のディスク交換は手順に従えば比較的直線的に行えますが、常にデバイス名と容量を確認し、バックアップとログ取得を怠らないでください。今回示したコマンドとチェックリストを用いれば、安全に故障ディスクの交換とRAID再同期が行えます。
リンク
- The Software-RAID Howto: http://tldp.org/HOWTO/Software-RAID-HOWTO.html
- Fedora: http://fedoraproject.org
著者
編集