Linuxを日常的に使う実験ブログ

UEFIマシン上のArchLinuxのブートローダをGRUB2からLimineに変更する

 2024-09-22

 Arch Linux

ブートローダーを変更してみよう

こんにちは。今回はArch LinuxのブートローダーをGRUB2からLimineに変更してみます。筆者はこれまでGRUB2を使用してきましたが、新しいブートローダを試してみたくなり変更してみました。現在、正常に動作しているブートローダを変更するメリットというのは実利的な観点からは皆無なのですが、そこをいじって遊べるのがLinuxなどフリーOSの醍醐味だと思っています。今日もOSをカスタムして楽しみましょう。

作業前の注意

この作業ではOSを起動するためのブートローダーを交換する作業ですので、作業に失敗するとOSが起動できなくなる可能性があります。もしOSが起動できなくなった場合にはArch Linuxのインストールメディアを用いて復旧作業を行う必要があります。この復旧作業を行う自信のない方はブートローダーに手を加えることは避けるのが賢明です。この記事では筆者が実際に行った手順を公開しますが、お使いのシステムのパーティション構成、アーキテクチャによって作業内容が若干異なる場合があることをご了承ください。特にUEFIファームウェアによってはefibootmgrによるNVRAMの変更が上手く行かない場合もあります。作業を行う際は必ずご自身の責任において行ってください。

今回の作業環境について

まず筆者の作業環境についてまとめておきます。今回はUEFIマシンにLimineを入れていきます。Legcy BIOSについてはArchWikiをご覧ください。

項目
OSArch Linux
BIOSシステムUEFI
ESP(EFI System Partition)/boot

Limineとは

Limineは軽量で高度でポータブルなブートローダです。multiboot1とmultiboot2の仕様に対応しています。Limine Boot Protocolのリファレンス実装として開発されました。

GRUB2のように肥大化することを避け、ブートローダの責任をシンプルに保とうとしています。興味のある方はLimine’s Design Philosophyをご覧ください。

LimineはLegcy BIOS, UEFIどちらのファームウェアにも対応しています。

Limineのインストール

まずはpacmanでlimineパッケージをインストールします。

pacman -S limine

次に/usr/share/limine/BOOTX64.efi/boot/EFI/limine/以下にコピーします。

mkdir -p /boot/EFI/limine
cp /usr/share/limine/BOOTX64.efi /boot/EFI/limine/

次にefibootmgrでNVRAMにLimineを登録しましょう。sdXはESPのディスク、Yはパーティション番号です。もしESPが/dev/sda1の場合はsdX=sda, Y=1としてください。

efibootmgr \
    --create \
    --disk /dev/sdX \
    --part Y \
    --loader /EFI/limine/BOOTX64.efi \
    --label "Limine"

次にefibootmgrコマンドでefiファイルの呼び出し順がGRUBよりLmineが優先度が高いことを確認します。優先順位の確認はBootOrderの値を確認します。ここでGRUBが0001、Limineが0002とすると

BootOrder: 0002, 0001, ...

のように表示されていればOKです。もしLimineの優先順位が低い場合はefibootmgrコマンドで変更します。

補足しますと、BOOTX64.efiファイルをコピーする先を例えば/boot/EFI/BOOT/BOOTX64.efiにした場合、efibootmgrで設定をしなくてもefiファームウェアが自動で探しにいくのでefibootmgrによる登録をしなくても起動できる場合があります。

Limineの設定

GRUB2の場合grub-mkconfigコマンドで自動で設定ファイルを生成してくれますが、Limineは設定ファイルを手動で作成する必要があります。Limineはカスタマイズ性の高いブートローダなので自由度が高い分、設定できる項目数も多いです。ここでは最低限、Arch Linuxを起動するための設定を書きますが、その他の設定に関しては公式ドキュメントをご覧ください。

/boot/limine.configの設定例

TIMEOUT=5

:Arch Linux
    PROTOCOL=linux
    KERNEL_PATH=boot:///vmlinuz-linux
    CMDLINE=root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx rw
    MODULE_PATH=boot:///initramfs-linux.img

上記ではシンプルにArch Linuxを起動するためだけにTIMEOUTの項目のみ設定しましたが、壁紙に画像を設定するなど細かいカスタマイズが可能です。壁紙画像にはBMP, PNG, JPEG画像が使用可能です。

起動試験

ではlimineを使用して起動できるか確認してみましょう。システムを再起動します。以下のようなが画面が出ればOKです。

limine boot screen

GRUB2の削除(任意)

この作業はLimineで安定的にOSの起動ができるようになり、Grubが不要になった方のみ行ってください。もし再度Grubを使用する可能性のある方は残しておいた方が良いでしょう。まずはefibootmgrでGRUB2の登録を削除しましょう。ここではGRUB2が0001で登録されていると仮定します。

efibootmgr -b 1 -B

次にGRUB2の関連ファイルがあるディレクトリを削除していきます。今回はgrubx64.efiファイルが/boot/EFI/grub/grubx64.efiに存在すると仮定します。

rm -r /boot/grub
rm -r /boot/EFI/grub

まとめ

UEFI BIOSのマシンにインストールしたArch LinuxをLimineを使用して起動できるようにしました。Limineを使ってみて、GRUB2は他のOSを検出して(os-proberが必要)設定ファイルを自動生成してくれる非常に便利な反面、ブートローダーとしてのシンプルな機能以外にも多くの仕事をしていたんだなと改めて思いました。

Arch Linuxの公式リポジトリにある他のブートローダとしてはrEFIndがあります。UEFI専用のブートローダでありLegacy BIOSには非対応ですが、興味のある方はrEFIndも調べてみてください。