設定 - ブートローダ

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

ブートローダとは、コンピュータの起動時にオペレーティングシステム(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を使用する場合、一般的には以下に示すようなブートプロセスを行う。

  1. まず、AT91Bootstrap / Corebootが、ハードウェアの初期化と低レベルの設定を行う。
  2. 次に、AT91Bootstrap / Corebootが、U-Boot等の高レベルのブートローダをロードして実行する。
  3. AT91Bootstrap / Corebootにより実行されたU-Bootが、カーネルのロード、ブートパラメータの渡し、ルートファイルシステムのマウント等を行う。
  4. 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を使用している場合
    1. まず、ルートパーティション (/) をマウントする。
      sudo mount /dev/sdXY /mnt
    2. 次に、ブートパーティション (UEFI) をマウントする。
      sudo mount /dev/sdXZ /mnt/boot/efi
    3. 最後に、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
    4. PCを再起動する。


  • BIOSを使用している場合
    1. まず、ルートパーティション (/) をマウントする。
      BIOSでは、ブートパーティション (BIOS) も同時にマウントされる。
      sudo mount /dev/sdXY /mnt
    2. 最後に、GRUB (BIOS) をインストールする。
      sudo grub-install /dev/sdX
    3. PCを再起動する。