systemd-boot

提供: ArchWiki
2015年11月3日 (火) 17:50時点における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/systemd-bootx64.efi) にコピーされるので systemd-boot を起動すること自体は可能です。

# bootctl --path=$esp install

レガシーブート

警告: こちらの起動方法は推奨されません。

レガシーな OS を起動したいときも systemd-boot をインストールすることは可能です。ただし、起動時に systemd-boot の EFI ファイルを実行するようにファームウェアを設定する必要があります:

  • EFI シェルを使用する。
  • ファームウェアのインターフェイスから起動時にロードされる EFI ファイルを設定する。
ノート: Dell の Latitude シリーズなどでは、EFI ブートを設定するために必要な全てがファームウェアのインターフェイスに揃っており、EFI シェルではコンピュータの ROM に書き込みを行えません。

設定できる場合、インストールは簡単です: EFI シェルやファームウェアの設定インターフェイスを開いて、マシンのデフォルトの EFI ファイルを /$esp/EFI/boot/systemd-bootx64.efi (i686 環境の場合 systemd-bootia32.efi) に変更してください。

アップデート

systemd-boot (bootctl(1), systemd-efi-boot-generator(8)) はあなたの EFI System Partition が /boot にマウントされていると予め事前設定されています。新しいパッケージがリリースされたら post_install スクリプトによって自動的にアップデートされていた、昔の gummiboot パッケージと違って、systemd-boot では手動でアップデートするようになっています:

# bootctl update

ESP が /boot にマウントされていない場合、--path= オプションで指定します。例:

# bootctl --path=/boot/$esp update

設定

基本設定

基本的な設定は /boot/loader/loader.conf に記述します、3つの設定オプションが使えます:

  • default – 選択するデフォルトエントリ (.conf を付けない); arch-* のようにワイルドカードを使うことができます
  • timeout – メニューのタイムアウト秒数。この値が設定されていない場合、起動中にスペースキーを押した時だけメニューが表示されます。
  • editor - カーネルパラメータの編集を可能にするかどうか設定。1 (デフォルト) は可能になり、0 は無効になります。init=/bin/bash を加えることで root パスワードを回避して root 権限を得ることが出来てしまうため、このオプションは 0 に設定することが強く推奨されています。

例:

$esp/loader/loader.conf
default  arch
timeout  4
editor  0

最初の2つのオプションは両方ともブートメニューで変更するこができ、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 rw

上記の例では UUID を使っています。必要であれば、PARTUUID で UUID を置き換えることもできます。<luks-UUID> は暗号化を解除した後の実際の root ファイルシステムの UUID を示しています (/dev/mapper/<mapped-name>)。デバイスの UUID ではありません。Dm-crypt/システム設定#ブートローダーを見て下さい。

\EFI\arch\grub.efi など他の EFI プログラムを追加することもできます。

btrfs サブボリューム root インストール

btrfs のサブボリュームを root として起動する場合、options 行を rootflags=subvol=<root subvolume> に変更してください。以下の例では、'ROOT' という名前の btrfs のサブボリュームを root としてマウントしています (例: mount -o subvol=ROOT /dev/sdxY /mnt):

$esp/loader/entries/arch-btrfs-subvol.conf
title          Arch Linux
linux          /vmlinuz-linux
initrd         /initramfs-linux.img
options        root=PARTUUID=14420948-2cea-4de7-b042-40f67c618660 rw rootflags=subvol=ROOT

以上のように設定していないと次のエラーメッセージが表示されます: ERROR: Root device mounted successfully, but /sbin/init does not exist.

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

ハイバネーション

サスペンドとハイバネートの記事を参照してください。

ブートメニュー

キー一覧

メニューの中では以下のキーが使われます:

  • Up/Down - エントリの選択
  • Enter - 選択したエントリの起動
  • d - (不揮発の EFI 変数に保存された) デフォルトエントリを選択して起動
  • t/T - (不揮発の EFI 変数に保存された) タイムアウトを調整
  • e - カーネルコマンドラインを編集。editor オプションが 0 に設定されている場合は使えません
  • 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 から保存したファイルを参照してください。

参照