シングルHDDで稼働中のUbuntuをRAID1に移行

# 目的

シングルHDDで稼働中のUbuntuシステムがある。ここにHDDを一台追加してRAID1を構築したい。

# 環境

- システム: Ubuntu 18.04.4 LTS
- 稼働中の HDD

```
$ sudo fdisk -l

Device          Start        End    Sectors  Size Type
/dev/sda1        2048    1050623    1048576  512M EFI System
/dev/sda2     1050624 3871100927 3870050304  1.8T Linux filesystem
/dev/sda3  3871100928 3904292863   33191936 15.8G Linux swap
```

- RAID1 用に追加する HDD (パーティションは既に稼働中の HDD と同じように区切られている)

```
Device          Start        End    Sectors  Size Type
/dev/sdb1        2048    1050623    1048576  512M EFI System
/dev/sdb2     1050624 3871100927 3870050304  1.8T Linux filesystem
/dev/sdb3  3871100928 3904292863   33191936 15.8G Linux swap
```

- マウント情報

```
$ mount

/dev/sda1 on /boot/efi type vfat (rw,relatime,fmask=0077,dmask=0077,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)

/dev/sda2 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)
```

# 全体の流れ

**やる前に必ず、稼働中の HDD のバックアップを取っておく。**
**何が起きても責任は取れません！！**

今回は、ブート領域の sda1 とシステム(/)の sda2 をそれぞれ RAID1 構成にしたい。
まず、新しく追加した HDD(/dev/sdb1, /dev/sdb2)のみで RAID デバイスを作成する。
次に、作成した RAID デバイスにファイルシステムを作成し、稼働中の/dev/sda からデータをコピーする。
RAID デバイスから起動できるように、/etc/fstab, GRUB の設定を行う。
最後に、現在稼働中の HDD(/dev/sda1, /dev/sda2)を RAID に組み込む。

**_※結果的にブート領域の sda1 を RAID にした場合、どうやってもシステムが立ち上がらなくなってしまったため、途中で RAID を解除し、システム(/)の sda2 のみ RAID1 構成としました。ですが記録のため、やったことはすべて残しておきます。_**

# 実際の作業

## RAID デバイスの作成

```
$ sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 missing /dev/sdb1

$ sudo mdadm --create /dev/md1 --level=1 --raid-devices=2 missing /dev/sdb2

# 確認
$ cat /proc/mdstat

Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sdb1[1]
      523264 blocks super 1.2 [2/1] [_U]

md1 : active raid1 sdb2[1]
      1934893056 blocks super 1.2 [2/1] [_U]
      bitmap: 15/15 pages [60KB], 65536KB chunk

unused devices: <none>
```

## ファイルシステムの作成

```
$ mkfs.vfat /dev/md0

$ mkfs.ext4 -L RAID-ROOT /dev/md1
```

## 稼働中の HDD から RAID デバイスにデータをコピー

- /boot/efi

```
$ sudo mkdir -p /mnt/new-raid/boot/efi
$ sudo mount /dev/md0 /mnt/new-raid/boot/efi
$ sudo rsync -avxHAXS --delete --progress /boot/efi/ /mnt/new-raid/boot/efi
```

- /(root)

```
$ sudo mount /dev/md1 /mnt/new-raid
$ sudo rsync -avxHAXS --delete --progress / /mnt/new-raid/
```

## MD RAID のマッピング先を固定

```
$ sudo mdadm --detail --scan
ARRAY /dev/md/hoge:1 metadata=1.2 name=hoge:1 UUID=06c434d3:be2cc863:fd13e1fa:84059071
ARRAY /dev/md/hoge:0 metadata=1.2 name=hoge:0 UUID=446f6e87:d0864059:df0776c2:39103420
```

上記を/etc/mdadm/mdadm.conf に追記。ここでの UUID は追加した HDD(/dev/sdb)のものとなっている。

## fstab の編集

/dev/md0, /dev/md1 というデバイス名はシステムを再起動すると/dev/md126, /dev/md127 などに変わってしまう。そのため、それぞれの UUID を確認する。

```
$ sudo blkid

/dev/md0: SEC_TYPE="msdos" UUID="4731-2EAE" TYPE="vfat"
/dev/md1: LABEL="RAID-ROOT" UUID="c600bc95-84a6-42f4-9259-f05654ba5945" TYPE="ext4"
```

```
$ sudo vim /mnt/new-raid/etc/fstab

#以下を記述
UUID=4731-2EAE /boot/efi vfat umask=0077 0 1
UUID=c600bc95-84a6-42f4-9259-f05654ba5945 / ext4 errors=remount-ro 0 1
```

## GRUB（GNU GRand Unified Bootloader）の設定

```
$ cd /mnt/new-raid
$ sudo mount -t proc proc proc/
$ sudo mount -t sysfs sys sys/
$ sudo mount -o bind /dev dev/
$ sudo mount -t devpts pts dev/pts/
$ sudo chroot /mnt/new-raid
```

