いぶろぐ雑記

Ubuntu 20.04でsystemd-bootを試してみたら、けっこういい感じだった

最近姿勢を正そうと頑張っているいぶろぐです。

Linuxのsystemdに「systemd-boot」という軽量ブートローダーが組み込まれているということを知ったので、Ubuntu 20.04でちょっと試してみました。

systemd-boot

Arch Wikiによると・・・

前は「gummiboot」という名前だったらしい。

Arch Wikiが詳しいです。

systemd-boot - ArchWiki

適当にまとめると、以下のような感じらしいです。

起動が早いのは嬉しいので、早速入れてみることに。

導入方法

ブートローダーインストール

以下、Ubuntu 20.04環境でやってます。とりえあず下記コマンドでブートローダーをESPにインストール。boot領域をいじるので、rootユーザーで作業したほうが楽です。

bootctl install

エントリーファイルの/boot/efi/loader/entries/ubuntu.confを作成します。GRUBではgrub.cfgにすべてのエントリー情報が記述されていますが、systemd-bootではentriesディレクトリの下にエントリーごとにファイルを作成するようです。

エントリーファイルの中身はこんな感じ。

title Ubuntu
linux /vmlinuz
initrd /initrd.img
options root=UUID=blkidで調べたUUID quiet splash rw
#追記:btrfsをrootディレクトリに使っている場合は「rootflags=subvol=@」が必要でした

OSが入ったディスクのUUIDはblkidなどのコマンドで調べてください。なお、カーネルイメージやinitrdのパスはESPのrootから相対パスで記述します。Ubuntuはデフォルトでは/boot/efiにESPをマウントするので、上の設定は/boot/efi直下にカーネルイメージを配置する場合の記述になります。

ついでにこんな感じで前バージョンのカーネル用エントリーファイルubuntu-old.confも記述しておくことに。

title Ubuntu-old
linux /vmlinuz.old
initrd /initrd.img.old
options root=UUID=blkidで調べたUUID rw

続いて/boot/efi/loader/loader.confを下記のように編集。defaultにはデフォルトで起動したいOSのエントリーファイル名を拡張子なしで指定します。カーネルパラメータにinit=/bin/bashなどと指定されないよう、editorの項目でカーネルパラメータの編集を無効にしておきます。ブートメニューは非表示にしたいのでtimeoutの項目はコメントアウト。

#timeout 3
default ubuntu
editor no

ここまででブートローダーの設定は完了です。

カーネル関連をごにょごにょ

Ubuntuはデフォルトだと、

となっているのですが、systemd-bootはESPからしかカーネルをロードできません。/bootにあるカーネルイメージはロードできないので、/boot/efiにコピーしてあげる必要があります。

というわけでコピーします。/boot以下の無印カーネルイメージやinitrdは最新のイメージへのシンボリックリンクなので、-fオプションだけ指定してcpしてやれば実体がコピーされます。

cp -f /boot/vmlinuz /boot/efi/vmlinuz
cp -f /boot/initrd.img /boot/efi/initrd.img
cp -f /boot/vmlinuz.old /boot/efi/vmlinuz.old
cp -f /boot/initrd.img.old /boot/efi/initrd.img.old

といってもaptでカーネル更新するたびに毎回イメージをコピーしてエントリーファイルを修正するのはかなり面倒なので、systemdのユニットファイルを作ってカーネルを更新したら自動でコピーするように設定しておきます。

まずはパス監視用のユニットファイル/etc/systemd/system/kernel-update.pathを作成。カーネルが更新される≒initrdが新しく作成されるというわけで、initrdを監視しています。

[Unit]
Description=Copy Kernel to ESP

[Path]
PathChanged=/boot/initrd.img

[Install]
WantedBy=multi-user.target
WantedBy=system-update.target

カーネルをコピーするためのユニットファイル/etc/systemd/system/kernel-update.serviceも作成。

[Unit]
Description=Copy Kernel to ESP

[Service]
Type=oneshot
ExecStart=/usr/bin/cp -f /boot/vmlinuz /boot/efi/vmlinuz
ExecStart=/usr/bin/cp -f /boot/initrd.img /boot/efi/initrd.img
ExecStart=/usr/bin/cp -f /boot/vmlinuz.old /boot/efi/vmlinuz.old
ExecStart=/usr/bin/cp -f /boot/initrd.img.old /boot/efi/initrd.img.old

あとはsystemdのサービスとして有効化。

systemctl enable kernel-update.path

これでapt経由でカーネルを更新しても自動でイメージがESPにコピーされるようになり、systemd-bootによるブートの準備も整いました。

どんくらい速いの

とりあえず起動するか確認

まずはefibootmgrしてみます。

# efibootmgr
BootCurrent: 0000
Timeout: 10 seconds
BootOrder: 0001,0000,2001,2002,2003
Boot0000* EFI Hard Drive (LITEON CB1-SD256)
Boot0001* Linux Boot Manager
Boot2001* EFI USB Device
Boot2002* EFI DVD/CDROM
Boot2003* EFI Network

「Linux Boot Manager」というやつをUEFIでブート先にしてやればいいみたい。特にスクショはないですが、しっかり起動しました。スペースキー押しながら起動するとブートメニューが出ます。

GRUB2と比較して起動の速さは・・・

MateBook X 2017でこんな感じでした。systemd-bootの方が速い。設定もシンプルなので意外といいかもです。

systemd-bootに乗り換え

特に問題なさそうだったので、GRUB2からsystemd-bootに乗り換えました。GRUBアンインストールってけっこう新鮮な体験でしたね。

個人的にsystemdは好きなので、この調子でcronとかも置き換わっていくといい感じです。