systemd-boot
systemd-boot (旧名 gummiboot) は設定済みの EFI イメージを実行できるシンプルな UEFI ブートマネージャです。デフォルトのエントリは設定したパターン (glob) または画面上のメニューで選択されます。systemd-boot は systemd 220-2 から systemd に同梱されるようになりました。
systemd-boot は簡単に設定することができ、Linux カーネルの EFISTUB や UEFI シェル、grub.efi などの EFI 実行可能ファイルだけを起動できます。
目次
インストール
EFI ブート
まず、EFI 変数にアクセスできるかチェックして UEFI モードで起動していることを確認してください。また、EFI System Partition が正しくマウントされて、カーネルと initramfs が ESP にコピーされていないと、systemd-boot は他のパーティションから EFI バイナリをロードすることができません。以上のことから systemd-boot を使う時は ESP を /boot
にマウントすることを強く推奨します。ESP を /boot
以外に作りたい場合、#アップデート を見て下さい。
以下のコマンドを実行することで systemd-boot のバイナリがあなたの EFI System Partition にコピーされ、EFI Boot Manager によってロードされるデフォルトの EFI アプリケーション (デフォルトブートエントリ) として systemd-boot が追加されます。UEFI モードで起動していない場合、また、EFI 変数にアクセスできないときは、ブートエントリの作成は失敗します。ただし systemd-boot のバイナリは ESP 内にある EFI バイナリのデフォルトの配置場所 (x64 環境では $esp/EFI/boot/bootx64.efi
) にコピーされるので systemd-boot を起動すること自体は可能です。
# bootctl --path=$esp install
レガシーブート
レガシーな OS を起動したいときも systemd-boot をインストールすることは可能です。ただし、起動時に systemd-boot の EFI ファイルを実行するようにファームウェアを設定する必要があります:
- EFI シェルを使用する。
- ファームウェアのインターフェイスから起動時にロードされる EFI ファイルを設定する。
設定できる場合、インストールは簡単です: EFI シェルやファームウェアの設定インターフェイスを開いて、マシンのデフォルトの EFI ファイルを /<EFI boot partition>/EFI/systemd/systemd-bootx64.efi
に変更してください。
アップデート
systemd-boot はあなたの EFI System Partition が /boot
にマウントされていると予め事前設定されており、新しい systemd-boot がインストールされた場合、インストールスクリプトの post_install
によって bootctl --path=/boot update
コマンドが自動的に実行されます。ESP が /boot
にマウントされていないときは、手動でコマンドを実行する必要があります。
設定
基本設定
基本的な設定は /boot/loader/loader.conf
に記述します、2つの設定オプションが使えます:
default
– 選択するデフォルトエントリ (.conf
を付けない);arch-*
のようにワイルドカードを使うことができます
timeout
– メニューのタイムアウト秒数。この値が設定されていない場合、起動中にスペースキーを押した時だけメニューが表示されます。
例:
$esp/loader/loader.conf
default arch timeout 4
オプションは両方ともブートメニューで変更するこができ、EFI 変数として保存されます。
ブートエントリの追加
bootctl は $esp/loader/entries/*.conf
にあるブートメニューのアイテムを検索します – 1つのファイルに1つのブートエントリを記述します。利用できるオプションは:
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 では、linux path-to-vmlinuz
と initrd path-to-initramfs
を指定することができます。この値は自動で efi path
と options initrd=path
に翻訳されます – この文法は利便性のためにサポートされており機能に違いはありません。
標準的な root インストール
LVM や LUKS がない root パーティションを使用するエントリの例:
/boot/loader/entries/arch.conf
title Arch Linux linux /vmlinuz-linux initrd /initramfs-linux.img options root=PARTUUID=14420948-2cea-4de7-b042-40f67c618660 rw
上の例にある PARTUUID/PARTLABEL は GPT パーティションを識別しています。ファイルシステムを識別する UUID/LABEL とは異なっていることに注意してください。PARTUUID/PARTLABEL には他のファイルシステムでパーティションをフォーマットしなおしても値が変わらないという利点があります。またパーティションにファイルシステムがない (もしくは LABEL をサポートしていない LUKS を使っている) 場合などにも有用です。
LVM root インストール
論理ボリュームマネージャを使う root パーティションのエントリ例:
$esp/loader/entries/arch-lvm.conf
title Arch Linux (LVM) linux /vmlinuz-linux initrd /initramfs-linux.img options root=/dev/mapper/<VolumeGroup-LogicalVolume> rw
<VolumeGroup-LogicalVolume>
は実際の VG や LV の名前に置き換えて下さい (例: root=/dev/mapper/volgroup00-lvolroot
)。また、UUID を使うこともできます:
.... options root=UUID=<UUID identifier> rw
LVM や LUKS がない root パーティションで使っていた root=PARTUUID=
の代わりに root=UUID=
を使っていることに注意してください。
暗号化 root インストール
root パーティションを暗号化している場合の設定ファイルの例 (DM-Crypt / LUKS):
$esp/loader/entries/arch-encrypted.conf
title Arch Linux Encrypted linux /vmlinuz-linux initrd /initramfs-linux.img options cryptdevice=UUID=<UUID>:<mapped-name> root=UUID=<luks-UUID> quiet ro
上記の例では UUID を使っています。必要であれば、PARTUUID で UUID を置き換えることもできます。<luks-UUID>
は暗号化を解除した後の実際の root ファイルシステムの UUID を示しています (/dev/mapper/<mapped-name>
)。デバイスの UUID ではありません。Dm-crypt/システム設定#ブートローダーを見て下さい。
\EFI\arch\grub.efi
など他の EFI プログラムを追加することもできます。
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
セキュリティ
e
を押すことで systemd-boot のブートメニューからカーネルコマンドラインのパラメータを編集することができますが (#キー一覧を参照)、これは場合によってセキュリティ上の欠陥となることがあるので注意してください。例えば init=/bin/bash
のように init=
を再定義することで、設定された root パスワードを迂回して、直接 root としてマシンを起動することが出来てしまいます。いまのところ systemd-boot にはパスワード機能がないためカーネルパラメータの変更を防ぐことはできません。コンピュータが起動されないようにするためには、ハードウェアレベル (UEFI/BIOS) でパスワードを設定する必要があります。
セキュリティはいくつかのレベルからなり、物理的なアクセスによってセキュリティが破られることもあるため、ディスクを dm-crypt で暗号化すると良いかもしれません (特にマシンがノートパソコンの場合)。これについては systemd-boot とは関係ありません。
ハイバネーション
サスペンドとハイバネートの記事を参照してください。
ブートメニュー
キー一覧
メニューの中では以下のキーが使われます:
Up/Down
- エントリの選択Enter
- 選択したエントリの起動d
- (不揮発の EFI 変数に保存された) デフォルトエントリを選択して起動t/T
- (不揮発の EFI 変数に保存された) タイムアウトを調整e
- カーネルコマンドラインを編集q
- 終了v
- systemd-boot と UEFI のバージョンを表示p
- 現在の設定を表示h
- キーマップを表示h/?
- ヘルプ
以下のホットキーを、起動中やメニューで押すことで、特定のエントリを直接起動します:
l
- Linuxw
- Windowsa
- OS Xs
- EFI Shell1-9
- エントリの番号
トラブルシューティング
efibootmgr を使って手動エントリを追加する
bootctl install
コマンドが失敗した場合、efibootmgr
ユーティリティを使って EFI ブートエントリを手動で作成することができます:
# efibootmgr -c -d /dev/sdX -p Y -l /EFI/systemd/systemd-bootx64.efi -L "Linux Boot Manager"
Windows をアップグレードした後にメニューが表示されない
Windows 8 から Windows 8.1 にアップグレードした場合などに、ブートメニューが表示されなくなることがあります:
- Secure Boot (UEFI 設定) と Fast Startup (Windows の電源オプション設定) が両方とも無効になっていることを確認してください。
- Windows Boot Manager よりも Linux Boot Manager が UEFI で優先されていることを確認してください (Hard Drive Disk Priority などの UEFI 設定)。
Windows 8.x 以上で、設定したブートの順番を守るようにさせたい場合、Windows のグループポリシーを入力して起動時にバッチファイル (.bat) を起動するようにしてください。Windows 上で以下を実行:
- 管理者権限でコマンドプロンプトを開いて下さい。そして
bcdedit /enum firmware
と入力します。 - 説明に "Linux" と付いているファームウェアアプリケーションを探して下さい。例: "Linux Boot Manager"。
- 括弧も含めて Identifier をコピーします。例:
{31d0d5f4-22ad-11e5-b30b-806e6f6e6963}
。 - gpedit から ローカルコンピュータポリシー-> コンピューターの構成-> Windows の設定-> スクリプト(スタートアップ/シャットダウン) を開いて "スタートアップ" を選択してください。"スタートアップのプロパティ" という名前のウィンドウが開きます。
- "スクリプト"タブの、追加ボタンを押して下さい。
- スクリプトに名前を付けます。例:
bootorder.bat
。 - "スクリプトのパラメーター" には
bcdedit /set {fwbootmgr} DEFAULT {先にコピーした identifier}
と入力します (例:bcdedit /set {fwbootmgr} DEFAULT {31d0d5f4-22ad-11e5-b30b-806e6f6e6963}
)。
上記の設定が上手く行かない場合、Windows 環境のどこかに bcdedit /set {fwbootmgr} DEFAULT {先にコピーした identifier}
と記述したバッチファイルを作成して、gpedit から保存したファイルを参照してください。