efifs を入れて、ext2_x64.efi を /efi/EFI/systemd/drivers/ に置くと ext4 の /boot を systemd-boot が読めるようになる
systemd-boot では /boot で利用するパーティションのタイプを Extended Boot Loader (XBOOTLDR) Partition にする事で esp (EFI system pratiion) と /boot を分ける事ができる。
この場合、以下のような構成になる
/efi: esp。systemd-boot の UEFIアプリと loader.conf が置かれる。/boot: カーネルイメージと systemd-boot のメニューエントリー (loader/entreis/*.conf) が置かれる。XBOOTLDR パーティションになっている必要がある。esp にある sytemd-boot は XBOOTLDR タイプのパーティションを探して、ここにあるメニューエントリを表示する。
/boot が FAT32 になっている場合はこれだけで問題ないのだけど、ext4 にすると systemd-boot がメニューを表示してくれない問題が起きる。実は UEFI アプリは通常 FAT しか読めないので、/boot が ext4 になってると systemd-boot が /boot を読めなくなる。その結果設定したメニューが表示されないという事になる。
これを何とかして /boot を ext4 で使えるようにしたい。
解決方法はわりと単純で、ext4 を読める UEFI ドライバーを systemd-boot にロードさせれば良い。ArchLinux では efifs パッケージが提供されていて、これに含まれている ext2_x64.efi を使えば ext4 のファイルシステムを読む事ができる。systemd-boot は esp/EFI/systemd/drivers/ にあるファイルを自動で読み込んでくれるので、ext2_x64.efi をここに配備すれば良い。つまり以下のようにする:
% sudo cp /usr/lib/efifs-x64/ext2_x64.efi /efi/EFI/systemd/drivers/
これで /boot が ext4 でもメニューが表示されるようになる。btrfs や xfs もあるっぽいので、該当のドライバーを置いてあげれば、多分これらも読めるようになるはず。
あとは必要に応じて、pacman hook 等で自動更新されるようにとかしてあげれば良い。
- https://wiki.archlinux.org/title/Systemd-boot#Installation_using_XBOOTLDR
- https://wiki.archlinux.org/title/EFI_system_partition#Typical_mount_points
- https://wiki.archlinux.org/title/Unified_Extensible_Firmware_Interface#UEFI_drivers
- https://www.reddit.com/r/debian/comments/1i4gj1q/esp_partition_vs_fat32_as_boot_partition/