ペグ園

ぺぐぞの

【Ubuntu】既存の非RAIDのシステムドライブをRAID1にする方法

はじめに

ご覧いただきありがとうございます。ペグ酸です。

先日自前で運用しているUbuntuのサーバーのシステムドライブをRAID化しました。しかし、その際に日本語での情報が乏しかったことや、英語の情報でもまとまっていなかったり、まとまっているものも一部上手く動かなかったりして作業が難航したため、今回方法を記事としてまとめることとしました。(参考にしたサイトは記事の最後にまとめています)

なお、内容は十分気をつけて書いているつもりですが、もし間違っていて損害を被った場合でも私は責任を負えません。この記事を参考にされる際はバックアップをきちんと取り、自己責任で実行するようお願い致します。

目次

前提

  • 元々インストールされているドライブ: /dev/sda
    • ブートボリューム: /dev/sda1
    • ルートボリューム: /dev/sda2
  • 増設したドライブ: /dev/sdb
  • OS: Ubuntu Server 20.04
  • その他: LVMは無し、UEFIブート

やり方

バックアップを取っておく・インストーラーUSBを用意しておく

万が一操作に失敗して回復不能になっても差し支えないように、RAID化するのに関係ないストレージにデータをバックアップしておきます。

また、ブートパーティションの操作を伴うため、ブートパーティションが損壊したときに修復できるよう、UbuntuインストーラーUSB(などのコマンドラインを実行できる外部の環境)を用意しておきます。

ストレージを取り付ける

RAIDアレイを構成するハードディスクやSSDを取り付けます。ここでは具体的な手順は省略します。

増設したハードディスクにパーティションを複製する

増設した/dev/sdbに、/dev/sdaのパーティションを複製します。

$ sudo sfdisk -d /dev/sda | sudo sfdisk –force /dev/sdb

mdadmで片肺だけのRAIDを作り(missingと/dev/sdX、など)、mdadmとgrubを更新する

mdadmで片肺だけのRAIDを作ります(ここでは/dev/md0で作ります)。ルートのパーティション(/dev/sdb2)だけをRAID化します。

ここで、ブートパーティションはmdadmだとRAID化出来ないので、後述の方法で手動でデータをコピーします。

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

再起動時にmdadmのRAIDアレイが解体されない(自動で組み立てられる)ように、mdadmのRAIDアレイの設定をコマンドで更新します。

$ sudo sh -c "mdadm --detail --scan >> /etc/mdadm/mdadm.conf"

grubを更新します。参考にしたサイトだと、選択画面が出てくるようで、そこで/dev/sdaと/dev/sdbを選びます(/dev/md0は選ばない)。

しかし、特にそういったものが出てくることはなかったので、このコマンドが何らかの役目を果たしているのかは不明です。

$ sudo dpkg-reconfigure grub-pc

構築したRAIDのボリュームなどをフォーマットする

ルートボリュームをフォーマットします。

$ sudo mkfs.ext4 /dev/md0

ブートボリュームもフォーマットします。こちらはvfatでやります。

$ sudo mkfs.vfat /dev/sdb1

ルート、ブートのボリュームそれぞれの内容をrsyncなどで複製する

まずは時間がかからないブートボリュームからやります。

/dev/sdb1を、/mnt/sdb1にマウントします。

$ sudo mkdir /mnt/sdb1
$ sudo mount /dev/sdb1 /mnt/sdb1

/boot/efi/のデータを、/mnt/sdb1/にコピーします。

$ sudo rsync -vazHAX --numeric-ids /boot/efi/ /mnt/sdb1/

同様の手順でルートボリュームも複製します。

/dev/md0を、/mnt/md0にマウントします。

$ sudo mkdir /mnt/md0
$ sudo mount /dev/md0 /mnt/md0

ルート配下のデータを、一部を除いて/mnt/md0/にコピーします。このコマンドだとシンボリックリンクの中身までコピーされてしまうので、適宜工夫してください(参考にしたサイトのコマンドをほぼ変えずに記しています)。

