systemd-boot
systemd-boot (旧名 gummiboot) は設定済みの EFI イメージを実行できるシンプルな UEFI ブートマネージャです。デフォルトのエントリは設定したパターン (glob) または画面上のメニューで選択されます。systemd-boot は systemd 220-2 から systemd に同梱されるようになりました。
systemd-boot は簡単に設定することができ、Linux カーネルの EFISTUB や UEFI シェル、grub.efi などの EFI 実行可能ファイルだけを起動できます。
インストール
EFI ブートマネージャのインストール
systemd-boot の EFI ブートマネージャをインストールする場合、まず UEFI モードでシステムが起動しているかどうか、UEFI 変数が利用できるかどうか確かめてください。efivar --list
コマンドを実行することでチェックできます。
systemd-boot は EFI システムパーティション (ESP) からしか EFISTUB カーネルをロードできません。カーネルを最新状態に保つために、ESP は /boot
にマウントすることが推奨されています。ESP を /boot
にマウントしなかった場合、カーネルと initramfs を ESP にコピーする必要があります。詳しくは EFISTUB#他の ESP マウントポイントを見てください。
このページでは ESP のマウントポイントを esp
として表します (大抵の場合は /boot
です)。
ESP が esp
にマウントされているとして、bootctl(1) を使用して EFI システムパーティションに systemd-boot をインストールします:
# bootctl --path=esp install
上記のコマンドで systemd-boot ブートローダーが EFI パーティションにコピーされます。x64 アーキテクチャの場合は2つの同じバイナリ esp/EFI/systemd/systemd-bootx64.efi
と esp/EFI/Boot/BOOTX64.EFI
が ESP に転送されます。そして EFI ブートマネージャによってロードされるデフォルトの EFI アプリケーション (デフォルトブートエントリ) として systemd-boot が設定されます。
インストールしたら、#設定セクションに進んで systemd-boot を正しく機能させるために必要なブートローダーを追加してください。
EFI ブートマネージャの更新
systemd-boot のバージョンが新しくなった場合、ユーザーがブートマネージャを更新する必要があります。手動で行ったり、もしくは pacman フックを使って自動で更新できます。
手動で更新
bootctl を使用して systemd-boot をアップデートしてください。path
パラメータを指定しなかった場合 /efi
, /boot
, /boot/efi
がチェックされます。
# bootctl update
ESP を別の場所にマウントしている場合、path
オプションを以下のように指定します:
# bootctl --path=esp update
自動で更新
systemd-boot-pacman-hookAUR パッケージには上記のアップデートを自動化する Pacman フックが含まれています。パッケージをインストールすると systemd パッケージをアップグレードしたときに毎回フックが起動するようになります。また、パッケージをインストールする代わりに、/etc/pacman.d/hooks/
ディレクトリに以下の pacman フックを作成することでも自動更新できます:
/etc/pacman.d/hooks/systemd-boot.hook
[Trigger] Type = Package Operation = Upgrade Target = systemd [Action] Description = Updating systemd-boot When = PostTransaction Exec = /usr/bin/bootctl update
設定
ローダー設定
ローダーの設定は esp/loader/loader.conf
ファイルに保存され、以下のオプションで設定します:
default
– #ローダーの追加で定義されるデフォルト選択エントリ。.conf
拡張子は付けず、arch-*
のようにワイルドカードを使うことができます。timeout
– デフォルトエントリが起動するまでのメニューのタイムアウト秒数。この値が設定されていない場合、起動中にSpace
キーを押した時だけメニューが表示されます。editor
- カーネルパラメータの編集を可能にするかどうかの設定。yes
(デフォルト) は可能になり、no
は無効になります。init=/bin/bash
を加えることで root パスワードを回避して root 権限を得ることが出来てしまうため、このオプションはno
に設定することが強く推奨されています。auto-entries
–1
(デフォルト) に設定した場合は Windows, EFI Shell, デフォルトローダーの自動エントリを表示し、0
の場合は表示しません。auto-firmware
–1
(デフォルト) に設定した場合、UEFI ファームウェア設定を起動するエントリを表示し、0
に設定した場合は表示しません。console-mode
– UEFI コンソールモードを変更します:0
の場合は 80x25,1
の場合は 80x50,2
以上の場合はデバイスファームウェアによって提供されている非標準モード。auto
は適切なモードを自動選択。max
は一番解像度が高いモード。keep
(デフォルト) はファームウェアが選択したモードを維持します。
利用可能なオプションの完全な一覧は loader.conf(5) を参照。
設定例:
esp/loader/loader.conf
default arch timeout 4 editor no
ローダーの追加
bootctl は esp/loader/entries/*.conf
からブートメニューのアイテムを検索します – 各ファイルにそれぞれひとつだけローダーを記述してください。利用可能なオプション:
title
– オペレーティングシステムの名前。必須。version
– カーネルバージョン、同じ title のエントリが複数存在する場合にのみ表示されます。任意。machine-id
–/etc/machine-id
のマシン識別子、title と version が同じエントリが複数存在する場合にのみ表示されます。任意。efi
– 起動する EFI プログラム、ESP (/boot
) からの相対パス。例:/vmlinuz-linux
。このオプションかlinux
(下を参照) のどちらか一方が必須です。options
– EFI プログラムに渡すコマンドラインオプションまたはカーネルパラメータ。任意ですが、Linux を起動する場合initrd=efipath
とroot=dev
が最低限必要になります。
Linux を起動する場合、efi
と options
を使う代わりに以下のオプションが使用できます:
linux
とinitrd
で ESP の適切なファイルの相対パスを指定します。例:/vmlinuz-linux
。この値は自動でefi path
とoptions initrd=path
に翻訳されます – この文法は利便性のためにサポートされており機能に違いはありません。
arch_os というラベルが付いたパーティションから Arch を起動して Intel CPU のマイクロコードをロードするローダーファイルの例:
esp/loader/entries/arch.conf
title Arch Linux linux /vmlinuz-linux initrd /intel-ucode.img initrd /initramfs-linux.img options root=LABEL=arch_os rw
bootctl は自動的に "Windows Boot Manager" (/EFI/Microsoft/Boot/Bootmgfw.efi
), "EFI Shell" (/shellx64.efi
), "EFI Default Loader" (/EFI/BOOT/bootx64.efi
) をチェックします。また、/EFI/Linux
にカーネルファイルが存在しないかもチェックされます。これらが検出された場合、自動的に適切なエントリが生成されます (auto-windows
, auto-efi-shell
, auto-efi-default
)。これらのエントリを手動でローダー設定する必要はありません。ただし、(rEFInd など) 他の EFI アプリケーションは自動検出されないため、Linux カーネルを起動するには、手動で設定してエントリを作成する必要があります。
EFI シェルや他の EFI アプリ
EFI シェルなどの EFI アプリケーションを ESP にインストールしている場合、以下のスニペットを使うことができます:
esp/loader/entries/uefi-shell-v1-x86_64.conf
title UEFI Shell x86_64 v1 efi /EFI/shellx64_v1.efi
esp/loader/entries/uefi-shell-v2-x86_64.conf
title UEFI Shell x86_64 v2 efi /EFI/shellx64_v2.efi
/EFI/Linux のカーネルの準備
カーネル・初期 RAM ディスク (initrd)・カーネルコマンドライン・/etc/os-release
をひとつのファイルにまとめた特殊なカーネルファイルとして /EFI/Linux が検索されます。セキュアブートするために簡単にファイルに署名することができます。
使用したいカーネルコマンドラインをファイルに記述して以下のようにバンドルファイルを作成してください:
Kernel packaging command:
objcopy \ --add-section .osrel="/usr/lib/os-release" --change-section-vma .osrel=0x20000 \ --add-section .cmdline="kernel-command-line.txt" --change-section-vma .cmdline=0x30000 \ --add-section .linux="vmlinuz-file" --change-section-vma .linux=0x40000 \ --add-section .initrd="initrd-file" --change-section-vma .initrd=0x3000000 \ "/usr/lib/systemd/boot/efi/linuxx64.efi.stub" "linux.efi"
生成した linux.efi
ファイルには任意で署名することができます。
linux.efi
は esp/EFI/Linux
にコピーしてください。
ハイバネーション
サスペンドとハイバネートの記事を参照してください。
パスワードで保護されたカーネルパラメータエディタ
password
設定オプションをサポートしている systemd-boot-passwordAUR をインストールすることもできます。sbpctl generate
を使ってオプションで指定する値を生成できます。
systemd-boot-password は以下のコマンドでインストールしてください:
# sbpctl install esp
カーネルパラメータを編集する前にパスワードの入力が求められるようになります。
ブートメニューのキー一覧
メニューの中では以下のキーが使われます:
Up/Down
- エントリの選択Enter
- 選択したエントリの起動d
- (不揮発の EFI 変数に保存された) デフォルトエントリを選択して起動t/T
- (不揮発の EFI 変数に保存された) タイムアウトを調整e
- カーネルコマンドラインを編集。editor
オプションが0
に設定されている場合は使えませんq
- 終了v
- systemd-boot と UEFI のバージョンを表示p
- 現在の設定を表示h
- キーマップを表示h/?
- ヘルプ
以下のホットキーを、起動中やメニューで押すことで、特定のエントリを直接起動します:
l
- Linuxw
- Windowsa
- OS Xs
- EFI Shell1-9
- エントリの番号
ヒントとテクニック
再起動後の起動対象を選択する
ブートマネージャーは systemctl コマンドに統合されており、再起動後に起動させるオプションを選択できます。例えば、カスタムカーネルのエントリファイルが esp/loader/entries/arch-custom.conf
にあるとき、次のようにするとデフォルト設定はそのままにカスタムカーネルが起動します:
$ systemctl reboot --boot-loader-entry=arch-custom
マザーボードのファームウェアを起動させるときは次のようにします:
$ systemctl reboot --firmware-setup
Unified Kernel Image を使う
systemd-boot は esp/EFI/Linux/
内の unified kernel image を検索します。
unified kernel image はカーネル、initrd、カーネルのコマンドライン、/etc/os-release
およびスプラッシュスクリーンを単一ファイルに格納したもので、セキュアブート のための署名が容易に可能です。
作成するには、カーネルコマンドラインを指定した上で次のようにします:
$ objcopy \ --add-section .osrel="/usr/lib/os-release" --change-section-vma .osrel=0x20000 \ --add-section .cmdline="kernel-command-line.txt" --change-section-vma .cmdline=0x30000 \ --add-section .splash="/usr/share/systemd/bootctl/splash-arch.bmp" --change-section-vma .splash=0x40000 \ --add-section .linux="vmlinuz-file" --change-section-vma .linux=0x2000000 \ --add-section .initrd="initrd-file" --change-section-vma .initrd=0x3000000 \ "/usr/lib/systemd/boot/efi/linuxx64.efi.stub" "linux.efi"
作成した linux.efi
をセキュアブート#ブートローダーとカーネルの署名 署名することもできます。
linux.efi
を esp/EFI/Linux/
にコピーしてください。
トラブルシューティング
BIOS モードで起動後にインストール
BIOS モードで OS を起動したいときも systemd-boot をインストールすることは可能です。ただし、起動時に systemd-boot の EFI ファイルを実行するようにファームウェアを設定する必要があります:
- EFI シェルを使用する。
- ファームウェアのインターフェイスから起動時にロードされる EFI ファイルを設定する。
設定できる場合、インストールは簡単です: EFI シェルやファームウェアの設定インターフェイスを開いて、マシンのデフォルトの EFI ファイルを esp/EFI/systemd/systemd-bootx64.efi
(32ビット環境の場合 systemd-bootia32.efi
) に変更してください。
efibootmgr を使って手動エントリを追加する
bootctl install
コマンドが失敗した場合、efibootmgr ユーティリティを使って EFI ブートエントリを手動で作成することができます:
# efibootmgr -c -d /dev/sdX -p Y -l "\EFI\systemd\systemd-bootx64.efi" -L "Linux Boot Manager"
/dev/sdXY
は EFI システムパーティションに置き換えてください。
Windows をアップグレードした後にメニューが表示されない
Unified Extensible Firmware Interface#Windows によってブート順序が変わってしまうを見てください。