systemd-bootの紹介


2024年 01月 18日

最近手持ちのコンピュータにLinuxをインストールしました.これまではブートローダーとして長くメジャーに使用されているgrub2を使っていましたが,systemd-bootを使用したところ非常に便利でした.

この記事ではsystemd-bootの使い方をインストール方法から応用まで紹介します.

systemd-bootとは

systemd-bootはsystemdに含まれているブートローダーです.
シンプルな画面と機能を持つブートローダーで,grub2と比べてシステムが高速に起動するという特徴を持っています.また,非常に簡単に設定が可能で,grub2のようなコンフィグファイルの再生成をする必要がありません.

対して,複雑な用途にはあまり向いていません.
例えばgrub2ではgrub2と異なるEFI SystemパーティションにインストールされたOSを起動することができますが,systemd-bootではできません.

解説に使用するパーティションレイアウト

# fdisk -l
Device             Start        End   Sectors   Size Type
/dev/nvme0n1p1      2048   16779263  16777216     8G EFI System
/dev/nvme0n1p2  16779264   50333695  33554432    16G Linux swap
/dev/nvme0n1p3  50337792  810242047 759904256 362.4G Linux filesystem
/dev/nvme0n1p4 810242048  810274815     32768    16M Microsoft reserved
/dev/nvme0n1p5 810274816 1000214527 189939712  90.6G Microsoft basic data

512GBのSSDを5つのパーティションに切り,/dev/nvme0n1p1をEFI Systemとして利用しています.
WindowsはLinuxのインストール後にインストールしてあり,Windown Boot ManagerはLinuxカーネルと同じパーティションにインストールしています.

インストール

systemd-bootをインストールするにはコンピュータがUEFIモードで起動している必要があります./sys/firmware/efi/efivarsが存在するかを確かめることで,UEFIで起動していることを確認できます.

UEFIから読み書きできるパーティションにgpartedなどを利用してEFI Systemのタイプを付け,bootctl installコマンドを実行してsystemd-bootをインストールできます.
このコマンドによって,UEFIの設定が変更されsystemd-bootのエントリが起動メニューに追加されます.

この状態でコンピュータを再起動するとsystemd-bootの起動画面が表示されます.

systemd-bootが起動している様子
UEFIの起動エントリにsystemd-boot(Linux Boot Manager)が追加されている様子

systemd-bootの設定

/boot/loaderディレクトリにあるloader.confファイルを編集することでsystemd-bootを設定できます.ファイルに次のような記述を追加します.

default arch.conf
timeout 0
console-mode auto

defaultは標準で起動する起動エントリファイルを指定するオプションです.起動エントリファイルについては次項で説明します.
timeoutは起動エントリを選択する画面を何秒表示するかを指定するオプションです.0にした場合選択画面を表示するためにスペースキーを長押しする必要があります.
console-mode autoは画面表示のオプションです.基本的に,起動画面がうまく表示されない場合以外変更する必要はありません.

起動エントリの追加

次にsystemd-bootからLinuxを起動できるように,起動エントリファイルを作成します.

起動エントリファイルの作成

起動エントリファイルを/boot/loader/entriesに作成します.今回の例では次のようなファイルを作成しました.パスのルートはEFI Systemパーティションを基準にしている点に注意してください.

title Arch Linux
linux /vmlinuz-linux
initrd /intel-ucode.img
initrd /initramfs-linux.img
options root=PARTUUID=4c39fb35-920e-4591-b113-22de026f61fc rw fbcon=rotate:1 resume=UUID=58c67002-dc92-4eec-85e4-af0d21538ad5 net.ipv4.tcp_ecn=0

それぞれの項目の意味は次のようになっています.

項目意味
title起動画面で表示される起動エントリの名前
linuxlinuxカーネルのパス(EFIパーティションのルートを起点として絶対パスで記述します)
initrd初期RAMディスクのパス(マイクロコードやinitramfsなど)
optionsカーネルパラメータの指定

カーネルパラメータにはLinuxシステムのrootや,ハイバネート復帰用のswap領域を指定してください.
パーティションのPARTUUIDを調べるには,blkidコマンドを利用します.
ブロックデバイスには UUID と PARTUUID という似た名前の属性があるので、取り間違えに注意してください.

$ blkid
/dev/nvme0n1p5: BLOCK_SIZE="512" UUID="607C98A67C98790C" TYPE="ntfs" PARTLABEL="Basic data partition" PARTUUID="49c7f8d3-3727-4cd3-b82f-b8d625e11606"
/dev/nvme0n1p3: UUID="9f30ab82-f6b9-429f-ab51-77c0826839df" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="4c39fb35-920e-4591-b113-22de026f61fc"
/dev/nvme0n1p1: UUID="724B-0553" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="67348bc4-0ae4-429a-9490-2a9b0513297e"
/dev/nvme0n1p2: UUID="58c67002-dc92-4eec-85e4-af0d21538ad5" TYPE="swap" PARTUUID="d7e7dfe6-1fec-4da1-a1d7-e0d7175a1732"

応用編

Windowsとのデュアルブートに使用する

Windows Boot Managerがsystemd-bootと同じEFIパーティションにインストールされている場合,systemd-bootはWindowsを自動で認識し起動時に選択することができるようになります.

/boot/loader/loader.confでdefaultを設定する場合はarch.confなどの代わりにauto-windowsを使用できます.

Linux用の起動エントリと自動認識されたWindowsが表示されている

次の起動時にどのエントリで起動するかを設定する

bootctl set-defaultコマンドや,bootctl set-oneshotコマンドを利用するとデフォルトで選択される起動エントリを変更できます.

# bootctl set-default arch.conf
# bootctl set-oneshot auto-reboot-to-firmware-setup

set-defaultでは常に選択されるエントリ,set-oneshotで一度のみ使用されるエントリを設定します.

起動エントリファイルの他に下記の指定が利用できます.

名前説明
auto-efi-defaultEFIデフォルトの起動エントリ
auto-efi-shellEFIシェル
auto-osxmacOS
auto-poweroffシステムの電源を落とす
auto-rebootシステムを再起動する
auto-reboot-to-firmware-setupUEFIの設定に再起動する
auto-windowsWindows Boot Manager

引用: https://man.archlinux.org/man/loader.conf.5#OPTIONS

また,systemctl reboot --boot-loader-entry=arch.confのように再起動しながら次の起動エントリを指定することもできます.

前の選択を覚える

WindowsとLinuxを切り替えながら利用する場合,ブートローダーが前の選択を記憶してくれた方が便利なこともあるでしょう.このようなケースでは,/boot/loader/loader.confdefaultdefault @savedに設定すると前の選択を記憶してくれるようになります.
ただし,このオプションを設定するとsystemd-bootは毎回の起動時にEFI変数を書き換えるようになります.
場合によってはトラブルの元になる可能性があります.

まとめ

systemd-bootはgrub2等と比べシンプルな機能のみを持つ代わりに非常に取り回しの良いブートローダーです.ぜひ利用してみてください.

参考文献
https://wiki.archlinux.org/title/systemd-boot
https://unix.stackexchange.com/questions/628752/can-systemd-boot-remember-your-previous-choice
https://www.freedesktop.org/software/systemd/man/latest/bootctl.html
https://man.archlinux.org/man/loader.conf.5#OPTIONS