2014/09/02(Tue)Linux software RAIDでさらに安全なディスク交換方法

2014/09/02 23:12 Software::Linux
以前、Linux Software RAIDのディスク交換と容量増加のオペレーションまとめという記事を書いたが、RAID1を構成するHDD交換手順として、一度古いディスクをアレイから外し、新しいディスクを追加するという手順を取っていた。
システムをoperationalな状態でresyncしないのであればともかく、resync中にもRAID1上のディスクが刻々と更新されるのであれば、数時間busyでdegradedな状態が続くためよろしくない。
単に3台目を足してから2台に戻せば良いのだという事に気づき、今回、実際にオペレーションしてみた。

環境について

移行時の環境はFedora 20 (i686)で、カーネルは3.15.10-201.fc20.i686+PAE。
ディスクは3発で、/がsingle、/homeを/dev/md0としてRAID1している。
$ cat /proc/mdstat

Personalities : [raid1]
md0 : active raid1 sdc1[4] sdb1[3]
      976630488 blocks super 1.1 [2/2] [UU]
      bitmap: 0/4 pages [0KB], 131072KB chunk

unused devices: <none>
物理パーティション構成は、
  • /dev/sda (160GB)
    • /dev/sda1 = / (ext3)
    • /dev/sda2 = swap
  • /dev/sdb (1TB)
    • /dev/sdb1 = /home (RAID1 member) (ext3)
  • /dev/sdc (1TB)
    • /dev/sdc1 = /home (RAID1 member) (ext3)
このうち、sdcを新しいディスク2TBに交換する。
sdbは引き続き1TBのままなので、RAID1アレイ上の領域は1TBのままとし、sdbを2TB玉に入れ替えるまで、sdcの後ろ1TBは未使用状態となる。

移行手順概要

/dev/md0の移行
  1. 何もせず一度シャットダウンし、新しいディスクを追加する(/dev/sdd)
  2. sddにfdiskでパーティション情報を作成し、/dev/md0に追加する
  3. このままだと/dev/sddは予備状態となるので、RAID1の構成台数を3台に変更する
  4. resyncを待ち、完了したら/dev/sdcをRAIDから脱退し、シャットダウン
  5. RAID1の構成台数を2台に変更する
今回は、「先に新しいディスクを追加して、syncが完了してから古いディスクを外す」という部分が前回と異なる。
なお、1TBのsyncには4時間程度かかった。

作業内容

バックアップ

今回はdegradedな状態になることがないので大丈夫だろうけど、念のためオフライン媒体にバックアップをとっておく。

RAID 1ディスクの変更

  1. 新しいディスクを追加
    シャットダウンして、新しいディスクをマウントすると/dev/sddに新しいディスクが見える。
  1. パーティション情報の作成
今回は全ての領域を/homeとするので、fdiskを使って全てのセクター範囲に対し、Linux raid autodetectパーティションを作成する。
# LANG=C fdisk -l /dev/sdc


Disk /dev/sdc: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x105ba188

Device    Boot Start        End     Blocks  Id System
/dev/sdc1       2048 3907029167 1953513560  fd Linux raid autodetect
  1. 新しいディスクをRAIDアレイへ参加
    # mdadm /dev/md0 --add /dev/sdd1
    
上記の操作だけではスペアディスクとして追加されるため、実際にsyncが始まらない。
RAID1を構成するディスク枚数を変更する
# mdadm /dev/md0 --grow --raid-devices=3
この後は、cat /proc/mdstatを確認しながらしばらくsyncを待つ。
mdadm /dev/md0 --wait && beepとしておけば、作業完了時にbeepが鳴る。
  1. 古いディスクをRAIDアレイから脱退
--failで故障マークをつけ、--removeでアレイから脱退させる。
外すデバイスが正しいかどうか、smartctlコマンド等を使用して型番・S/Nを確認すること。
#  mdadm /dev/md0 --fail /dev/sdc1

#  mdadm /dev/md0 --remove /dev/sdc1
その後、RAID1を構成するディスク枚数を元に戻しておく。(missingとして空きっぱなし&degradedな状態にしておいても問題はないが…)
# mdadm /dev/md0 --grow --raid-devices=2
  1. 古いディスクを外す
一旦シャットダウンして、/dev/sdcのディスクを取り外す。
  1. リブート
この状態で起動すると、先ほどの/dev/sddは/dev/sdcとなって現れる。
PATAデバイスと異なり、SATAデバイスの場合は順番に詰めてデバイス名が振られるようである。
# mdadm --detail /dev/md0

[sudo] password for kero:
/dev/md0:
        Version : 1.1
  Creation Time : Sat Sep 25 23:53:33 2010
     Raid Level : raid1
     Array Size : 976630488 (931.39 GiB 1000.07 GB)
  Used Dev Size : 976630488 (931.39 GiB 1000.07 GB)
   Raid Devices : 2
  Total Devices : 2
    Persistence : Superblock is persistent

  Intent Bitmap : Internal

    Update Time : Tue Sep  2 23:08:29 2014
          State : active
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0

           Name : localhost.localdomain:0
           UUID : d29f1877:8aa796ce:e307c1c3:f92b33e2
         Events : 158283

    Number   Major   Minor   RaidDevice State
       3       8       17        0      active sync   /dev/sdb1
       4       8       33        1      active sync   /dev/sdc1
  1. 完了
    $ cat /proc/mdstat
    
    Personalities : [raid1]
    md0 : active raid1 sdc1[4] sdb1[3]
          976630488 blocks super 1.1 [2/2] [UU]
          bitmap: 0/4 pages [0KB], 131072KB chunk
    
    unused devices: <none>