mdadm で作成した RAID が壊れたときの修復方法

/dev/sdb が壊れたのなら、ハードディスクを交換すれば問題なく起動してRAIDの再構築ができそうだが、今回は壊れたのが、sda なので、下手するとブートローダーが見つからず起動できなくなる可能性があった。


RAIDにしたときに、sdb に grub のインストールをしていたはずだが、念のため再起動する前に sdb に grub をインストールしなおしておく

# grub
grub> root (hd1,0)
grub> setup (hd1)
grub> quit

hd1 が sdb。


いちおう、/boot/grub/grub.conf に

root (hd0,0)

とあることを確認しておく。


電源を切って、sata2 に接続されている HDD を sata1 に接続しなおす。 sata1 に接続されていた HDD は sda で壊れた HDD。


交換用の HDD を sata2 に接続して、電源を入れる。


sdb になっていた HDD を sda にしても、mdadm の RAID はとくに問題はない。


ブートマネージャの設定などが問題なければ、起動するはず。 起動しなければ、BIOSの設定で起動するHDDを変更して、grub コマンドに入ってコマンドラインオプションを変更してなんとかする。


起動したら、追加したドライブが sdb になっているはずなので、fdisk で、sda のブロックサイズを確認して、それにあわせて sdb のパーティションを切る。

[root@edu ~]# fdisk /dev/sda

The device presents a logical sector size that is smaller than
the physical sector size. Aligning to a physical sector (or optimal
I/O) size boundary is recommended, or performance may be impacted.

警告: DOS互換モードは廃止予定です。このモード (コマンド 'c') を止めることを
      強く推奨します。 and change display units to
         sectors (command 'u').

コマンド (m でヘルプ): u  <セクタ表示にしたほうがわかりやすいかも
セクタ数 の表示/項目ユニットを変更します

コマンド (m でヘルプ): p  <sda のパーティションサイズの確認

ディスク /dev/sda: 2000.4 GB, 2000398934016 バイト
ヘッド 255, セクタ 63, シリンダ 243201, 合計 3907029168 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
ディスク識別子: 0x000a69c6

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sda1   *        2048  3891202047  1945600000   fd  Linux raid 自動検出
/dev/sda2      3891202048  3907028991     7913472   fd  Linux raid 自動検出

コマンド (m でヘルプ): q

[root@edu ~]# fdisk /dev/sdb

The device presents a logical sector size that is smaller than
the physical sector size. Aligning to a physical sector (or optimal
I/O) size boundary is recommended, or performance may be impacted.

警告: DOS互換モードは廃止予定です。このモード (コマンド 'c') を止めることを
      強く推奨します。 and change display units to
         sectors (command 'u').

コマンド (m でヘルプ): u
セクタ数 の表示/項目ユニットを変更します

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

ディスク /dev/sdb: 2000.4 GB, 2000398934016 バイト
ヘッド 255, セクタ 63, シリンダ 243201, 合計 3907029168 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
ディスク識別子: 0x370a3521

デバイス ブート      始点        終点     ブロック   Id  システム

コマンド (m でヘルプ): n  <新規パーティションの作成 
コマンドアクション
   e   拡張
   p   基本パーティション (1-4)
p <基本パーティションで作成
パーティション番号 (1-4): 1
最初 セクタ (63-3907029167, 初期値 64): 2048
Last セクタ, +セクタ数 or +size{K,M,G} (2048-3907029167, 初期値 3907029167): 3891202047  <最初セクタ、Last セクタは sda の情報を元に設定する。

コマンド (m でヘルプ): t パーティションを作成した時点では領域が Linux 通常用の領域になっているので、fd (Linux raid 自動検出) に設定する
選択した領域 1
16進数コード (L コマンドでコードリスト表示): fd
領域のシステムタイプを 1 から fd (Linux raid 自動検出) に変更しました

コマンド (m でヘルプ): n <同じように sdb2 のパーティションを作成する
コマンドアクション
   e   拡張
   p   基本パーティション (1-4)
p
パーティション番号 (1-4): 2
最初 セクタ (63-3907029167, 初期値 64): 3891202048
Last セクタ, +セクタ数 or +size{K,M,G} (3891202048-3907029167, 初期値 3907029167): 3907028991

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

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

