最近手持ちのコンピュータにLinuxをインストールしました.これまではブートローダーとして長くメジャーに使用されているgrub2を使っていましたが,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の起動画面が表示されます.
/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 | 起動画面で表示される起動エントリの名前 |
linux | linuxカーネルのパス(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 Boot Managerがsystemd-bootと同じEFIパーティションにインストールされている場合,systemd-bootはWindowsを自動で認識し起動時に選択することができるようになります.
/boot/loader/loader.conf
でdefaultを設定する場合はarch.conf
などの代わりにauto-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-default | EFIデフォルトの起動エントリ |
auto-efi-shell | EFIシェル |
auto-osx | macOS |
auto-poweroff | システムの電源を落とす |
auto-reboot | システムを再起動する |
auto-reboot-to-firmware-setup | UEFIの設定に再起動する |
auto-windows | Windows Boot Manager |
引用: https://man.archlinux.org/man/loader.conf.5#OPTIONS
また,systemctl reboot --boot-loader-entry=arch.conf
のように再起動しながら次の起動エントリを指定することもできます.
WindowsとLinuxを切り替えながら利用する場合,ブートローダーが前の選択を記憶してくれた方が便利なこともあるでしょう.このようなケースでは,/boot/loader/loader.conf
のdefault
をdefault @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