Arch Linux - ブートローダ

ブートローダ
# ブートローダー

「ブートローダ」とは、OS を起動するためのプログラムで、複数の OS や起動設定などから、ユーザーが選択して起動させることもできます。

Linux では、複数のブートローダが存在します。

GRUB が一番多機能で、自動的に設定を行ってくれますが、シンプルに使いたい場合は、他のブートローダを使ってみてください。
systemd-boot
# systemd-boot - ArchWiki

systemd-boot は、systemd に含まれている、シンプルなブートローダです。
※ UEFI のみ対応しています。

Windows がインストールされている場合 (EFI システムパーティションに指定ファイルがある場合)、自動でメニューに表示されるので、Windows とデュアルブートする場合も使いやすいです。
また、メニューから、マザーボードの BIOS 画面を起動することもできます。
インストール
systemd は Arch Linux の基本パッケージに含まれているので、別途必要なパッケージはありません。

まずは、ブートローダの efi ファイルや、設定ファイルなどを、EFI システムパーティションにインストールする必要があります。
systemd に含まれる bootctl コマンドを使います。

EFI システムパーティションは、あらかじめ /boot などにマウントしておく必要があります。
(Arch Linux インストール時には、手動でのマウントと、fstab ファイルでの自動マウント設定を行っているはずです)

以下は、インストール先が /boot であると仮定して説明していますが、他のパスにマウントしている場合は、パスを置き換えてください。

# bootctl --esp-path=/boot install

コマンドを実行すると、指定したパスに、*.efi などが作成されます。
/boot/loader/ ディレクトリには、systemd-boot の設定ファイルなどが置かれます。

--esp-path を省略した場合は、/efi, /boot, /boot/efi の順で、存在するディレクトリが使われます。

また、インストールすると、デフォルトの EFI ブートが systemd-boot に設定されるので、次回起動時には、systemd-boot がブートローダとして実行されます。

更新について
systemd-boot が更新された場合は、インストールしたファイル (*.efi) も更新する必要があります。
基本的には、systemd パッケージが更新された時に行ってください。

ブートローダ自体はスタンドアローンのため、更新せずにそのまま使うことも出来ますが、出来るだけ最新の状態にした方が良いでしょう。

以下のコマンドで、手動で更新できます。
更新先のパスは、--esp-path オプションで指定できます。

# bootctl update
ローダの設定
loader.conf

/boot/loader/loader.conf のファイルで、ローダ自体(主にメニュー画面)の設定を行うことができます。
何も設定しなくても動作はしますが、以下のように記述してください。

default arch
timeout 3
console-mode max
editor no

行頭が # でコメント。
タブ文字は使わないでください。

defaultデフォルトで起動する項目。
/boot/loader/entries/ 内の設定ファイルを指定します。拡張子は指定しなくても可。
timeoutキー操作を行わずに指定秒数が経過すると、デフォルト項目を起動します。
デフォルトで無効 (0)。
console-mode画面モード。

0: 80 x 25
1: 80 x 50
2〜: ファームウェアによって提供されている非標準モード
auto: 自動
max: 一番高い解像度
keep (default): ファームウェアが選択したモードを維持
editorカーネルパラメータの編集を可能にするか。yes or no (default = yes)
init=/bin/bash を指定すると、root パスワードなしに root 権限を取得できてしまうので、no を設定するのが推奨されています。
各ブートの設定ファイル
Boot Loader Specification

ブートする各項目ごとに、設定ファイルを作成する必要があります。
/boot/loader/entries/ ディレクトリ内に、「任意のファイル名+ .conf」で作成します。
Arch Linux 用の項目を作るなら、arch.conf などとしておきます。

※ Linux カーネルに関しては、自動でメニュー項目が作成されることはないので、手動でファイルを作成する必要があります。

# nano /boot/loader/entries/arch.conf

title   Arch Linux
linux   /vmlinuz-linux
#initrd  /intel-ucode.img
#initrd  /amd-ucode.img
initrd  /initramfs-linux.img
options root=/dev/sda2 rw quiet

root=/dev/sda2 の部分は、自分のディスクの状態に合わせて、書き換えてください。
起動したい Linux がインストールされているパーティションを指定します。

intel-ucode.img, amd-ucode.img は、Intel CPU または AMD CPU のマイクロコードを更新する場合に必要ですが、2024/03/04 現在 (mkinitcpio v38)、intel-ucode または amd-ucode パッケージがインストールされた状態であれば、initramfs の生成時に自動でマイクロコードが埋め込まれて、起動時に実行されるので、現状では、これらの行を追加する必要はありません。

設定項目
  • 各1行に、「項目名」「区切りの空白」「値(空白含む)」を指定します。
  • タブ文字は使わないでください。
  • EFI システムパーティション内にあるファイルを指定する場合は、先頭に / を付けて、相対パスで指定します。

