/boot/efiをRAID1で運用する方法

Linux

はじめに

Debianをインストールするときに/boot/efiもRAID1にしたかったのですが、インストーラーではできないようです。
そこで、インストール時にSSD2台のそれぞれにESPパーティションを作っておき、インストール後にRAID1に変更します。

参考

RAID 1 of /boot/efi partition on Debian
I have a CentOS 8 installation, where the partitioning and RAID 1 configuration where done using the...

環境

Debian11 bullseye 64bit
SSD 500GB 2台

Debianのインストール

ハードディスクの構成は以下の通りです。
各SSDにESPパーティションを128MB、残りをraid領域とします。

/dev/md/0 ext4 (ルートディレクトリをマウント)
    /dev/sda2 残り raid
    /dev/sdb2 残り raid

/dev/sda
    /dev/sda1 128MB ESP
    /dev/sda2 残り raid

/dev/sdb
    /dev/sdb1 128MB ESP
    /dev/sdb2 残り raid

インストール後に以下のようにします。

/dev/md1  vfat
    /dev/sda1 128MB ESP
    /dev/sdb1 128MB ESP


インストール時の画面は以下です。

手順

/boot/efiをアンマウントします。

sudo umount /boot/efi

空いているmd[x]を探して、2個のESPパーティションでRAID1を構築します。
OSインストール時にmd0を使っているのでmd1を使います。
「–metadata」はdefaultでもよいかもしれませんが試していません。
「man mdadm」に記載がありますが、defaultを指定した場合は「1.2」と等価です。

cat /proc/mdstat
sudo mdadm --create /dev/md1 --verbose --metadata=1.0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1

構築したmd1をVFAT形式でフォーマットします。

sudo apt install dosfstools
sudo mkfs.vfat /dev/md1

md[x]の名称を固定したいので、設定ファイルに追記します。

sudo mdadm --detail --scan >> /etc/mdadm/mdadm.conf

追記された内容は下記のようになりました。

ARRAY /dev/md/0 metadata=1.2 name=perseus:0 UUID=0279xxxx:dee61xxx:a7acaxxx:074xxxxx
ARRAY /dev/md1 metadata=1.0 name=perseus:1 UUID=008bxxxx:d6cd3xxx:7bff5xxx:bdcxxxxx

/dev/md/0は、OSのインストール時に/etc/mdadm/mdadm.confに記載されているので重複した古い行はコメントします。
また、/dev/md/0はOSを再起動したときに/dev/md127が割り当てられたので、/dev/md0に修正しました。

ARRAY /dev/md0 metadata=1.2 name=perseus:0 UUID=0279xxxx:dee61xxx:a7acaxxx:074xxxxx
ARRAY /dev/md1 metadata=1.0 name=perseus:1 UUID=008bxxxx:d6cd3xxx:7bff5xxx:bdcxxxxx

initrdイメージを更新します。

sudo update-initramfs -u

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

ls -la /dev/disk/by-uuid/
lrwxrwxrwx 1 root root 9 1月 15 11:41 6BE6-XXXX -> ../../md1

/etc/fstabにある/boot/efiのUUIDを/dev/md1のUUIDに修正します。

sudo vi /etc/fstab
UUID=6BE6-XXXX /boot/efi  vfat  umask=0077  0   1

/boot/efiをマウントします。

sudo mount /boot/efi

grubを/boot/efiにインストールします。
ESPパーティションはLinux Software RAIDに対応していないのでエラーが表示されますが、今回の場合は問題ありません。

sudo grub-install --efi-directory=/boot/efi

以下、エラーメッセージです。

grub-install: warning: efi_get_variable: ops->get_variable failed: そのようなファイルやデ ィレクトリはありません.
grub-install: warning: efi_va_generate_file_device_path_from_esp: could not open device for ESP: 不正なアドレスです.
grub-install: warning: efi_generate_file_device_path_from_esp: could not generate File DP from ESP: 不正なアドレスです.
grub-install: エラー: failed to register the EFI boot entry: 不正なアドレスです.

/dev/md1が構築されたか確認します。

cat /proc/mdstat
    Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
    md1 : active raid1 sdb1[1] sda1[0]
          122880 blocks super 1.2 [2/2] [UU]

df -h
    /dev/md1  120M  3.4M  117M  3% /boot/efi

ブートエントリと登録されているデバイスのUUIDを調べて、どのパーティションから起動しているのか調べます。
はじめにブートエントリから調べます。
「Boot0000* debian」のUUIDを覚えておきます。

efibootmgr -v
BootCurrent: 0001
Timeout: 1 seconds
BootOrder: 0002,0001,0000
Boot0000* debian  HD(1,GPT,72cd0455-4ccf-4561-b919-b236382xxxxx,0x800,0x3c800)/File(\EFI\DEBIAN\SHIMX64.EFI)

次に登録されているデバイスのUUIDとPARTUUIDを調べます。

sudo blkid

1行目の/dev/sdb1にあるPARTUUIDと一致しています。
このことから、/dev/sdb1から起動していることが分かります。

/dev/sdb1: UUID="bf91cea7-b3e5-0ae3-ab37-1167bcdxxxxx" UUID_SUB="c012b7ab-fcf1-fd9d-69c6-ecb6d34xxxxx" LABEL="perseus:1" TYPE="linux_raid_member" PARTUUID="72cd0455-4ccf-4561-b919-b236382xxxxx"   <-- ここ
/dev/sda1: UUID="bf91cea7-b3e5-0ae3-ab37-1167bcdxxxxx" UUID_SUB="e1687f1d-a13d-5793-4b30-2a6f87exxxxx" LABEL="perseus:1" TYPE="linux_raid_member" PARTUUID="323acaab-ef15-47f2-84a3-3bae82cxxxxx"   <-- 追加する

耐障害性を高めるため、/dev/sda1からも起動できるようにします。

sudo efibootmgr -c -d /dev/sda -L debian0 -l '\EFI\DEBIAN\SHIMX64.EFI'

登録できているか確認します。

efibootmgr -v

/dev/sda1のPARTUUIDが登録されていることが分かります。

BootCurrent: 0001
Timeout: 1 seconds
BootOrder: 0002,0001,0000
Boot0000* debian   HD(1,GPT,72cd0455-4ccf-4561-b919-b236382xxxxx,0x800,0x3c800)/File(\EFI\DEBIAN\SHIMX64.EFI)
Boot0001* debian0  HD(1,GPT,323acaab-ef15-47f2-84a3-3bae82cxxxxx,0x800,0x3c800)/File(\EFI\DEBIAN\SHIMX64.EFI)

間違えて登録した場合は、エントリを削除して再登録します。

sudo efibootmgr -b 0001 -B

reboot後にF11キーなどを押してブートデバイスを選択して、/dev/sda1、/dev/sdb1からそれぞれ起動できるか確認したら完成です。

sudo reboot

Comments