設定 - ブートローダ
概要
ブートローダとは、コンピュータの起動時にオペレーティングシステム(OS)を読み込み、実行するためのプログラムである。
Linuxには、いくつかのブートローダが存在しており、それぞれ固有の機能と利点を持っている。
Linuxにおいて、一般的に使用されるブートローダを以下に示す。
これらのブートローダは、それぞれの長所と短所を持っており、システムの要件、ファイルシステム、ファームウェアのタイプ(BIOS/UEFI)等、ユーザの好みに応じて選択される。
現在、最も広く使用されているLinuxブートローダはGRUB2であるが、他のブートローダも特定の用途に適している。
- GRUB (GRand Unified Bootloader)
- GRUB2の前身であり、レガシーバージョンと呼ばれることもある。
- 設定ファイルは、/boot/grub/grub.cfgまたは/boot/grub/menu.lstに存在する。
- GRUB2ほど高機能ではないが、より単純な設定で動作する。
- Tow-Boot
- Chromebookや他のARMベースのデバイス用のオープンソースブートローダである。
- U-Bootをベースとしており、ChromeOSデバイス上でLinuxや他のオペレーティングシステムを起動するために使用される。
- ファームウェアの更新や検証、ブートモードの選択等、幅広い機能を提供する。
- Chromebookユーザの間で人気が高まっており、ChromeOSの代替OSを試す際に重要な役割を果たしている。
- U-Boot
- 組み込みシステムやシングルボードコンピュータ用の強力なブートローダである。
- ARMベースのデバイスで広く使用されており、ブートプロセスの制御と設定に使用される。
- ネットワークブート、RAMディスクのロード、ファームウェアの更新等、多様な機能を提供する。
- 高度にカスタマイズ可能で、組み込み環境での柔軟性を提供する。
- RedBoot
- 主にARMベースの組み込みシステム用のブートローダである。
- eCosオペレーティングシステムと緊密に統合されており、eCosの開発とデバッグに使用される。
- フラッシュメモリの管理、ネットワークブート、デバッグ機能等、幅広い機能を提供する。
- 組み込みシステムの開発者にとって重要なツールの1つである。
- Barebox
- U-Bootから派生した組み込みシステム用のブートローダである。
- ARMやPowerPC、MIPSなど、さまざまなアーキテクチャをサポートしている。
- デバイスツリーのサポート、ネットワークブート、ファームウェアの更新など、多くの機能を提供する。
- 設定や拡張が容易で、組み込みLinuxの開発に適している。
- AT91Bootstrap (※)
- Microchip (旧Atmel) のAT91シリーズARM SoCを対象とした小型のブートローダである。
- メモリの初期化、クロックの設定、U-Boot等の他のブートローダの起動を行う。
- シンプルで軽量であり、AT91シリーズのSoCを使用する組み込みシステムに適している。
- Coreboot (※)
- オープンソースのファームウェアプロジェクトであり、主にx86ベースのシステムをサポートしている。
- BIOS/UEFIの代替として使用され、高速起動とセキュリティ機能を提供する。
- ペイロードと呼ばれるブートローダ (U-Boot等) を起動することができる。
- Chromebook等の一部の組み込みデバイスでも使用されている。
- Kexecboot
- Linuxカーネルのkexec機能を利用したブートローダである。
- 稼働中のカーネルから直接新しいカーネルを起動することができ、高速な再起動が可能である。
- 設定が簡単であり、組み込みシステムでの迅速なカーネル切り替えに適している。
- LILO (LInux LOader)
- Linuxの初期のブートローダの1つで、古いシステムではまだ使用されている。
- 設定ファイルは、/etc/liloに存在する。
- カーネルイメージやinitrdを直接読み込むことができる。
- ブートセクタに直接書き込むため、設定変更後は常にブートセクタを更新する必要がある。
- Syslinux
- FAT、ext2、ext3、ext4等のファイルシステムをサポートしている。
- ISOLINUXを使用して、ブート可能なCDやDVDを作成するために広く使用されている。
- PXELINUXを使用して、ネットワーク経由でブートすることもできる。
- systemd-boot (旧名: gummiboot)
- UEFIシステム用の単純なブートマネージャーである。
- 設定ファイルは、/boot/loader/entries/ディレクトリ内の.confファイルである。
- シンプルでミニマルな設計が特徴で、高速な起動が可能である。
- rEFInd
- UEFIシステム用のブートマネージャーであり、グラフィカルなユーザーインターフェースを提供する。
- Linux、MacOS、Windows等の複数のOSを検出して、ブートメニューに自動的に追加する。
- テーマやアイコンのカスタマイズが可能であり、視覚的に魅力的なブート環境を提供する。
※注意
AT91BootstrapやCorebootは、ブートプロセスの初期段階を担当するブートローダ (ファームウェア) である。
これらは、ハードウェアの初期化、メモリの設定、クロックの設定等の低レベルのタスクを処理する。
一方、U-Boot等のブートローダは、より高レベルの機能を提供する。
これには、カーネルのロード、ブートパラメータの渡し、ファイルシステムの読み込み等が含まれている。
したがって、AT91BootstrapやCorebootを使用する場合、一般的には以下に示すようなブートプロセスを行う。
- まず、AT91Bootstrap / Corebootが、ハードウェアの初期化と低レベルの設定を行う。
- 次に、AT91Bootstrap / Corebootが、U-Boot等の高レベルのブートローダをロードして実行する。
- AT91Bootstrap / Corebootにより実行されたU-Bootが、カーネルのロード、ブートパラメータの渡し、ルートファイルシステムのマウント等を行う。
- U-Bootがカーネルを起動して、システムが立ち上がる。
このように、AT91BootstrapやCorebootは、U-Boot等のブートローダと組み合わせて使用されることが一般的である。
これにより、ブートプロセスを段階的に行うことができ、それぞれのブートローダがその得意とする部分を担当することができる。
GRUB2
GRUB2 (GRand Unified Bootloader version 2) は、Linuxシステムで広く使用されているブートローダである。
GRUB2は、Linuxシステムにおいて重要な役割を果たしており、ブートプロセスをカスタマイズや複数のOSを管理するための強力で柔軟なツールである。
GRUB2の主な役割と概念は以下の通りである。
- ブートプロセスの制御
- GRUB2は、BIOS/UEFIにより最初に読み込まれて、OSを起動するためのブートプロセスを制御する。
- ブートメニューの提供
- GRUB2は、インストールされている複数のOSをリストアップしたブートメニューを表示する。
- ユーザは、このメニューからブートするOSを選択できる。
- 設定ファイル
- GRUB2の設定は、主に/etc/default/grubファイルと/etc/grub.d/ディレクトリ内のファイルで定義される。
- これらのファイルは、ブートメニューのエントリ、デフォルトのOS、タイムアウト等を制御する。
- モジュラー設計
- GRUB2は、モジュール式の設計を採用している。
- これにより、必要な機能を動的に読み込むことができ、柔軟性と拡張性が向上する。
- 複数のファイルシステムとOSのサポート
- GRUB2は、ext4、btrfs、NTFS、FAT等、様々なファイルシステムをサポートしている。
- また、Linux、Windows、MacOS等、複数のOSをブートすることができる。
- コマンドラインインターフェース
- GRUB2は、ブートメニューで[C]キーを押下することにより、アクセスできるコマンドラインインターフェースを提供する。
- このインターフェースを使用して、ブートパラメータの編集やカスタムブートエントリの追加等を行うことができる。
- 復旧機能
- GRUB2は、システムが起動しない場合に備えて、復旧モードを提供する。
- これにより、ユーザはシステムを修復するためのオプションにアクセスできる。
GRUB2のブートエントリ
Linuxのブートエントリ
デュアルブートをしている場合、WindowsのアップデートによりLinuxのGRUB2ブートローダが表示されない場合がある。
この時、以下に示す手順を行うことにより、GRUB2のブートメニューのエントリを復旧することができる。
方法 1 : chrootの使用
各LinuxディストリビューションのライブUSBを準備する。
ライブUSBからLinuxを起動する。
ターミナルを開いて、既存のLinuxのインストール先パーティションをマウントする。
※Xは、既存のLinuxがインストールされているストレージ番号を指定する。 ※Yは、既存のLinuxがインストールされているGRUB2ブートローダのパーティション番号を指定する。 sudo mount /dev/sdXY /mnt
必要なディレクトリをバインドマウントする。
for i in /sys /proc /run /dev; do sudo mount --bind "$i" "/mnt$i"; done
chroot環境に入る。
sudo chroot /mnt
GRUB2を再インストールする。
※Xは、既存のLinuxがインストールされているストレージ番号を指定する。 grub-install /dev/sdX # または grub2-install /dev/sdX
GRUB2を更新する。
update-grub
chroot環境を終了する。
exit
マウントを解除する。
sudo umount /mnt/sys /mnt/proc /mnt/run /mnt/dev /mnt
PCを再起動して、GRUB2のブートメニューが表示されるかどうかを確認する。
方法 2 : efibootmgrの使用
各LinuxディストリビューションのライブUSBを準備する。
ライブUSBからLinuxを起動する。
現在のブートエントリを確認して、現在の/boot/EFIディレクトリに何が登録されているかを確認する。
例えば、"sles"は存在しているが、"sles-secureboot"は他のOSにより削除されている等。
sudo efibootmgr -v
/boot/efi/EFIパーティション (Linux EFIパーティション) を確認する。
これは、Type: EFI Systemと表示されている場合が多い。
例えば、NVMe SSDを使用している場合は、/dev/nvme0n1p1 (NVMe SSDの1番目のパーティション) 等と表示される。
sudo fdisk -l # 例: デバイス 開始位置 終了位置 セクタ サイズ タイプ /dev/nvme0n1p1 2048 1050623 1048576 512M EFI システム /dev/nvme0n1p2 1050624 934641663 933591040 445.2G Linux ファイルシステム /dev/nvme0n1p3 934641664 1000215182 65573519 31.3G Linux スワップ
UEFIブートエントリを復元する。
ストレージ (-dオプション) および パーティション (-pオプション) を付加する。
※注意
32bit OSの場合は、ブートローダファイルはGRUB.EFIというX64が除外されたファイル名となる。
sudo efibootmgr -c -w \ -L <ブートディレクトリ名> \ -d <パーティション名> \ -l <ブートローダファイル> # 例 1: SUSE Linux Enterpriseにおいて、セキュアブートが有効の場合 sudo efibootmgr -c -w \ -L sles-secureboot \ -d /dev/nvme0n1 -p 1 \ -l /EFI/SLES/SHIM.EFI # 例 2: SUSE Linux Enterpriseにおいて、セキュアブートが無効の場合 sudo efibootmgr -c -w \ -L sles \ -d /dev/sda1 \ -l "<例: 64bitの場合 : /EFI/SLES/GRUBX64.EFI, 32bitの場合 : /EFI/SLES/GRUB.EFI>"
システムの再起動後に、現在のブートエントリを確認する。
sudo efibootmgr -v
これにより、UEFIファームウェアはLinuxシステムを見つけることができる。
Winodwsのブートエントリ
デュアルブートをしている場合、Linuxのインストール・アップデートにより、Winodwsのブートメニューが表示されない場合がある。
この時、以下に示す手順を行うことにより、GRUB2のブートメニューのエントリを復旧することができる。
まず、WinodwsのEFIシステムパーティションを確認する。
sudo fdisk -l
※注意
os-proberパッケージを使用してWindowsを自動的に検出できる場合もある。
その場合は、/etc/default/grubファイル内のGRUB_DISABLE_OS_PROBER
オプションの値をfalse
を設定して、grub2-mkconfigコマンドを実行する。
これにより、Windowsのブートエントリが自動的に追加される可能性がある。
# RHEL sudo dnf install os-prober # SUSE sudo zypper install os-prober
次に、Windowsのブートエントリを追加するため、GRUB2の設定ファイルを編集する。
sudo vi /etc/grub.d/40_custom
# /etc/grub.d/40_customファイル menuentry "Windows User Add" { insmod part_gpt insmod ntfs # (hd0,gpt1) は、WindowsのEFIシステムパーティションの位置を示している # gpt1 : /dev/sdX1パーティションにWindowsのブートパーティションが存在する場合 # gpt2 : /dev/sdX2パーティションにWindowsのブートパーティションが存在する場合 set root='(hd0,gpt1)' chainloader +1 }
GRUB2を更新する。
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
エラー関連
Fix Minimal BASH like line editing is supported GRUB Error
LinuxとWindowsとデュアルブートでインストールする場合、再起動時に以下に示すようなGRUBエラーが出力される場合がある。
Minimal BASH like line editing is supported. For the first word, TAB lists possible command completions. anywhere else TAB lists possible device or file completions.
これは、RHEL、SUSE、Debian GNU/Linux等の全てのLinuxディストリビューションで発生する可能性のある一般的なGRUBエラーである。
また、頻繁に発生する同様の問題である"error: no such partition grub rescue"エラーを修正する場合も、以下に示す手順で解決することができる。
この問題を解決するには、以下に示すものが必要である。
- 同じLinuxディストリビューションのライブUSB
- ライブセッションでのインターネット接続
まず、ライブLinux USBを起動する。
次に、LinuxがUEFIあるいはBIOSを使用しているかどうかを確認する。
[Type:]に[EFI System]との記述がある場合は、LinuxがUEFIを使用していることを意味する。
sudo fdisk -l
GRUBを再インストールする。
- UEFIを使用している場合
- まず、ルートパーティション (/) をマウントする。
sudo mount /dev/sdXY /mnt
- 次に、ブートパーティション (UEFI) をマウントする。
sudo mount /dev/sdXZ /mnt/boot/efi
- 最後に、GRUB (UEFI) をインストールする。
bootloader-id
オプションにおいて、/boot/efi/EFIディレクトリにあるディレクトリ名を確認することにより、現在使用しているbootloader-idを知ることができる。--bootloader-id
オプションは任意の値を設定できるため、システム管理者が別の値を選択している可能性もある。- --bootloader-idオプションのデフォルト値
- RHELの場合: redhat
- SLEの場合: sles / sled
- Ubuntuの場合: ubuntu
sudo grub-install --boot-directory=/mnt/boot --bootloader-id=<ID名> --target=x86_64-efi --efi-directory=/mnt/boot/efi
- PCを再起動する。
- まず、ルートパーティション (/) をマウントする。
- BIOSを使用している場合
- まず、ルートパーティション (/) をマウントする。
BIOSでは、ブートパーティション (BIOS) も同時にマウントされる。sudo mount /dev/sdXY /mnt
- 最後に、GRUB (BIOS) をインストールする。
sudo grub-install /dev/sdX
- PCを再起動する。
- まず、ルートパーティション (/) をマウントする。