CentOS7でソフトウエアRAID1のHDDを交換したときのメモ

#はじめに

CentOS7でソフトウエアRAID1のHDDを交換したときのメモです。この手順のとおりに実行すると失敗します(^_^; どうやって解決したかが最後に書いてあります。

#構成
以下の環境でRAID1の片方がエラー出しました。

OS: CentOS7
HW：Dell PowerEdge T130
UEFI
HDD冗長化: RAID1 (SATA 1TByte x 2) 

```
# df
ファイルシス            1K-ブロック     使用    使用可 使用% マウント位置
/dev/mapper/centos-root   419225600  8685924 410539676    3% /
devtmpfs                    4049672        0   4049672    0% /dev
tmpfs                       4065696        0   4065696    0% /dev/shm
tmpfs                       4065696     8980   4056716    1% /run
tmpfs                       4065696        0   4065696    0% /sys/fs/cgroup
/dev/md126                   505516   294928    210588   59% /boot
/dev/md125                   204516     9980    194536    5% /boot/efi
```

注意点として、/boot, /boot/efiもRAID1です。CentOS7のPartitionの自動設定ではこうならないと思いますが、OSインストール時に設定変更してRAID1にしています。

```
$ more /proc/mdstat (記憶による復元のため細微は違うかも)
Personalities : [raid1]
md125 : active raid1 sda2[0] sdb2[1]
      204736 blocks super 1.0 [2/2] [UU]
      bitmap: 0/1 pages [0KB], 65536KB chunk

md126 : active raid1 sda1[0] sdb1[1]
      511936 blocks super 1.0 [2/2] [UU]
      bitmap: 0/1 pages [0KB], 65536KB chunk

md127 : active raid1 sda3[0] sdb3[1]
      471904256 blocks super 1.2 [2/2] [UU]
      bitmap: 2/4 pages [8KB], 65536KB chunk

unused devices: <none>
```

上記の結果より以下の構成であることがわかります。

- /boot/efiはmd125なので、sda2, sdb2のRAID1
- /bootはmd126なのでsda1, sdb1のRAID1
- VLMの領域はmd127です。


HDDのPartition構成は以下のとおり。容量の単位は「unit s」コマンドでセクタサイズで表示しています。これは後ほどの作業の都合です。

```
# /sbin/parted /dev/sda
GNU Parted 3.1
/dev/sda を使用
GNU Parted へようこそ！ コマンド一覧を見るには 'help' と入力してください。
(parted) unit s
(parted) print
モデル: ATA XXX XXXXX (scsi)
ディスク /dev/sda: 1953525168s
セクタサイズ (論理/物理): 512B/4096B
パーティションテーブル: gpt
ディスクフラグ:

番号  開始        終了         サイズ       ファイルシステム  名前  フラグ
 1    2048s       1026047s     1024000s     xfs                     raid
 2    1026048s    1435647s     409600s      fat16                   raid
 3    1435648s    945506303s   944070656s                           raid

(parted) quit

# /sbin/parted /dev/sdb
GNU Parted 3.1
/dev/sdb を使用
GNU Parted へようこそ！ コマンド一覧を見るには 'help' と入力してください。
(parted) unit s
(parted) print
モデル: ATA XXX XXXXX (scsi)
ディスク /dev/sdb: 1953525168s
セクタサイズ (論理/物理): 512B/4096B
パーティションテーブル: gpt
ディスクフラグ:

番号  開始        終了         サイズ       ファイルシステム  名前  フラグ
 1    2048s       1026047s     1024000s     xfs                     raid
 2    1026048s    1435647s     409600s      fat16                   raid
 3    1435648s    945506303s   944070656s                           raid

(parted) quit

```

# とある日にHDDのsdaが壊れました。

smartdからの警告など。

``` 
# cat /var/log/message (抜粋)
May  6 15:01:08 www smartd[903]: Device: /dev/sda [SAT], 5 Offline uncorrectable sectors
May  6 15:01:08 www smartd[903]: Sending warning via /usr/libexec/smartmontools/smartdnotify to root ...
May  6 15:01:08 www smartd[903]: Warning via /usr/libexec/smartmontools/smartdnotify to root: successful

May  7 08:46:54 www kernel: ata1.00: exception Emask 0x0 SAct 0x80000 SErr 0x0 action 0x0
May  7 08:46:54 www kernel: ata1.00: irq_stat 0x40000008
May  7 08:46:54 www kernel: ata1.00: failed command: READ FPDMA QUEUED
May  7 08:46:54 www kernel: ata1.00: cmd 60/60:98:00:e8:15/00:00:00:00:00/40 tag 19 ncq 49152 in#012         res 51/40:4d:13:e8:15/00:00:00:00:00/40 Emask 0x409 (media error) <F>
May  7 08:46:54 www kernel: ata1.00: status: { DRDY ERR }
May  7 08:46:54 www kernel: ata1.00: error: { UNC }
May  7 08:46:54 www kernel: ata1.00: configured for UDMA/133
May  7 08:46:54 www kernel: sd 0:0:0:0: [sda] FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
May  7 08:46:54 www kernel: sd 0:0:0:0: [sda] Sense Key : Medium Error [current] [descriptor]
May  7 08:46:54 www kernel: sd 0:0:0:0: [sda] Add. Sense: Unrecovered read error - auto reallocate failed
May  7 08:46:54 www kernel: sd 0:0:0:0: [sda] CDB: Read(10) 28 00 00 15 e8 00 00 00 60 00
May  7 08:46:54 www kernel: blk_update_request: I/O error, dev sda, sector 1435667
May  7 08:46:54 www kernel: ata1: EH complete
```

#復旧手順

新しい同一容量のHDDを用意し、USB-SATA変換下駄でサーバにつないで、Partition構成を同じにしました。

```
# /sbin/parted  /dev/sdX (sdXのところは環境によります。)
GNU Parted 3.1
/dev/sdX を使用
GNU Parted へようこそ！ コマンド一覧を見るには 'help' と入力してください。
(parted) print
エラー: /dev/sdX: ディスクラベルが認識できません。
モデル: ATA XXX XXXXX (scsi)
ディスク /dev/sdX: 1953525168s
セクタサイズ (論理/物理): 512B/4096B
パーティションテーブル: unknown
ディスクフラグ:
(parted) mklabel gpt   <- MEMO: GPTに変更

(parted) mkpart
パーティションの名前?  []?
ファイルシステムの種類?  [ext2]?
開始? 2048s
終了? 1026047s

(parted) mkpart
パーティションの名前?  []?
ファイルシステムの種類?  [ext2]?
開始? 1026048s
終了? 1435647s

(parted) mkpart
パーティションの名前?  []?
ファイルシステムの種類?  [ext2]?
開始? 1435648s
終了? 945506303s

(parted) mkpart
パーティションの名前?  []?
ファイルシステムの種類?  [ext2]?
開始? 945506304s
終了? 1953523215s

(parted) print
モデル: ATA XXX XXXXX (scsi)
ディスク /dev/sdX: 1953525168s
セクタサイズ (論理/物理): 512B/4096B
パーティションテーブル: gpt
ディスクフラグ:

番号  開始        終了         サイズ       ファイルシステム  名前  フラグ
 1    2048s       1026047s     1024000s     
 2    1026048s    1435647s     409600s      
 3    1435648s    945506303s   944070656s   
```

以上でPartitionのサイズは同じになりましたが、printコマンドで表示される「ファイルシステム」と「フラグ」が違います。ファイルシステムはRAID復旧時に自動で設定されますのでフラグのところのみ復元します。

```
(parted) t
パーティション番号? 1
反転するフラグ? raid
(parted) t
パーティション番号? 2
反転するフラグ? raid
(parted) t
パーティション番号? 3
反転するフラグ? raid

(parted) print
モデル: ATA XXX XXXXX (scsi)
ディスク /dev/sdX: 1953525168s
セクタサイズ (論理/物理): 512B/4096B
パーティションテーブル: gpt
ディスクフラグ:

番号  開始      終了        サイズ      ファイルシステム  名前  フラグ
 1    2048s     1026047s    1024000s                            raid
 2    1026048s  1435647s    409600s                             raid
 3    1435648s  945506303s  944070656s                          raid

(parted) quit
```

# RAIDを一部復元

再掲しますが、

- /boot/efiはmd125なので、sda2, sdb2のRAID1
- /bootはmd126なのでsda1, sdb1のRAID1
- VLMの領域はmd127です。

/boot/efiと/bootは容量が小さいのでUSBにつないだままRAID1を復旧します。VLMの領域は大きいのでスペアとして追加をします。復旧はしません。

```:/boot/efi
# /sbin/mdadm --add /dev/md125 /dev/sdX2  <- スペアを追加

# /sbin/mdadm --manage /dev/md125 --fail /dev/sda2 <- sda2を強制エラーにする。

# /proc/mdadm
 -> ログを取り忘れましたが、再同期が始まっているとおもいます。
```

同様に

```:/boot
# /sbin/mdadm --add /dev/md126 /dev/sdX1
# /sbin/mdadm --manage /dev/md126 --fail /dev/sda1
```

LVMの領域は大きいのでsda3を強制エラーにはしません。

```:LVM
# /sbin/mdadm --add /dev/md127 /dev/sdX3
```

ファイル/proc/mdadmをみて再同期の完了を確認して

```
# poweroff
```

shutdown。

# HDDを交換

ケースをあけて故障したHDDを取り出し、USBで接続していたHDDを追加します。

# 起動
サーバを立ち上げたら次のように表示されて

>  Booting From Embedded SATA Port Disk B: CentOS

続いてCentOSのGRUBのメニューが出ました。

そうかDiskA (/dev/sda)にboot managerが入ってないな。。

UEFIではどうやってboot managerを入れるんだ。。

それはさておき、 LVM(/dev/md127)のRAIDの再同期がおそらく始まっていますので、終わるまで放置してください。経過はファイル/proc/mdadmをみて確認ください。

再同期が終われば次のようになります。

```
# more /proc/mdstat
Personalities : [raid1]
md125 : active raid1 sdb2[1] sda2[2]
      204736 blocks super 1.0 [2/2] [UU]
      bitmap: 0/1 pages [0KB], 65536KB chunk

md126 : active raid1 sdb1[1] sda1[2]
      511936 blocks super 1.0 [2/2] [UU]
      bitmap: 0/1 pages [0KB], 65536KB chunk

md127 : active raid1 sdb3[1] sda3[2]
      471904256 blocks super 1.2 [2/2] [UU]
      bitmap: 1/4 pages [4KB], 65536KB chunk

unused devices: <none>
```


# 起動順序の変更。

ググったところ、
> 
https://ja.stackoverflow.com/questions/16351/centos-7-%E3%81%AE%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E5%88%86%E3%81%91%E6%96%B9
> CentOS 7 のパーティションの分け方

設定はefibootmgrみたいです。

```
# efibootmgr -v (抜粋)
BootCurrent: 0003
BootOrder: 0003,0001,0002,0000
Boot0000* EFI Fixed Disk Boot Device 1  PciRoot(0x0)/Pci(0x17,0x0)/Sata(0,0,0)/HD(2,GPT,bff2f397-d1c4-4877-a987-31ec01f5XXXX,0xfa800,0x64000)
Boot0001* CentOS        HD(2,GPT,5ee0ca24-9038-4017-b73d-4ee61317XXXX,0xfa800,0x64000)/File(\EFI\centos\shim.efi)
Boot0002* Embedded NIC 1 Port 1 Partition 1     VenHw(3a191845-5f86-4e78-8fce-c4cff59fXXXX)
Boot0003* CentOS        HD(2,GPT,79b8d478-ba71-4943-92b5-f73c1680XXXX,0xfa800,0x64000)/File(\EFI\centos\shim.efi)
```

Boot0001とBoot0003がCentOSですが、シリアル番号を見てもどのHDDを指しているかわからない。いろいろ試したところ blkidというツールで調べてPARTUUIDというところに出てきた値がefibootmgrに表示されるシリアル番号のようです。

```
$ blkid |grep sda2
  ->  PARTUUIDをみる
$ blkid |grep sdb2
  ->  PARTUUIDをみる
```

比較してBoot0001に表示されるPARTUUIDが異なりました。これを修正すればよさそうです。

```
# efibootmgr -b 1 -B
  -> Boot0001を削除

# efibootmgr -c -d /dev/sda -p 2 -l '\EFI\centos\shim.efi' -L 'CentoOS'
  -> sdaのPartition 2 (/dev/sda2)を指定．
```

コマンド「efibootmgr -v」 確認するとBoot0001に上記の新しいPARTUUIDの指定が挿入されました。

再起動したところ

>  Booting From Embedded SATA Port Disk A: CentOS

と表示され、無事Disk Aから起動しました(^_^)

再起動後の「efibootmgr -v」の出力です。

```
# efibootmgr -v (抜粋)
BootCurrent: 0001
BootOrder: 0001,0003,0002
Boot0001* CentoOS       HD(2,GPT,bff2f397-d1c4-4877-a987-31ec01f5XXXX,0xfa800,0x64000)/File(\EFI\centos\shim.efi)
Boot0002* Embedded NIC 1 Port 1 Partition 1     VenHw(3a191845-5f86-4e78-8fce-c4cff59fXXXX)
Boot0003* CentOS        HD(2,GPT,79b8d478-ba71-4943-92b5-f73c1680XXXX,0xfa800,0x64000)/File(\EFI\centos\shim.efi)
```

以上です。