RAID1 のシステムをオンラインで交換

2019年3月7日

注意

  • linuxです
  • mdadmなので、ハードウエアのRAIDは参考にしないでください。
  • ディスクをソフトウェア的にオンラインで交換するのであって、ハードウェアがホットスワップに対応していなければ、結局電源を切る必要があります。
  • UEFI・BIOS両方のブートに対応した設定を行います。また、システムはUEFIで起動しているものとします。(そうでない場合、UEFIのブート登録ができません。)
  • やる気が必要です。VPSとかクラウドはこんなことしなくていいです。羨ましい(でもスペックあたりの性能が・・・)

何をするか?

次のことを行います。

  1. 新しいディスクのパーティションを何とかする。
  2. mdadmのRAID1アレイの設定を変えて同期する。
  3. 上記の実行中に、UEFI・BIOSのブート関連を片付ける。

1.新しいディスクのパーティションを何とかする。

サーバーのシステムはsda2とsdb2のRAID1で構成されています。

 sudo mdadm --detail /dev/md0 
/dev/md0:
        Version : 1.2
  Creation Time : Sat May 26 19:36:23 2018
     Raid Level : raid1
     Array Size : 195181568 (186.14 GiB 199.87 GB)
  Used Dev Size : 195181568 (186.14 GiB 199.87 GB)
   Raid Devices : 2
  Total Devices : 2
    Persistence : Superblock is persistent
  Intent Bitmap : Internal
    Update Time : Fri Oct 19 21:49:14 2018
          State : clean 
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0
           Name : 
           UUID : 
         Events : 
    Number   Major   Minor   RaidDevice State
       1       8       18        0      active sync   /dev/sdb2
       2       8        2        1      active sync   /dev/sda2

sdaとsdbの構成を確認します。

sudo fdisk -l /dev/sda
Disk /dev/sda: 931.5 GiB, 1000204886016 bytes, 1953525168 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: xxxxxxxxxxxxxxxxxx
Device     Boot     Start       End   Sectors   Size Id Type
/dev/sda1            2048    197360    195313  95.4M  c W95 FAT32 (LBA)
/dev/sda2  *       198656 390823935 390625280 186.3G fd Linux raid autodetect
/dev/sda3       390825984 488482233  97656250  46.6G 82 Linux swap / Solaris
sudo fdisk -l /dev/sdb
Disk /dev/sdb: 232.9 GiB, 250000000000 bytes, 488281250 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: xxxxxxxxxxxxxxx
Device     Boot     Start       End   Sectors   Size Id Type
/dev/sdb1            2048    194559    192512    94M  b W95 FAT32
/dev/sdb2  *       194560 390819839 390625280 186.3G fd Linux raid autodetect
/dev/sdb3       390819840 488280063  97460224  46.5G 82 Linux swap / Solaris

これをまとめると次のような構成なっています。

  • sdx1はUEFIの領域  100MB
  • sdx2はシステム領域 200GB
  • sdx3はswap領域   自由

なのでSSDをこの3つのパーティションに分けます。今回はUEFI・BIOS互換なので、fdiskを使います。(3TBでもないし、3つしかパーティション分けないので・・・)

新しいディスクはsdeなので、fdiskを起動します。

sudo fdisk /dev/sde
Welcome to fdisk (util-linux 2.29.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help):  

「p」でディスクの状態を確認します。

Command (m for help): p
Disk /dev/sde: 232.9 GiB, 250059350016 bytes, 488397168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: xxxxxxxxxxxxxx

gptなので、DOSにします。DOSテーブルは「o」コマンドです。

Command (m for help): o
Created a new DOS disklabel with disk identifier 0xxxxxxx
Command (m for help): p
Disk /dev/sde: 232.9 GiB, 250059350016 bytes, 488397168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xxxxxxx

DOS形式になりました。(言い忘れましたが、MBRと呼ばれるものと同一です。)

UEFI用のパーティションを作ります。パーティションの作成は「n」です。

パーティションの大きさの指定はセクタとサイズのどちらかです。今回は100MBの領域なので、「+100M」と指定します。

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-488397167, default 2048): 
Last sector, +sectors or +size{K,M,G,T,P} (2048-488397167, default 488397167): +100M
Created a new partition 1 of type 'Linux' and of size 100 MiB.
Command (m for help): p
Disk /dev/sde: 232.9 GiB, 250059350016 bytes, 488397168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xxxxxxxxx
Device     Boot Start    End Sectors  Size Id Type
/dev/sde1        2048 206847  204800  100M 83 Linux

次にシステム領域を作りますが、この領域はmdadmで使用するので、セクタ数を統一します。セクタ数は「390625280」です。そんな数どこから出たんだよと思う方は、「Ctrlキー  + Fキー 」でページ内検索してください。統一しなくてもできますが、やっぱりきれいに揃えたいよね。

