Ubuntu 20.04でsystemd-bootを試してみたら、けっこういい感じだった
最近姿勢を正そうと頑張っているいぶろぐです。
Linuxのsystemdに「systemd-boot」という軽量ブートローダーが組み込まれているということを知ったので、Ubuntu 20.04でちょっと試してみました。
systemd-boot
Arch Wikiによると・・・
前は「gummiboot」という名前だったらしい。
Arch Wikiが詳しいです。
適当にまとめると、以下のような感じらしいです。
- systemdが入っていれば導入可能
- 起動が速い
- ESPからしかカーネルをロードできない
- セキュアブート対応
起動が早いのは嬉しいので、早速入れてみることに。
導入方法
ブートローダーインストール
以下、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はデフォルトだと、
/boot/efi
にESPをマウント/boot
にカーネルイメージやinitrdを配置
となっているのですが、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の方が速い。設定もシンプルなので意外といいかもです。
- GRUB2:16.8秒
- systemd-boot:13.8秒
systemd-bootに乗り換え
特に問題なさそうだったので、GRUB2からsystemd-bootに乗り換えました。GRUBアンインストールってけっこう新鮮な体験でしたね。
個人的にsystemdは好きなので、この調子でcronとかも置き換わっていくといい感じです。