はじめに
ご覧いただきありがとうございます。ペグ酸です。
先日自前で運用している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