LoginSignup
2
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-05-11

はじめに

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)

以上です。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3