また、時間がかかるので、screenなどを用いてやると安全かもしれません。

$ sudo rsync -vazHAX --numeric-ids --exclude="/dev/*" --exclude="/proc/*" --exclude="/sys/*" --exclude="/mnt/*" --exclude="/boot/efi/" / /mnt/md0

fstab、grubのルートボリュームをRAIDのものに切り替える

RAID側のルートパーティションのfstab(/mnt/md0/etc/fstab)に書かれているルートボリュームのマウントポイントを、RAIDのものに書き換えます。

/dev/md0 / ext4 errors=remount-ro 0 1

続いて、現在の(既存のドライブの)ブートパーティションgrub(/boot/grub/grub.cfg)を書き換えます。

本来は直接書き換えてはいけないようで、コマンドで書き換える方法があるようですが、ここでは直接書き換えます。(あまり良くない方法だと思います。不安なこととして最後でまとめます。)

まずは/boot/grub/grub.cfgを複製しておきます。

$ sudo cp /boot/grub/grub.cfg /boot/grub/grub.cfg.backup

次に、/boot/grub/grub.cfgに書き込み権限を付与します。

$ sudo chmod +w /boot/grub/grub.cfg

そして、/boot/grub/grub.cfgの、

linux /boot/vmlinuz-(バージョン)-generic root=UUID=(文字列) ro

となっている部分を、

linux /boot/vmlinuz-(バージョン)-generic root=/dev/md0 ro

と書き換えます。

この際、テキストエディタの一斉置き換えで行うと起動しなくなります(万一起動しなくなった場合はブータブルUSBなどで外部からファイルを書き換え、元に戻します)。最低限の(選択肢の、Ubuntuと書かれているところのみなど)場所の該当項目のみを書き換えます。

最後に、/boot/grub/grub.cfgの書き込み権限を剥奪し、権限を元々の状態に戻しておきます。

$ sudo chmod -w /boot/grub/grub.cfg

再起動する

再起動します。

$ sudo reboot

ここで上手く起動しなければ、次の方法でブータブルUSBなどを用いて切り戻しを行います。

grubが上手く起動しなければ)grubを元に戻す

grub.cfgをテキストエディタの一斉置き換えでやってしまうと、grubが上手く起動しなくなります。

このときは、ブータブルUSBなどから先程編集したgrub.cfgを編集前のものに戻し、一旦既存のルートボリュームから起動するようにします。そして、もう一度grub.cfgを適切に設定します。

$ sudo mkdir /mnt/sda2
$ sudo mount /dev/sda2 /mnt/sda2
$ sudo cp /mnt/sda2/boot/grub/grub.cfg.backup /mnt/sda2/boot/grub/grub.cfg

作業が終わったら再起動します。

$ sudo reboot
(UUIDが重複しているとかでinitramfsが出てきたら)update-initramfsをブータブルUSBからやる

mdadmで何度もRAIDアレイを同じ名前で作って壊すというのを繰り返すと、mdadmとinitramfsが上手く動かなくなります。

このときは、ブータブルUSBなどからmdadm.confを書き換え、update-initramfsを行います。

まずは先程構築したRAIDをマウントします。

$ sudo apt update
$ sudo apt install mdadm
$ sudo mdadm --assemble /dev/md0 /dev/sdb2
$ sudo mkdir /mnt/md0
$ sudo mount /dev/md0 /mnt/md0

次にmdadmのconfigからUUIDの重複を削除します。mdadmのconfigの末尾に同一の名前でRAIDアレイが複数組まれているのが見つかるはずです。

テキストエディタはお好みでどうぞ。マウントしたRAIDアレイのボリュームにあるmdadmのconfigの末尾にある、重複したRAIDアレイを削除して1つにします。

$ sudo vi /mnt/md0/etc/mdadm/mdadm.conf

個人的に手こずったポイントなのですが、これだけではUUIDの重複エラーは解消されません。RAIDアレイのボリュームでupdate-initramfsする必要があります。

$ chroot /mnt/md0
$ sudo update-initramfs -u -k all