ディスク /dev/sdb: 2000.4 GB, 2000398934016 バイト
ヘッド 255, セクタ 63, シリンダ 243201, 合計 3907029168 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
ディスク識別子: 0x370a3521

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdb1            2048  3891202047  1945600000   fd  Linux raid 自動検出
/dev/sdb2      3891202048  3907028991     7913472   fd  Linux raid 自動検出

コマンド (m でヘルプ): w < w で編集したパーティション情報を実際に書き込む、書き込む前であれば、q で終了することで変更を反映させず終了することもできる。
パーティションテーブルは変更されました!

ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。
[root@edu ~]# fdisk /dev/sda  <一応確認

The device presents a logical sector size that is smaller than
the physical sector size. Aligning to a physical sector (or optimal
I/O) size boundary is recommended, or performance may be impacted.

警告: DOS互換モードは廃止予定です。このモード (コマンド 'c') を止めることを
      強く推奨します。 and change display units to
         sectors (command 'u').

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

ディスク /dev/sda: 2000.4 GB, 2000398934016 バイト
ヘッド 255, セクタ 63, シリンダ 243201
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
ディスク識別子: 0x000a69c6

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sda1   *           1      242217  1945600000   fd  Linux raid 自動検出
/dev/sda2          242217      243202     7913472   fd  Linux raid 自動検出

コマンド (m でヘルプ): q

[root@edu ~]# fdisk /dev/sdb

The device presents a logical sector size that is smaller than
the physical sector size. Aligning to a physical sector (or optimal
I/O) size boundary is recommended, or performance may be impacted.

警告: DOS互換モードは廃止予定です。このモード (コマンド 'c') を止めることを
      強く推奨します。 and change display units to
         sectors (command 'u').

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

ディスク /dev/sdb: 2000.4 GB, 2000398934016 バイト
ヘッド 255, セクタ 63, シリンダ 243201
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
ディスク識別子: 0x370a3521

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdb1               1      242217  1945600000   fd  Linux raid 自動検出
/dev/sdb2          242217      243202     7913472   fd  Linux raid 自動検出

コマンド (m でヘルプ): q

パーティションを作成したら、作成したパーティションを mdadm で RAID に追加する。

[root@edu ~]# cat /proc/mdstat <現在の mdadm の状態を確認
Personalities : [raid1]
md0 : active raid1 sda1[1]
      1945599808 blocks super 1.0 [2/1] [_U]
      bitmap: 11/15 pages [44KB], 65536KB chunk

md1 : active raid1 sda2[1]
      7909312 blocks super 1.1 [2/1] [_U]

unused devices: 
[root@edu ~]# mdadm --add /dev/md1 /dev/sdb2  <新しく作成したパーティションを追加
mdadm: added /dev/sdb2
[root@edu ~]# cat /proc/mdstat <同期の進捗状況を確認
Personalities : [raid1]
md0 : active raid1 sda1[1]
      1945599808 blocks super 1.0 [2/1] [_U]
      bitmap: 11/15 pages [44KB], 65536KB chunk

md1 : active raid1 sdb2[2] sda2[1]
      7909312 blocks super 1.1 [2/1] [_U]
      [==>..................]  recovery = 12.0% (951680/7909312) finish=2.0min speed=55981K/sec

unused devices: 
[root@edu ~]# mdadm --add /dev/md0 /dev/sdb1  
mdadm: added /dev/sdb1
[root@edu ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb1[2] sda1[1]
      1945599808 blocks super 1.0 [2/1] [_U]
      [>....................]  recovery =  0.0% (310528/1945599808) finish=208.8min speed=155264K/sec
      bitmap: 11/15 pages [44KB], 65536KB chunk

md1 : active raid1 sdb2[2] sda2[1]
      7909312 blocks super 1.1 [2/2] [UU]

unused devices: 

同期がおわったら、sdb に grub のインストールをする。

# grub
grub> root (hd1,0)
grub> setup (hd1)
grub> root (hd0,0)
grub> setup (hd0)
grub> quit

以上