はじめに
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の領域は大きいのでスペアとして追加をします。復旧はしません。
# /sbin/mdadm --add /dev/md125 /dev/sdX2 <- スペアを追加
# /sbin/mdadm --manage /dev/md125 --fail /dev/sda2 <- sda2を強制エラーにする。
# /proc/mdadm
-> ログを取り忘れましたが、再同期が始まっているとおもいます。
同様に
# /sbin/mdadm --add /dev/md126 /dev/sdX1
# /sbin/mdadm --manage /dev/md126 --fail /dev/sda1
LVMの領域は大きいのでsda3を強制エラーにはしません。
# /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>
起動順序の変更。
ググったところ、
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)
以上です。