Command (m for help): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 
First sector (206848-488397167, default 206848):          
Last sector, +sectors or +size{K,M,G,T,P} (206848-488397167, default 488397167): +390625280
Created a new partition 2 of type 'Linux' and of size 186.2 GiB.
Command (m for help): p
Disk /dev/sde: 232.9 GiB, 250059350016 bytes, 488397168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xxxxxxxxxxxx
Device     Boot  Start       End   Sectors   Size Id Type
/dev/sde1         2048    206847    204800   100M 83 Linux
/dev/sde2  *       206848 390832128 390625281 186.2G 83 Linux

(セクタで指定してるのに1ずれるのは妖怪の仕業?)

次にswap領域ですが、SSDなので10GBぐらいにしておきます。このSSDは250GBなので、40GBが未割り当て領域になります。SSDのファームウェアが好み割当領域を活用して、高寿命化してくれるはずです。(オーバープロビジョニングと呼びます。気休めです・・・)

Command (m for help): n
Partition type
   p   primary (2 primary, 0 extended, 2 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (3,4, default 3): 
First sector (390625281-488397167, default 390627328): 
Last sector, +sectors or +size{K,M,G,T,P} (390627328-488397167, default 488397167): +10G
Created a new partition 3 of type 'Linux' and of size 10 GiB.
Command (m for help): p
Disk /dev/sde: 232.9 GiB, 250059350016 bytes, 488397168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xxxxxx
Device     Boot     Start       End   Sectors   Size Id Type
/dev/sde1            2048    206847    204800   100M 83 Linux
/dev/sde2          206848 390832128 390625281 186.3G 83 Linux
/dev/sde3       390834176 411805695  20971520    10G 83 Linux

これで3つの領域ができました。しかしどうでしょうか?Typeが全部linux担ってるんですよねww。これを直します。typeは「l」で確認できます。

 0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris        
 1  FAT12           27  Hidden NTFS Win 82  Linux swap / So c1  DRDOS/sec (FAT-
 2  XENIX root      39  Plan 9          83  Linux           c4  DRDOS/sec (FAT-
 3  XENIX usr       3c  PartitionMagic  84  OS/2 hidden or  c6  DRDOS/sec (FAT-
 4  FAT16 <32M      40  Venix 80286     85  Linux extended  c7  Syrinx         
 5  Extended        41  PPC PReP Boot   86  NTFS volume set da  Non-FS data    
 6  FAT16           42  SFS             87  NTFS volume set db  CP/M / CTOS / .
 7  HPFS/NTFS/exFAT 4d  QNX4.x          88  Linux plaintext de  Dell Utility   
 8  AIX             4e  QNX4.x 2nd part 8e  Linux LVM       df  BootIt         
 9  AIX bootable    4f  QNX4.x 3rd part 93  Amoeba          e1  DOS access     
 a  OS/2 Boot Manag 50  OnTrack DM      94  Amoeba BBT      e3  DOS R/O        
 b  W95 FAT32       51  OnTrack DM6 Aux 9f  BSD/OS          e4  SpeedStor      
 c  W95 FAT32 (LBA) 52  CP/M            a0  IBM Thinkpad hi ea  Rufus alignment
 e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a5  FreeBSD         eb  BeOS fs        
 f  W95 Ext'd (LBA) 54  OnTrackDM6      a6  OpenBSD         ee  GPT            
10  OPUS            55  EZ-Drive        a7  NeXTSTEP        ef  EFI (FAT-12/16/
11  Hidden FAT12    56  Golden Bow      a8  Darwin UFS      f0  Linux/PA-RISC b
12  Compaq diagnost 5c  Priam Edisk     a9  NetBSD          f1  SpeedStor      
14  Hidden FAT16 <3 61  SpeedStor       ab  Darwin boot     f4  SpeedStor      
16  Hidden FAT16    63  GNU HURD or Sys af  HFS / HFS+      f2  DOS secondary  
17  Hidden HPFS/NTF 64  Novell Netware  b7  BSDI fs         fb  VMware VMFS    
18  AST SmartSleep  65  Novell Netware  b8  BSDI swap       fc  VMware VMKCORE 
1b  Hidden W95 FAT3 70  DiskSecure Mult bb  Boot Wizard hid fd  Linux raid auto
1c  Hidden W95 FAT3 75  PC/IX           bc  Acronis FAT32 L fe  LANstep        
1e  Hidden W95 FAT1 80  Old Minix       be  Solaris boot    ff  BBT 

IDはそれぞれ「b」「fd」「82」であることがわかります。

EFIパーティションは「ef」でも構いませんが、windowsから見るとき見えなくなります。

typeの変更は「t」です。

Command (m for help): t
Partition number (1-3, default 3): 1
Partition type (type L to list all types): b
Changed type of partition 'Linux' to 'W95 FAT32'.
Command (m for help): t
Partition number (1-3, default 3): 2
Partition type (type L to list all types): fd
Changed type of partition 'Linux' to 'Linux raid autodetect'.
Command (m for help): t
Partition number (1-3, default 3): 3
Partition type (type L to list all types): 82
Changed type of partition 'Linux' to 'Linux swap / Solaris'.
Command (m for help): p
Disk /dev/sde: 232.9 GiB, 250059350016 bytes, 488397168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xxxxxxxxxx
Device     Boot     Start       End   Sectors   Size Id Type
/dev/sde1            2048    206847    204800   100M  b W95 FAT32
/dev/sde2          206848 390832128 390625281 186.3G fd Linux raid autodetect
/dev/sde3       390834176 411805695  20971520    10G 82 Linux swap / Solaris

できました。しかしこれではこのSSDからはシステムは起動しません。BOOTフラグが立っていないからです。これを立てます。「a」です。

Command (m for help): p
Disk /dev/sde: 232.9 GiB, 250059350016 bytes, 488397168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xxxxxxx
Device     Boot     Start       End   Sectors   Size Id Type
/dev/sde1            2048    206847    204800   100M  b W95 FAT32
/dev/sde2  *       206848 390832128 390625281 186.3G fd Linux raid autodetect
/dev/sde3       390834176 411805695  20971520    10G 82 Linux swap / Solaris

Bootの欄に*が表示されました。最後にこの操作を書き込まなければなりません。変更を確認して「w」を入力します。

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

確認無しで書き込まれます。書き込みが終わるとfdiskは終了します。ちゃんと書き込めたか確認します。

sudo fdisk -l /dev/sde
Disk /dev/sde: 232.9 GiB, 250059350016 bytes, 488397168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xxxxxxx
Device     Boot     Start       End   Sectors   Size Id Type
/dev/sde1            2048    206847    204800   100M  b W95 FAT32
/dev/sde2  *       206848 390832128 390625281 186.3G fd Linux raid autodetect
/dev/sde3       390834176 411805695  20971520    10G 82 Linux swap / Solaris

できてます。

2.mdadmのRAID1アレイの設定を変えて同期する。

パーティションができたので、早速RAIDに追加します。mdadmの領域はsde2なのでこれを追加します。

sudo mdadm --add /dev/md0 /dev/sde2
mdadm: added /dev/sde2

様子を見て見ます

sudo mdadm /dev/md0
/dev/md0: 186.14GiB raid1 2 devices, 1 spare. Use mdadm --detail for more detail.

スペアとして追加されました。これはRAID1が2台で動作するからです。このままだと、同期してくれないので、3台に変えます。

sudo mdadm --grow /dev/md0 --raid-devices=3
raid_disks for /dev/md0 set to 3

同期が始まりました。

sudo mdadm --detail /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Sat May 26 19:36:23 2018
     Raid Level : raid1
     Array Size : 195181568 (186.14 GiB 199.87 GB)
  Used Dev Size : 195181568 (186.14 GiB 199.87 GB)
   Raid Devices : 3
  Total Devices : 3
    Persistence : Superblock is persistent
  Intent Bitmap : Internal
    Update Time : Fri Oct 19 22:55:16 2018
          State : active, degraded, recovering 
 Active Devices : 2
Working Devices : 3
 Failed Devices : 0
  Spare Devices : 1
 Rebuild Status : 0% complete
           Name : 
           UUID : 
         Events : 
    Number   Major   Minor   RaidDevice State
       1       8       18        0      active sync   /dev/sdb2
       2       8        2        1      active sync   /dev/sda2
       3       8       66        2      spare rebuilding   /dev/sde2

どれぐらいで終わるか見てみてみます。

 cat /proc/mdstat
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10] 
md0 : active raid1 sde2[3] sdb2[1] sda2[2]
      195181568 blocks super 1.2 [3/2] [UU_]
      [>....................]  recovery =  2.7% (5302400/195181568) finish=47.7min speed=66325K/sec
      bitmap: 2/2 pages [8KB], 65536KB chunk

30分はかかるので、次の作業をしましょう。

3.上記の実行中に、UEFI・BIOSのブート関連を片付ける。

UEFIの領域をFAT32でフォーマットします。

sudo mkfs.vfat -v -c -F 32 /dev/sde1

マウントします。/boot/efi3 とします。

sudo mkdir /boot/efi3
sudo mount /dev/sde1 /boot/efi3

GURB(EFI)をインストールします。efibootmgrはマザーボードのブートリストが表示できます。しっかりUEFIに登録されています。(なんか出てますが気にしない。)

sudo grub-install --efi-directory /boot/efi3 --bootloader-id debian-ssd
Primary GPT is invalid, using alternate GPT.
Primary GPT is invalid, using alternate GPT.
Primary GPT is invalid, using alternate GPT.
Installation finished. No error reported.
server@server1:~$ efibootmgr
BootCurrent: 0006
Timeout: 1 seconds
BootOrder: 0007,0006,0000,0001,0002,0003,0004,0005
Boot0000* debian
Boot0001* TSSTcorp DVD-ROM SH-116CB
Boot0002* WDC WD10JPVX-22JC3T0
Boot0003* WDC WD2500AAJS-75M0A0
Boot0004* ST3000VN007-2E4166
Boot0005* WDC WD40EZRZ-00GXCB0
Boot0006* debian(sub)
Boot0007* debian-ssd

次にGURB(BIOS)をインストールします。こればMBRにインストールします。

sudo grub-install --target=i386-pc /dev/sde
grub-install: warning: Couldn't find physical volume `(null)'. Some modules may be missing from core image..
grub-install: warning: Couldn't find physical volume `(null)'. Some modules may be missing from core image..
Installation finished. No error reported.

次に、/etc/fstab に SSD が /boot/efi3 に自動マウントするようにします。fstabにはUUIDを使用します。sdxは変化しちゃうので。

sudo blkid /dev/sde1
/dev/sde1: UUID="xxxxxxxxx" TYPE="vfat" PARTUUID="xxxxxxxx"

blkidコマンドで、UUID=が得られます。fstabを編集すると以下のようになります。

cat /etc/fstab
~略~
#EFI
#UUID=XXXX-XXXX /boot/efi2      vfat    defaults        0       1
UUID=XXXX-XXXX  /boot/efi       vfat    defaults        0       1
UUID=XXXX-XXXX  /boot/efi3      vfat    defaults        0       1

次に、sde3にswap領域を作成します。mkswap コマンドで作成できます。

sudo mkswap /dev/sde3
Setting up swapspace version 1, size = 10 GiB (10737414144 bytes)
no label, UUID=

ちゃんとできたか確認するために、一時的にswapを有効にします。swapon コマンドを実行します。

sudo swapon /dev/sde3
sudo swapon -s
Filename                                Type            Size    Used    Priority
/dev/sda3                               partition       48828120        109176  -1
/dev/sdb3                               partition       48730108        0       -2
/dev/sde3                               partition       10485756        0       -3

できてます。これをfstabに追加して、自動で使えるようにします。

cat /etc/fstab
#SWAP
# swap was on /dev/sda3 during installation
UUID= none            swap    sw              0       0
# swap was on /dev/sdb3 during installation
#UUID= none            swap    sw              0       0
# swap was on /dev/sd3 during installation
UUID= none            swap    sw              0       0

fstabの変更を適応するために次のコマンドを実行します。

sudo update-grub
Generating grub configuration file ...
Found background image: /usr/share/images/desktop-base/desktop-grub.png
Linux イメージを見つけました: /boot/vmlinuz-4.9.0-8-amd64
Found initrd image: /boot/initrd.img-4.9.0-8-amd64
Linux イメージを見つけました: /boot/vmlinuz-4.9.0-7-amd64
Found initrd image: /boot/initrd.img-4.9.0-7-amd64
Linux イメージを見つけました: /boot/vmlinuz-4.9.0-6-amd64
Found initrd image: /boot/initrd.img-4.9.0-6-amd64
Adding boot menu entry for EFI firmware configuration
完了
sudo update-initramfs -u
update-initramfs: Generating /boot/initrd.img-4.9.0-8-amd64
W: initramfs-tools configuration sets RESUME=UUID=
W: but no matching swap device is available.
I: The initramfs will attempt to resume from /dev/sda3
I: (UUID=)
I: Set the RESUME variable to override this.

RAID1の同期ができました。

sudo mdadm /dev/md0
/dev/md0: 186.14GiB raid1 3 devices, 0 spares. Use mdadm --detail for more detail

/dev/sdbを引っこ抜く準備をします。

 sudo mdadm /dev/md0
/dev/md0: 186.14GiB raid1 3 devices, 0 spares. Use mdadm --detail for more detail.
sudo mdadm /dev/md0 --fail /dev/sdb2
mdadm: set /dev/sdb2 faulty in /dev/md0
sudo mdadm /dev/md0 --remove /dev/sdb2
mdadm: hot removed /dev/sdb2 from /dev/md0
 sudo mdadm --grow /dev/md0 --raid-devices=2
raid_disks for /dev/md0 set to 2
sudo mdadm /dev/md0 
/dev/md0: 186.14GiB raid1 2 devices, 0 spares. Use mdadm --detail for more detail.

これで引っこ抜けます。ホットスワップの方は引っこ抜いてそうでない方は、ちょっとだけ電源を切って抜きましょう。