作業が終わったら再起動します。

$ sudo reboot

RAIDに元々のストレージを加える

この操作で元々のストレージのデータは全て消えますので注意してください。

起動したら、lsblkコマンドなどでRAIDアレイから起動しているか調べます。上手く行っていれば、ルートディレクトリは/mnt/md0のものとなっているはずです。

上手くRAID側のルートボリュームから起動したならば、RAIDに元々のストレージを加えます。

$ sudo mdadm /dev/md0 -a /dev/sda2

データの複製が終わるまで、watchコマンドで様子を見ます。(watchコマンドから抜けるには、Ctrl+Cします。)

$ watch -n1 cat /proc/mdstat

fstabをUUIDで設定する

/dev/md0のUUIDを調べます。

$ blkid | grep md0

ここで出てきたUUIDを、/etc/fstabのルートのマウントポイントに設定します。以下のように書き換えます。

UUID=(先程調べたUUID) / ext4 errors=remount-ro 0 1

grub-install、update-grubを行う

grubを/dev/sdaと/dev/sdbにインストールし直します。前述のとおりこれが意味をなしているのかは不明です。

$ sudo grub-install /dev/sda
$ sudo grub-install /dev/sdb
$ sudo update-grub

rebootし、片肺で動くか確認する

再起動します。

$ sudo reboot

上手く起動しないようならば、1回目の再起動時のトラブル対処の方法で/etc/fstabなどを切り戻します。

lsblkやcat /proc/mdstatなどで、上手く動いているか(RAIDから起動しているか)調べられます。

また、片肺だけで起動したら、/proc/mdstatを見ると異常があると表示されます。それも確認しておくと良いかも知れません。

片肺だけで起動した後元通りに戻したら、もう一度リビルドを行う必要がある点に注意が必要です。(mdadm -aコマンドで行います)

作業はここまでです。お疲れ様でした。

心配なところ

ブートボリュームはRAIDになってない(できない?)

ブートボリューム(ここでは/dev/sda1)はmdadmではRAIDに出来ないようなので、RAIDを再構築したらブートボリュームは手動で(コマンドで)再構築する必要があるようです。

しかし、grub-installが自分が試した限りでは上手く動いているか微妙だったので、ここでは直にcpコマンドで/dev/sda1の中身を/dev/sdb1にそのまま複製しています。

この方法だと、アップデートなどでブートボリュームの中身が書き換わったときに/dev/sda1と/dev/sdb1で整合性が取れなくなる(/dev/sda1のみ書き換えられる)気がするので不安です。もしどなたか解決策をご存知であればコメント欄でご教示いただければ嬉しいです。

grub.cfgを直にいじってしまっているので色々調子悪くなってそう

今回、grub.cfgをviで直接編集しました。参考にしているサイトが直接編集する方法をとっていたのでこの方法としたのですが、grub.cfgを直接編集するのは避けたほうがいいようです。

コマンドで編集する方法があるようなのですが、軽く調べた限りだと具体的にどういったコマンドを実行すればよいか不明だったためこの方法で行いました。もしコマンドでの操作をご存じの方が居ましたらコメント欄でご教示いただければ嬉しいです。

また、今回はgrub.cfg内のセーフモードの項目は書き換えていません。そのため、セーフモードは恐らく起動しなくなっています。このあたりも結構不安です。

最後に

私はLinuxのブートパーティションなどを今回初めて触ったのですが、initramfsやGRUBなどの知識が不足しているなということを痛感しました。

Linuxは基本的なコマンドが使える程度なので、時間を確保して体系的に一度勉強したいと思っています。

ではまた!

参考にしたサイト

www.clouvider.com

基本的にこのサイトでの手順を踏襲しています。

以下のサイトは上のサイトで上手くいかなかった部分を調べたものです。

www.hohog.net

atmarkit.itmedia.co.jp

ex1.m-yabe.com

askubuntu.com

keiotu.blog9.fc2.com

piro791.blog.ss-blog.jp

superuser.com

superuser.com