```
$ vim etc/default/grub

# 以下の行を追加 (UUIDに/dev/md1を設定)
GRUB_CMDLINE_LINUX="root=UUID=c600bc95-84a6-42f4-9259-f05654ba5945 raid=auto"
```

変更を反映させる。

```
$ sudo update-grub
```

ここまで来たら、稼働中の HDD(/dev/sda)を抜いて、RAID デバイス(/dev/sdb)単体で動作するか確認する。

## RAID デバイスから起動

起動せず BIOS の画面に入ってしまう・・・orz

GRUB の再インストールとか色々試したが、どうあがいても解決しないので、正常に動作する HDD(/dev/sda)で立ち上げ直し、結局ブート領域の RAID を解除した...orz

```
$ sudo mdadm --stop /dev/md0
```

sda1 の内容を sdb1 にコピー

```
$ sudo dd if=/dev/sda1 of=/dev/sdb1 bs=512
```

また、RAID-ROOT 内の fstab を編集し、boot の部分を以下のように書き変えた。

```
/dev/sda1 /boot/efi vfat umask=0077 0 1
```

再び sda を抜いて、sdb 単体で起動する。すると、 GRUB コンソールに入った。
正常に動いていた時の/boot/efi/EFI/ubuntu/grub.cfg の内容を参考に、以下を指定した。

```
grub> set root=(md/1)
grub> linux	/boot/vmlinuz-4.15.0-197-generic root=UUID=c600bc95-84a6-42f4-9259-f05654ba5945
grub> initrd /boot/initrd.img-4.15.0-197-generic
grub> boot
```

システムが立ち上がった。

```
$ mount

/dev/sda1 on /boot/efi type vfat (rw,relatime,fmask=0077,dmask=0077,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)

/dev/md1 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)
```

再起動したときに再び GRUB コンソールに入らないように修復する。

```
$ sudo grub-mkconfig -o /boot/efi/EFI/ubuntu/grub.cfg
```

これでとりあえず RAID デバイス単体で起動することができるようになった。(boot 領域は RAID 解除してしまったが...)

## 元々稼働していた HDD を RAID に組み込む

**_この先は後戻りできません! バックアップ漏れがないか最終確認!!_**

```
$ sudo mdadm /dev/md1 --add /dev/sda2
```

同期の進捗確認

```
$ sudo cat /proc/mdstat

Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sda2[2] sdb2[1]
      1934893056 blocks super 1.2 [2/1] [_U]
      [>....................]  recovery =  0.6% (11754752/1934893056) finish=173.4min speed=184807K/sec
      bitmap: 15/15 pages [60KB], 65536KB chunk

unused devices: <none>
```

同期が完了したら sda, sdb が共に active sync になっているか確認

```
$ sudo mdadm --detail /dev/md1
/dev/md1:
           Version : 1.2
     Creation Time : Fri Feb 10 09:34:04 2023
        Raid Level : raid1
        Array Size : 1934893056 (1845.26 GiB 1981.33 GB)
     Used Dev Size : 1934893056 (1845.26 GiB 1981.33 GB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

     Intent Bitmap : Internal

       Update Time : Fri Feb 17 15:09:30 2023
             State : clean
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : bitmap

              Name : hoge:1  (local to host hoge)
              UUID : 06c434d3:be2cc863:fd13e1fa:84059071
            Events : 219762

    Number   Major   Minor   RaidDevice State
       2       8        2        0      active sync   /dev/sda2
       1       8       18        1      active sync   /dev/sdb2
```

# 参考 URL

- [Step by Step: シングル HDD を RAID 1 に変換; LVM on RAID 編 (Fedora 20)](https://www.nslabs.jp/raid1-convert.rhtml)
- [grub> が表示されて Ubuntu が起動できない](https://kajindowsxp.com/grub2/)

# おまけ　ChatGPTの活用

私自身は今回行ったようなLinuxやらRAIDやらインフラ周りのことは全然詳しくないので、かなり苦労しました。つまずいたり、ググっても中々目的の情報が得られなかったときChatGPT君が相談相手になってくれました。
以下、やりとりを一部抜粋。

![ubuntu_raid_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404447/0c3410f4-06df-94d2-a369-74fbce3ba761.png)

![ubuntu_raid_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404447/2a0efc95-9201-434c-a56a-2a3532b71582.png)

![ubuntu_raid_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404447/34cc7f49-26eb-fbb3-8582-d46010085625.png)

![ubuntu_raid_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404447/33c3f0fb-d4ed-490d-aaaf-ab1fa37fa84a.png)

![ubuntu_raid_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404447/7c43b446-9a42-a651-19b1-47c5877995ad.png)

![ubuntu_raid_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404447/e920bdf9-d969-daba-9d26-0f0d09569055.png)

まあ、バシッと正しい答えを教えてくれることもあれば、なんかトンチンカンなことを言ってくることもありましたが、困ったときになにか取っ掛かりを示してくれるありがたい存在でした。

これからもよろしく、ChatGPT先輩！