ブートローダーの設定
ブートローダーを選ぶ
これまでLinuxカーネルを設定すると共に、システムツールをインストールし、設定ファイルを修正してきました。そして今、最も重要なLinuxインストールの最後の一片をインストールします。それがブートローダーです。
ブートローダーは、ブート中にLinuxカーネルを起動することに責任を負っています。ブートローダーがないと、システムは電源ボタンが押されたときに、どう事を進めればいいのかわからなくなってしまいます。
amd64 に対して私たちは、 BIOS ベースのシステムについては GRUB または LILO を設定する方法を、UEFI システムについては GRUB または efibootmgr を設定する方法を文書化しています。
このセクションでは、ブートローダーパッケージの "emerge" と、ブートローダーのシステムへの "インストール" という表現を使っています。ここでいう "emerge" とは Portage を使ってソフトウェアパッケージがシステムで利用できるようにすることです。そして "インストール" はブートローダーが必要なファイルをコピーしたりディスク上の特定の領域に変更を加えることで、ブートローダーを有効化し次回起動時に使用可能な状態にすることを指します。
デフォルト: GRUB
デフォルトでは、大半の Gentoo システムが GRUB Legacy の後継である GRUB (sys-boot/grub パッケージで利用できます) を使用しています。GRUB は追加の設定なしに従来の BIOS ("pc") システムで使うことができ、それ以外のプラットフォームでもビルド前のわずかな設定で済みます。詳しくは、GRUB ページの前提条件節をご覧ください。
Emerge
MBR パーティションテーブルのみをサポートする従来の BIOS システムを使う場合、GRUBをインストールするのに追加の設定は必要ありません:
root #
emerge --ask --verbose sys-boot/grub
UEFI ユーザーの方へ: 上記のコマンドを実行すると、現在有効な GRUB_PLATFORMS 値が表示されます。UEFI 対応のシステムでは GRUB_PLATFORMS="efi-64"
が有効になっていることを確認してください (これがデフォルトです) 。もし有効になっていなければ、GRUB パッケージを EFI の機能付きでビルドするために、 GRUB を emerge する前に /etc/portage/make.conf にGRUB_PLATFORMS="efi-64"
を追加しなければなりません。
root #
echo 'GRUB_PLATFORMS="efi-64"' >> /etc/portage/make.conf
root #
emerge --ask sys-boot/grub
- なんらかの経緯で
GRUB_PLATFORMS="efi-64"
を有効にしていない状態で GRUB が emerge されてしまった場合は、この行を make.conf に追加して、 emerge に--update --newuse
オプションを渡せば、 world パッケージセット の依存関係を再計算することができます:
root #
emerge --ask --update --newuse --verbose sys-boot/grub
これで GRUB ソフトウェアがシステムに emerge されましたが、インストールが終わったわけではありません。
インストール
つぎに、 grub-install コマンドを使って、必要な GRUB ファイルを /boot/grub/ ディレクトリにインストールします。もし(システムがブートする)一番目のディスクにインストールするなら、 /dev/sda ですので、以下のどちらかのコマンドでインストールすることができます:
- BIOS を利用する場合:
root #
grub-install /dev/sda
- UEFI を利用する場合:
- 重要
grub-install を実行する前に EFI システムパーティションがマウントされているか必ず確認してください。 grub-install が GRUB EFI ファイル (grubx64.efi) を間違ったディレクトリにインストールしてしまい、しかも間違ったディレクトリが使われた形跡をまったく残さないということが起こりえます。
root #
grub-install --target=x86_64-efi --efi-directory=/boot
- メモ
--efi-directory
オプションは、 EFI システムパーティションのルートに変更してください。これは /boot パーティションが FAT の亜種でフォーマットされていない場合、必須です。
- 重要
grub-install がCould not prepare Boot variable: Read-only file system
といったエラーを返した場合、コマンドを成功させるためには efivars という特別なマウントを読み書き可能な状態で再マウントする必要があるかもしれません:root #
mount -o remount,rw,nosuid,nodev,noexec --types efivarfs efivarfs /sys/firmware/efi/efivars
いくつかのマザーボードメーカーは、EFI システムパーティション (ESP) 内の .EFI ファイルの場所として /efi/boot/ ディレクトリのみをサポートしているようです。GRUB のインストーラーは --removable
オプションを付けることでこの操作を自動的に行うことができます。以下のコマンドを実行する前に ESP がマウントされていることを確認してください。ESP が (以前お勧めしたとおり) /boot にマウントされているとすると、以下を実行します:
root #
grub-install --target=x86_64-efi --efi-directory=/boot --removable
このコマンドは UEFI 仕様で定義されているデフォルトディレクトリーを作成し、また grubx64.efi ファイルを同じ仕様で定義されている'デフォルト'の EFI ファイルの場所にコピーします。
設定
次に、/etc/default/grub ファイルと /etc/grub.d スクリプトで指定されたユーザ固有の設定をもとに、GRUB 設定ファイルを生成します。GRUB はどのカーネルを起動するか(/boot/ 内で利用可能な最上位のもの)、どれがルートファイルシステムかを自動で検出してくれるので、ほとんどの場合、ユーザによる設定の必要はありません。カーネルパラメータは /etc/default/grub の GRUB_CMDLINE_LINUX 変数で指定することができます。
最終的な GRUB の設定ファイルを生成するには、 grub-mkconfig コマンドを実行します:
root #
grub-mkconfig -o /boot/grub/grub.cfg
Generating grub.cfg ... Found linux image: /boot/vmlinuz-6.1.38-gentoo Found initrd image: /boot/initramfs-genkernel-amd64-6.1.38-gentoo done
このコマンドの出力を見て、ブートに必要な Linux イメージが見つかったという報告が少なくともひとつあることを確認してください。もし initramfs を使っているか genkernel でカーネルをビルドしている場合は、正しい initrd イメージが認識されていることも確認してください。もし確認できなかった場合、/boot/ にそれらのファイルが存在するかどうか ls コマンドで確かめてください。必要なファイルが存在していなければ、カーネルの設定とインストールをやり直さなければなりません。
接続されたドライブからほかのOSを検出するために、os-prober ユーティリティを使うこともできます。Windows 7、8.1、10、あるいはほかの Linux ディストリビューションが検出できるようになります。このようなデュアルブート環境を作るには、sys-boot/os-prober パッケージをインストールしてから grub-mkconfig コマンドを再実行するとよいでしょう。検出がうまくいかない時は、Gentoo コミュニティに助けを求める前に GRUB 記事をよく読み直してみてください。
代替案1: LILO
Emerge
LILO (the LInuxLOader) は検証済みで、かつとても有用なLinuxのブートローダーです。しかしながら、GRUB と比べるといくつかの機能を欠いています。いくつかのシステムでは LILO は動作するものの GRUB は動作しないため、 LILO が今でも使われています。もちろん、 LILO をよく知っており使い続けたいと思っている人々もこれを使っています。どちらにしても、Gentoo は両方のブートローダーをサポートしています。
LILO のインストールは簡単です; emerge を使います。
root #
emerge --ask sys-boot/lilo
設定
LILO の設定をするにはまず、/etc/lilo.conf を作成します:
root #
nano -w /etc/lilo.conf
設定ファイルではブートできるカーネルを参照するためにセクションを使用しています。この設定ファイルで入力する必要があるので、カーネルファイル (カーネルバージョンも含む) や initramfs ファイルを確認しておいてください。
ルートファイルシステムが JFS の場合には読み書き可能なマウントの前にログをリプレイする必要があるため、
append="ro"
という行を各ブート項目の後に書き加えてください。/etc/lilo.conf
LILO の設定例boot=/dev/sda # MBRにLILOをインストールする
prompt # ユーザに他のセクションを選択させる機会を与える
timeout=50 # デフォルトのセクションを起動する前に5秒間待つ
default=gentoo # タイムアウトに達した場合、"gentoo"セクションを起動する
compact # これは劇的にロード時間を減らし、マップファイルをより小さくし続ける。いくつかのシステムでは失敗する場合がある。
image=/boot/vmlinuz-6.1.38-gentoo
label=gentoo # このセクションの名前
read-only # ルートを読み込み専用で始める。変えないこと!
root=/dev/sda3 # ルートファイルシステムの場所
image=/boot/vmlinuz-6.1.38-gentoo
label=gentoo.rescue # このセクションの名前
read-only # ルートを読み込み専用で始める。変えないこと!
root=/dev/sda3 # ルートファイルシステムの場所
append="init=/bin/bb" # Gentooの静的レスキューシェルを起動する
# 次の2行はWindowsとのデュアルブートのための行です。
# この例では、Windowsは/dev/sda6に格納されているとします。
other=/dev/sda6
label=windows
異なるパーティション構成やカーネルイメージを使用している場合はそれに応じて調整してください。
initramfs が必要な場合、設定を変更してその initramfs ファイルを参照し、また initramfs に root デバイスの場所を渡すようにします:
/etc/lilo.conf
ブートエントリーに initramfs の情報を加えるimage=/boot/vmlinuz-6.1.38-gentoo
label=gentoo
read-only
append="root=/dev/sda3"
initrd=/boot/initramfs-genkernel-amd64-6.1.38-gentoo
追加のオプションをカーネルに渡す必要がある場合には append
文を使います。たとえばフレームバッファーを有効化するために video
文を追加するには:
/etc/lilo.conf
ブートオプションに video パラメータを追加するimage=/boot/vmlinuz-6.1.38-gentoo
label=gentoo
read-only
root=/dev/sda3
append="video=uvesafb:mtrr,ywrap,1024x768-32@85"
genkernel を使用したユーザーは、そのカーネルがインストール CD に使われたのと同じブートオプションを使用することを知っておいてください。たとえば SCSI デバイスのサポートを有効化する必要がある時は doscsi
をカーネルオプションとして追加します。
それではファイルを保存して終了します。
インストール
仕上げに実行ファイル /sbin/lilo を起動して、LILO に /etc/lilo.conf の設定をシステムへ適用させます (つまり、自身をディスクにインストールさせます)。新しいカーネルをインストールしたりカーネルのファイル名が変更された際には、システムをブートさせるために lilo.conf ファイルに変更を加えるたびに /sbin/lilo を実行しなければならないことを覚えておいてください。
root #
/sbin/lilo
代替案2: efibootmgr
UEFI ベースのシステムでは、システムの UEFI ファームウェア (言い換えると最初のブートローダー) を直接操作して UEFI ブートエントリーを見つけ出すことができます。こうしたシステムでは GRUB のようなシステムのブートを補助する追加の (あるいは第二の) ブートローダーは必要ありません。それでも GRUB といった EFI ベースのブートローダーが存在しているのは、UEFI システムのブートプロセスにおける機能を拡張するためです。efibootmgr は、システムのブートについて最小限 (かつ厳格) なアプローチをとるユーザーにまさに適しています; ユーザーの多くにとっては (前に見た) GRUB を使用する方が簡単です。なぜなら GRUB は UEFI システムをブートする際に柔軟なアプローチを提供するからです。
sys-boot/efibootmgr アプリケーションはブートローダーではないということを覚えておいてください; これはインストール済みの Linux カーネルを(必要であれば)追加のオプションとともにブートさせたり複数のブートエントリーを使用したりできるように UEFI ファームウェアと対話して設定を更新するためのツールです。この対話は EFI 変数を介して行われます (したがって、EFI 変数のカーネルサポートが必要です)。
続ける前に EFI stub kernel の記事を必ず読んでください。カーネルをシステムの UEFI ファームウェアから直接ブートできるようにするには、特有のオプションを有効化しなければなりません。カーネルの再コンパイルが必要になる場合があります。また、efibootmgr の記事を見てみるのも良い考えです。
繰り返しますが、efibootmgr は UEFI システムのブートにおいて必須ではありません。Linux カーネルはそれ自体直接ブートさせることができ、また追加のカーネルコマンドラインオプションも Linux カーネルの中に組み込むことができます(ユーザーがブートパラメーターをコマンドラインオプションとして指定できる、CONFIG_CMDLINE というカーネルの設定オプションがあります)。initramfs でさえも、カーネルの中に'組み込む'ことができます。
この方法を選んだら、まず efibootmgr をインストールします。
root #
emerge --ask sys-boot/efibootmgr
そして /boot/efi/boot/ を作成してカーネルをその中に grubx64.efi という名前でコピーします:
root #
mkdir -p /boot/efi/boot
root #
cp /boot/vmlinuz-* /boot/efi/boot/grubx64.efi
つぎに、"Gentoo" という名称のブートエントリーが作成され、これは新規にコンパイルされたEFIスタブカーネルをブートするものであることを、UEFI ファームウェアに知らせます:
root #
efibootmgr --create --disk /dev/sda --part 2 --label "Gentoo" --loader "\efi\boot\grubx64.efi"
イニシャルRAMファイルシステム (initramfs)を用いるときには、適切なブートオプションを加えてください:
root #
efibootmgr -c -d /dev/sda -p 2 -L "Gentoo" -l "\efi\boot\grubx64.efi" initrd='\initramfs-genkernel-amd64-6.1.38-gentoo'
UEFI の定義には、ディレクトリーのセパレーターには \ を用いなければなりません。
これらの変更が完了したら、システムを再起動後から、"Gentoo" という名称のブートエントリーが利用可能になります。
代替案3: Syslinux
Syslinux は amd64 アーキテクチャ用のもう一つの代替ブートローダーです。MBR をサポートしており、バージョン 6.00 からは EFI ブートもサポートしています。また、PXE (ネットワーク) ブートやあまり知られていないオプションもサポートします。Syslinux は多くの人々に人気のあるブートローダーですが、このハンドブックではサポートしていません。このブートローダーの emerge やインストールに関する情報は Syslinux の記事で得ることができます。
システムのリブート
chroot環境を出て、全てのパーティションをアンマウントします。次に、最終かつ真のテストを実行するためのマジカルコマンドrebootを入力しましょう。
root #
exit
cdimage ~#
cd
cdimage ~#
umount -l /mnt/gentoo/dev{/shm,/pts,}
cdimage ~#
umount -R /mnt/gentoo
cdimage ~#
reboot
もちろん、ブートCDを取り出しておいてください。そうしないと新しいGentooではなく、再度CDをブートしてしまいます。
新規にインストールされた Gentoo をリブートした後は、最終章インストールの締めくくりに進みましょう。