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

注意

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

何をするか?

次のことを行います。

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

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

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

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

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

<br />
sudo fdisk -l /dev/sda<br />
Disk /dev/sda: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors<br />
Units: sectors of 1 * 512 = 512 bytes<br />
Sector size (logical/physical): 512 bytes / 4096 bytes<br />
I/O size (minimum/optimal): 4096 bytes / 4096 bytes<br />
Disklabel type: dos<br />
Disk identifier: xxxxxxxxxxxxxxxxxx</p>
<p>Device     Boot     Start       End   Sectors   Size Id Type<br />
/dev/sda1            2048    197360    195313  95.4M  c W95 FAT32 (LBA)<br />
/dev/sda2  *       198656 390823935 390625280 186.3G fd Linux raid autodetect<br />
/dev/sda3       390825984 488482233  97656250  46.6G 82 Linux swap / Solaris<br />

<br />
sudo fdisk -l /dev/sdb<br />
Disk /dev/sdb: 232.9 GiB, 250000000000 bytes, 488281250 sectors<br />
Units: sectors of 1 * 512 = 512 bytes<br />
Sector size (logical/physical): 512 bytes / 512 bytes<br />
I/O size (minimum/optimal): 512 bytes / 512 bytes<br />
Disklabel type: dos<br />
Disk identifier: xxxxxxxxxxxxxxx</p>
<p>Device     Boot     Start       End   Sectors   Size Id Type<br />
/dev/sdb1            2048    194559    192512    94M  b W95 FAT32<br />
/dev/sdb2  *       194560 390819839 390625280 186.3G fd Linux raid autodetect<br />
/dev/sdb3       390819840 488280063  97460224  46.5G 82 Linux swap / Solaris<br />

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

これで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」であることがわかります。

typeの変更は「t」です。

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

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

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

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

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

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

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

できてます。

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

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

<br />
sudo mdadm --add /dev/md0 /dev/sde2<br />
mdadm: added /dev/sde2<br />

様子を見て見ます

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

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

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

同期が始まりました。

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

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

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

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

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

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

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

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

<br />
sudo mkdir /boot/efi3<br />
sudo mount /dev/sde1 /boot/efi3<br />

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

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

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

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

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

<br />
sudo blkid /dev/sde1<br />
/dev/sde1: UUID=&quot;xxxxxxxxx&quot; TYPE=&quot;vfat&quot; PARTUUID=&quot;xxxxxxxx&quot;<br />

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

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

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

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

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

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

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

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

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

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

RAID1の同期ができました。

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

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

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

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