titleメニューに表示される項目の名前。必須です。
versiontitle が同じで、異なるバージョンのカーネルを起動したい場合は、バージョン数値などを指定します。
linuxLinux カーネルのプログラムのパス。
Arch Linux の場合は、/vmlinuz-linux
initrdLinux カーネルのブート時に使われるイメージ。
Arch Linux の場合は、/initramfs-linux.img
マイクロコードを更新する場合は、そのファイルを、カーネルよりも前に指定してください。
optionsEFI プログラムに渡すオプション、または、カーネルパラメータ。

Linux の場合は、root= で、起動したい Linux がインストールされている、パーティションのパス(または UUID など)を指定します。

rw は、読み書きが可能という意味です。
quiet は、起動中のメッセージを抑制します。これを削除すると、システムログに出力されるのと同じメッセージが表示されます。

root= でパーティションを指定する際、root=UUID=... と記述すると UUID、root=PARTUUID=... と記述すると PARTUUID で指定できます。
ただし、途中で " " で囲むようなことはしないでください。
メニュー画面
PC 起動時は、systemd-boot のブートメニューが表示されます。
起動したい項目を選択して、Enter で起動します。

Up/Down項目の選択移動
Enter起動
d指定項目を、デフォルトの項目にする
t指定項目のタイムアウトを +1s
T指定項目のタイムアウトを -1s
eカーネルコマンドラインを編集 (有効な場合)
p現在の設定を表示
hキーのヘルプを表示

「Reboot Info Firmware Interface」を選択すると、再起動して、マザーボードの BIOS 画面を起動します。
項目を指定して再起動
systemctl コマンドの reboot を使うと、次回の PC 起動時にブートさせる項目を、あらかじめ指定することができます。
(PC 起動後は、この設定が削除されます)

## マザーボードの BIOS 画面を起動させる
$ systemctl reboot --firmware-setup

## systemd-boot の指定項目を起動させる
$ systemctl reboot --boot-loader-entry=arch
efibootmgr
UEFI のファームウェアでは、各ブート項目の情報が記録されています。
UEFI での PC 起動時は、ここに登録された情報を元に、指定された *.efi を起動して、ブートローダなどのプログラムを実行します。

efibootmgr コマンド (efibootmgr パッケージ) を使って、この情報を変更すると、ブートに関する情報を設定することができます。
efibootmgr パッケージは、別途インストールしてください。
ブートローダのインストール時
UEFI 対応のブートローダがインストールされる時は、以下のような手順で処理が行われます。

  1. EFI システムパーティションに、*.efi のファイルや関連ファイルを作成。
  2. UEFI のファームウェアにブート項目を追加し、そこに自身の *.efi を登録。
  3. 自身のプログラムが一番最初に起動されるように、起動順を変更する。

このため、再インストールも含めて、新しい OS やブートローダをインストールした場合、使用されなくなった古いブート項目が残ってしまう場合があるので、その時は手動で項目を削除します。
一覧の表示
$ efibootmgr -v

BootCurrent: 0004
Timeout: 2 seconds
BootOrder: 0004,0001,0002,0003
Boot0001* UEFI OS    HD(1,GPT,...)/File(\EFI\BOOT\BOOTX64.EFI)..BO
Boot0002* Hard Drive    BBS(HD,,0x0)...
Boot0003  CD/DVD Drive    BBS(CDROM,,0x0)...
Boot0004* Linux Boot Manager    HD(1,GPT,...)/File(\EFI\SYSTEMD\SYSTEMD-BOOTX64.EFI)

BootCurrent現在のデフォルトの起動対象。
BootOrder各項目の起動順。
先頭にあるほど優先順位が高い。
BootXXXX各ブート項目。XXXX の部分が4桁の番号 (16進数)。
横の * は、有効になっている状態を示す。

EFI のファイルパスは、EFI システムパーティションからの相対パスで指定されています。

なお、EFI システムパーティションは FAT32 なので、Windows と同じように、パス区切りがバックスラッシュになっています。
また、ファイル名の大文字小文字は区別されません。
項目の削除
使われなくなった不要な項目がある場合は、削除します。

# efibootmgr --bootnum <4桁番号> --delete-bootnum

-b,--bootnum で、対象のブート項目を、4桁の番号で指定します。
-B,--delete-bootnum で、指定された項目を削除します。
ほか
## 起動順の変更
# efibootmgr --bootorder 0001,0002,0003

## 次回起動時のみ選択する項目
# efibootmgt --bootnext 0001

--bootnext は、次回の PC 起動時にブートさせたい項目を、あらかじめ指定したい時に使います。
設定後に、PC が再起動、またはシャットダウン→起動すると、何もしなくても、指定したブート項目が実行されます。
起動後は、この設定は削除されます。