コンテンツにスキップ

systemd-boot

提供: ArchWiki
2015年7月8日 (水) 10:55時点におけるKusakata (トーク | 投稿記録)による版

systemd-boot (旧名 gummiboot) は設定済みの EFI イメージを実行できるシンプルな UEFI ブートマネージャです。デフォルトのエントリは設定したパターン (glob) または画面上のメニューで選択されます。systemd-boot は systemd 220-2 から systemd に同梱されるようになりました。

systemd-boot は簡単に設定することができ、Linux カーネルの EFISTUB や UEFI シェル、grub.efi などの EFI 実行可能ファイルだけを起動できます。

警告 systemd-boot は EFISTUB カーネルのブートメニューを提供します。FS#33745 にあるように EFISTUB カーネルの起動に問題が起こる場合は、GRUBSyslinux、または ELILO といった EFISTUB を使用しないブートローダーを使ってください。
ノート この記事では EFI System Partition (ESP) のマウントポイントを $esp で示します。

インストール

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 ファイルを設定する。
ノート Dell の Latitude シリーズなどでは、EFI ブートを設定するために必要な全てがファームウェアのインターフェイスに揃っており、EFI シェルではコンピュータの ROM に書き込みを行えません。

設定できる場合、インストールは簡単です: 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 は自動的に "Windows Boot Manager" (\EFI\Microsoft\Boot\Bootmgfw.efi), "EFI Shell" (\shellx64.efi), "EFI Default Loader" (\EFI\Boot\bootx64.efi) をチェックします。これらが検出された場合、自動的に適切なエントリが生成されます。ただし、(rEFInd など) 他の EFI アプリケーションは自動検出されないため、カーネルを起動するには、手動で設定してエントリを作成する必要があります。Windows とデュアルブートする場合、Windows のデフォルトオプションである高速スタートアップを無効にすることを強く推奨します。
ヒント blkid -s PARTUUID -o value /dev/sdxY コマンドを使うことで root パーティションの PARTUUID を確認できます。'x' はデバイス文字、'Y' はパーティション番号に置き換えて下さい。確認するのは root パーティションだけで大丈夫です。$esp は確認する必要がありません。

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=efipathroot=dev が最低限必要になります。

Linux では、linux path-to-vmlinuzinitrd path-to-initramfs を指定することができます。この値は自動で efi pathoptions 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 - Linux
  • w - Windows
  • a - OS X
  • s - EFI Shell
  • 1-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 10 も含む) では、起動するたびにインストールした UEFI のエントリが上書きされてしまい、Windows が一番優先して起動されます。たとえ UEFI のファームウェアでブートの順番を変えたとしても、一度 Windows 10 を起動してしまえばそれで Windows が一番上に戻ります。マザーボードの 'Change Boot Option' キーが何なのか知っておいて下さい。

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 から保存したファイルを参照してください。

参照