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-boot 単体でのバージョン情報は存在しないので、基本的には、systemd パッケージが更新された時に行うことになります。

ブートローダ自体はスタンドアローンのため、更新せずに使うことも出来ますが、bootctl コマンドで操作する時のバージョン関係を考えると、なるべく systemd のバージョンと合わせたほうがいいかもしれません。

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

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

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

default arch
timeout 5
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

OS を起動させるためには、それぞれのメニュー項目用に、設定ファイルを作成する必要があります。
/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

  • 1行に、「項目名」「区切りの空白」「値(空白含む)」を指定します。
  • intel-ucode.img, amd-ucode.img は、Intel CPU または AMD CPU のマイクロコードを更新する場合に必要です。
    intel-ucode または amd-ucode パッケージをインストールすると、/boot にイメージファイルが作成されます。
    必要であれば、先頭の # を削除して有効にしてください。
  • EFI システムパーティション (/boot) 内のファイルを指定する場合は、先頭に / を付けて、相対パスで指定します。

titleメニューに表示される項目の名前。必須です。
version同じタイトル (OS) で、異なるカーネルを起動したい場合は、カーネルのバージョン数値などを指定します。
linuxLinux カーネルのプログラムのパス。
Arch Linux では /vmlinuz-linux
initrdLinux カーネルのブート時に使われるイメージ。
Arch Linux では /initramfs-linux.img
マイクロコードを更新する場合は、そのファイルを、initramfs よりも前に指定してください。
optionsEFI プログラムに渡すオプション、または、カーネルパラメータ。
Linux の場合は、root= で、起動したい Linux がインストールされているパーティションのパス(または UUID など)を指定します。
rw は、読み書きが可能という意味です。
quiet は、起動中のメッセージを抑制します。これを削除すると、システムログに出力されるのと同じメッセージが表示されます。

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

root=UUID=... で UUID、root=PARTUUID=... で PARTUUID を指定できます。
この時、" " は付けないでください。
メニュー画面
起動時は、systemd-boot のブートメニューが表示されます。
メニュー項目だけが表示されるので、起動したい項目を選択して、Enter で起動します。

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

「Reboot Info Firmware Interface」を選択すると、再起動して、マザーボードの BIOS 画面を起動します。
項目を指定して再起動
systemctl コマンドの reboot を使うと、ブートローダで選択する項目をあらかじめ指定した上で、再起動できます。

## マザーボードの BIOS 画面
$ systemctl reboot --firmware-setup

## /boot/loader/entries/arch.conf の場合
$ systemctl reboot --boot-loader-entry=arch
efibootmgr
UEFI のファームウェアでは、各 EFI のブート項目の情報(名前、*.efi ファイルの場所など)や、起動順などを設定することができます。
UEFI での PC 起動時は、ここに登録された情報から、*.efi を起動して、そのブートローダなどを起動します。

efibootmgr コマンド (efibootmgr パッケージ) を使うと、その UEFI のブート情報を管理することができます。
efibootmgr パッケージは、別途インストールしてください。

ブートローダが自身をインストールする時は、まず、EFI システムパーティションに *.efi などのファイルをインストールした後、UEFI のファームウェアにブート項目を追加し、そこに自身の *.efi を登録して、一番最初に起動されるように、起動順を変更します。

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

BootCurrent: 0004
Timeout: 2 seconds
BootOrder: 0004,0001,0002,0003
Boot0001* UEFI OS    HD(1,GPT,4940b94b-f031-4044-bd82-268076be16cc,0x800,0x100000)/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,4940b94b-f031-4044-bd82-268076be16cc,0x800,0x100000)/File(\EFI\SYSTEMD\SYSTEMD-BOOTX64.EFI)

BootCurrent現在の起動対象
BootOrder起動順。番号が順番に並んでいる。
BootXXXX各ブート項目。
XXXX の部分が番号(16進数)。
横の * は、有効になっている状態。

EFI のファイルパスは、EFI システムパーティションからの相対パスで指定されています。
項目の削除
不要な項目がある場合は、削除します。

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

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

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

--bootnext は、再起動時など、一時的にブートする項目を選択したい時に使います。
実際にブートされた後は、この設定は削除されます。