ブートローダ
# ブートローダー
「ブートローダ」とは、OS を起動するためのプログラムで、複数の OS や起動設定などから、ユーザーが選択して起動させることもできます。
Linux では、複数のブートローダが存在します。
GRUB が一番多機能で、自動的に設定を行ってくれますが、シンプルに使いたい場合は、他のブートローダを使ってみてください。
「ブートローダ」とは、OS を起動するためのプログラムで、複数の OS や起動設定などから、ユーザーが選択して起動させることもできます。
Linux では、複数のブートローダが存在します。
GRUB が一番多機能で、自動的に設定を行ってくれますが、シンプルに使いたい場合は、他のブートローダを使ってみてください。
systemd-boot
# systemd-boot - ArchWiki
systemd-boot は、systemd に含まれている、シンプルなブートローダです。
※ UEFI のみ対応しています。
Windows がインストールされている場合 (EFI システムパーティションに指定ファイルがある場合)、自動でメニューに表示されるので、Windows とデュアルブートする場合も使いやすいです。
また、メニューから、マザーボードの BIOS 画面を起動することもできます。
systemd-boot は、systemd に含まれている、シンプルなブートローダです。
※ UEFI のみ対応しています。
Windows がインストールされている場合 (EFI システムパーティションに指定ファイルがある場合)、自動でメニューに表示されるので、Windows とデュアルブートする場合も使いやすいです。
また、メニューから、マザーボードの BIOS 画面を起動することもできます。
インストール
systemd は Arch Linux の基本パッケージに含まれているので、別途必要なパッケージはありません。
まずは、ブートローダの efi ファイルや、設定ファイルなどを、EFI システムパーティションにインストールする必要があります。
systemd に含まれる bootctl コマンドを使います。
コマンドを実行すると、指定したパスに、*.efi などが作成されます。
/boot/loader/ ディレクトリには、systemd-boot の設定ファイルなどが置かれます。
--esp-path を省略した場合は、/efi, /boot, /boot/efi の順で、存在するディレクトリが使われます。
また、インストールすると、デフォルトの EFI ブートが systemd-boot に設定されるので、次回起動時には、systemd-boot がブートローダとして実行されます。
基本的には、systemd パッケージが更新された時に行ってください。
ブートローダ自体はスタンドアローンのため、更新せずにそのまま使うことも出来ますが、出来るだけ最新の状態にした方が良いでしょう。
以下のコマンドで、手動で更新できます。
更新先のパスは、--esp-path オプションで指定できます。
まずは、ブートローダの efi ファイルや、設定ファイルなどを、EFI システムパーティションにインストールする必要があります。
systemd に含まれる bootctl コマンドを使います。
EFI システムパーティションは、あらかじめ /boot などにマウントしておく必要があります。
(Arch Linux インストール時には、手動でのマウントと、fstab ファイルでの自動マウント設定を行っているはずです)
以下は、インストール先が /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 のファイルで、ローダ自体(主にメニュー画面)の設定を行うことができます。
何も設定しなくても動作はしますが、以下のように記述してください。
行頭が # でコメント。
タブ文字は使わないでください。
/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 カーネルに関しては、自動でメニュー項目が作成されることはないので、手動でファイルを作成する必要があります。
root=/dev/sda2 の部分は、自分のディスクの状態に合わせて、書き換えてください。
起動したい Linux がインストールされているパーティションを指定します。
root= でパーティションを指定する際、root=UUID=... と記述すると UUID、root=PARTUUID=... と記述すると PARTUUID で指定できます。
ただし、途中で " " で囲むようなことはしないでください。
ブートする各項目ごとに、設定ファイルを作成する必要があります。
/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 | メニューに表示される項目の名前。必須です。 |
---|---|
version | title が同じで、異なるバージョンのカーネルを起動したい場合は、バージョン数値などを指定します。 |
linux | Linux カーネルのプログラムのパス。 Arch Linux の場合は、/vmlinuz-linux。 |
initrd | Linux カーネルのブート時に使われるイメージ。 Arch Linux の場合は、/initramfs-linux.img 。 マイクロコードを更新する場合は、そのファイルを、カーネルよりも前に指定してください。 |
options | EFI プログラムに渡すオプション、または、カーネルパラメータ。 Linux の場合は、root= で、起動したい Linux がインストールされている、パーティションのパス(または UUID など)を指定します。 rw は、読み書きが可能という意味です。 quiet は、起動中のメッセージを抑制します。これを削除すると、システムログに出力されるのと同じメッセージが表示されます。 |
root= でパーティションを指定する際、root=UUID=... と記述すると UUID、root=PARTUUID=... と記述すると PARTUUID で指定できます。
ただし、途中で " " で囲むようなことはしないでください。
メニュー画面
PC 起動時は、systemd-boot のブートメニューが表示されます。
起動したい項目を選択して、Enter で起動します。
「Reboot Info Firmware Interface」を選択すると、再起動して、マザーボードの BIOS 画面を起動します。
起動したい項目を選択して、Enter で起動します。
Up/Down | 項目の選択移動 |
---|---|
Enter | 起動 |
d | 指定項目を、デフォルトの項目にする |
t | 指定項目のタイムアウトを +1s |
T | 指定項目のタイムアウトを -1s |
e | カーネルコマンドラインを編集 (有効な場合) |
p | 現在の設定を表示 |
h | キーのヘルプを表示 |
「Reboot Info Firmware Interface」を選択すると、再起動して、マザーボードの BIOS 画面を起動します。
項目を指定して再起動
systemctl コマンドの reboot を使うと、次回の PC 起動時にブートさせる項目を、あらかじめ指定することができます。
(PC 起動後は、この設定が削除されます)
(PC 起動後は、この設定が削除されます)
## マザーボードの BIOS 画面を起動させる $ systemctl reboot --firmware-setup ## systemd-boot の指定項目を起動させる $ systemctl reboot --boot-loader-entry=arch
efibootmgr
UEFI のファームウェアでは、各ブート項目の情報が記録されています。
UEFI での PC 起動時は、ここに登録された情報を元に、指定された *.efi を起動して、ブートローダなどのプログラムを実行します。
efibootmgr コマンド (efibootmgr パッケージ) を使って、この情報を変更すると、ブートに関する情報を設定することができます。
efibootmgr パッケージは、別途インストールしてください。
EFI のファイルパスは、EFI システムパーティションからの相対パスで指定されています。
なお、EFI システムパーティションは FAT32 なので、Windows と同じように、パス区切りがバックスラッシュになっています。
また、ファイル名の大文字小文字は区別されません。
--bootnext は、次回の PC 起動時にブートさせたい項目を、あらかじめ指定したい時に使います。
設定後に、PC が再起動、またはシャットダウン→起動すると、何もしなくても、指定したブート項目が実行されます。
起動後は、この設定は削除されます。
UEFI での PC 起動時は、ここに登録された情報を元に、指定された *.efi を起動して、ブートローダなどのプログラムを実行します。
efibootmgr コマンド (efibootmgr パッケージ) を使って、この情報を変更すると、ブートに関する情報を設定することができます。
efibootmgr パッケージは、別途インストールしてください。
ブートローダのインストール時
UEFI 対応のブートローダがインストールされる時は、以下のような手順で処理が行われます。
このため、再インストールも含めて、新しい OS やブートローダをインストールした場合、使用されなくなった古いブート項目が残ってしまう場合があるので、その時は手動で項目を削除します。
- EFI システムパーティションに、*.efi のファイルや関連ファイルを作成。
- UEFI のファームウェアにブート項目を追加し、そこに自身の *.efi を登録。
- 自身のプログラムが一番最初に起動されるように、起動順を変更する。
このため、再インストールも含めて、新しい 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 と同じように、パス区切りがバックスラッシュになっています。
また、ファイル名の大文字小文字は区別されません。
項目の削除
使われなくなった不要な項目がある場合は、削除します。
-b,--bootnum で、対象のブート項目を、4桁の番号で指定します。
-B,--delete-bootnum で、指定された項目を削除します。
# efibootmgr --bootnum <4桁番号> --delete-bootnum
-b,--bootnum で、対象のブート項目を、4桁の番号で指定します。
-B,--delete-bootnum で、指定された項目を削除します。
ほか
## 起動順の変更 # efibootmgr --bootorder 0001,0002,0003 ## 次回起動時のみ選択する項目 # efibootmgt --bootnext 0001
--bootnext は、次回の PC 起動時にブートさせたい項目を、あらかじめ指定したい時に使います。
設定後に、PC が再起動、またはシャットダウン→起動すると、何もしなくても、指定したブート項目が実行されます。
起動後は、この設定は削除されます。