GRUB

提供: ArchWiki
2023年11月16日 (木) 23:15時点におけるAshMyzk (トーク | 投稿記録)による版 (リンクを修正)
ナビゲーションに移動 検索に移動

関連記事

GRUB (GRand Unified Bootloader) はブートローダーです。現在の GRUB は GRUB 2 とも呼ばれています。元の GRUB (GRUB Legacy) はバージョン 0.9x に対応しています。このページでは GRUB 2 についてのみ説明します。

ノート: この記事全体で、espEFI システムパーティション (別名 ESP) のマウントポイントを表します。

目次

サポートされているファイルシステム

GRUB には複数のファイルシステム (特に重要なものとしては FAT32ext4BtrfsXFS) に対する独自のサポートがあります。注意事項に関しては #サポートのないファイルシステム 章を見てください。

警告: ファイルシステムには、GRUB がまだ対応していない新しい機能が導入されることがあります。その場合、GRUB と互換性の無い機能を無効化しない限り、そのファイルシステムを /boot に対して使用するべきではありません。この問題は、/boot パーティションを別に分けて、FAT32 などの広くサポートされているファイルシステムを使用することで、回避することができます。

UEFI システム

ノート:
  • 次のページを読んで理解しておくことをおすすめします: Unified Extensible Firmware Interfaceパーティショニング#GUID Partition TableArch ブートプロセス#UEFI_2
  • UEFI を使うようにインストールする場合、Arch のインストールメディアを UEFI モードで起動することが重要です。さもないと、efibootmgr が GRUB の UEFI ブートエントリを追加できません。フォールバックブートパスへのインストールは NVRAM を使用しないため、BIOS モードでも可能です。
  • UEFI を使用してディスクから起動するには EFI システムパーティションが必要です。EFI システムパーティション#既存のパーティションの確認 に従って、すでに EFI システムパーティションが存在するかどうかを確認してください。存在しない場合は作成する必要があります。
  • この記事全体で、insmod を使って追加の GRUB2 モジュールを挿入可能であると仮定しています。#Shim-lock で議論されているように、これはセキュアブートが有効化されている UEFI システムには当てはまりません。セキュアブートシステム上で標準の GRUB EFI ファイル grubx64.efi に含まれていない追加の GRUB モジュールを使用したい場合は、grub-mkstandalone を使って追加の GRUB モジュールを含めた GRUB EFI grubx64.efi を再生成しなければなりません。

インストール

ノート:
  • UEFI の実装はマザーボード製造者ごとに異なっています。以下で説明されている手順は広い範囲の UEFI システムで動作するように意図されています。しかし、この方法を適用しているにも関わらず問題が発生する場合は、あなたのハードウェア固有のケースにおける詳細な情報を (可能であれば解決策も) 共有することが推奨されます。そのようなケースのために GRUB/EFI サンプル の記事が提供されています。
  • このセクションでは、あなたが x64 (64 ビット) UEFI のシステムに対して GRUB をインストールしようとしていると仮定します。IA32 (32 ビット) UEFI の場合は (32 ビット CPU と混同しないでください)、適切な場所で x86_64-efii386-efi に置き換えてください。Unified Extensible Firmware Interface#UEFI ファームウェアのビット数を調べる の手順を見て、UEFI のビット数を調べてください。
警告: grub 2:2.06.r566.g857af0e17-1 から、IA32 UEFI (ターゲット i386-efi) でのブートが壊れています。FS#79098 を参照してください。

まず、grubefibootmgrインストールしてください。GRUB はブートローダである一方、efibootmgr はブートエントリを NVRAM に書き込むために GRUB のインストールスクリプトによって使用されます。

そして、以下の手順に従って GRUB をディスクにインストールしてください:

  1. EFI システムパーティションをマウントしてください。そして、このセクションの後の部分で出てくる esp という記述をそのマウントポイントに置き換えてください。
  2. ブートローダの識別子を選んでください、ここでは仮に GRUB としましょう。esp/EFI/ にあなたが選んだものと同じ名前のディレクトリが作成され、そこに EFI バイナリが格納されます。その名前が UEFI ブートメニューの GRUB ブートエントリの名前になります。
  3. 以下のコマンドを実行して、GRUB EFI アプリケーション grubx64.efiesp/EFI/GRUB/ に、モジュールを /boot/grub/x86_64-efi/ にインストールしてください。
ノート:
  • GRUB をブートローダとしてインストールするシステム内でパッケージをインストールし、grub-install を実行してください。つまり、ライブインストール環境から起動している場合、grub-install は (インストール先の) chroot 環境の中で実行する必要があるということです。何らかの理由で、インストールされたシステムの外で grub-install を実行する必要がある場合、マウントした /boot ディレクトリへのパスを --boot-directory= オプションに渡してください。例: --boot-directory=/mnt/boot
  • 一部のマザーボードは、空白を含む bootloader-id を扱うことができません。
# grub-install --target=x86_64-efi --efi-directory=esp --bootloader-id=GRUB

上記のインストール作業が完了した後、メインの GRUB ディレクトリが /boot/grub/ に作成されています。別の場所を指定する方法については GRUB/ヒントとテクニック#代替インストール方法 を見てください。grub-installファームウェアのブートマネージャにもエントリを作成しようとすることに注意してください。その名前は上記の例では GRUB となります。しかし、ブートエントリが埋まっていると、これは失敗します。この場合は efibootmgr を使って必要ないエントリを削除してください。

設定を確定したあとにメインの設定ファイルを生成することを忘れないでください。

ヒント: --removable オプションを使うと、GRUB は esp/EFI/BOOT/BOOTX64.EFI にインストールされます (i386-efi ターゲットの場合は esp/EFI/BOOT/BOOTIA32.EFI)。その結果、EFI 変数がリセットされた場合やドライブを他のコンピュータに移した場合でもそのドライブから起動することができるようになります。通常は BIOS を使用する方法と同じようにドライブを選択することで使うことができます。Windows とデュアルブートする場合、Windows は通常そこに EFI 実行ファイルを配置するので注意してください。とはいえ、そのファイルは Windows の UEFI ブートエントリを再生成するためだけに使用されます。Mac 上に GRUB をインストールする場合、このオプションを使用する必要があります。 BIOS アップデートを実行すると、既存の UEFI ブートエントリが削除されるかもしれません。なので、"removable" なブートエントリを有効化しておくと、それをフォールバックとして利用できます。
ノート:
  • --efi-directory--bootloader-id は GRUB UEFI 専用です。--efi-directory は、非推奨となった --root-directory を置き換えます。
  • grub-install コマンドに device_path オプション (例えば /dev/sda) が無いことに気付いたかもしれません。実際、device_path は GRUB EFI インストールスクリプトによって無視されます。UEFI ブートローダーは MBR ブートコードもパーティションブートセクタも全く使用しないのです。

問題が発生した場合は UEFI のトラブルシューティング を見て下さい。加えて GRUB/ヒントとテクニック#UEFI の詳細情報 も参照してください。

セキュアブートサポート

GRUB は、CA 鍵か shim のいずれかを使用するセキュアブートを完全にサポートしています。しかし、インストールのコマンドは、どちらを使用するかによって異なります。

警告:
  • セキュアブートを不適切に設定すると、システムが起動不能になる可能性があります。セキュアブートを有効化した後に何らかの理由により起動できなくなった場合、ファームウェアでセキュアブートを無効化し、システムを再起動する必要があります。
  • ブートローダで不必要なモジュールをロードすると、セキュリティリスクを発生させる可能性があります。これらのコマンドは、必要なときにだけ使用してください。

CA 鍵

CA 鍵を使うには、インストールのコマンドは次のようになります:

# grub-install --target=x86_64-efi --efi-directory=esp --bootloader-id=GRUB --modules="tpm" --disable-shim-lock

Shim-lock

ノート: このセクションに進む前に、セキュアブート#shim に書かれてある指示の通りにし、sbsigntools をセットアップして鍵を受け取る準備を整えておく必要があります。

Shim-lock を使用する場合、GRUB をセキュアブートモードでブートさせるには、vmlinuzinitramfs のイメージが含まれているファイルシステムを読むために必要なモジュール全てが GRUB のバイナリに含まれていなければなりません。

GRUB バージョン 2.06.r261.g2f4430cc0 から、セキュアブートモードで insmod を使ってモジュールをロードすることは許可されなくなりました (任意のコードをサイドロードできてしまう可能性があるからです)。GRUB モジュールが EFI バイナリ内に組み込まれていない場合、GRUB はそれらのモジュールをサイドロード/insmod しようと試み、その結果、以下のようなメッセージにより GRUB の起動が失敗します:

error: prohibited by secure boot policy

Ubuntu の公式ビルドスクリプトによると、Ubuntu では以下の GRUB モジュールが署名済み GRUB EFI バイナリ grubx64.efi に組み込まれています:

  • "基本" モジュール。CD や簡単にパーティショニングされたディスクからブートするために必要: all_videobootbtrfscatchainconfigfileechoefifwsetupefinetext2fatfontgettextgfxmenugfxtermgfxterm_backgroundgziohalthelphfsplusiso9660jpegkeystatusloadenvloopbacklinuxlslsefilsefimmaplsefisystablssalmemdiskminicmdnormalntfspart_applepart_msdospart_gptpassword_pbkdf2pngproberebootregexpsearchsearch_fs_uuidsearch_fs_filesearch_labelsleepsmbiossquash4testtruevideoxfszfszfscryptzfsinfo
  • x84_64-efi アーキテクチャ用の "プラットフォーム固有" のモジュール。例えば:
    • play: ブート中に音を鳴らす
    • cpuid: ブート時に CPU の機能を確認する
    • tpm: Measured Boot / Trusted Platform Modules をサポートする
  • "高度な" モジュール。以下が含まれます:
    • cryptodisk: plain モードで暗号化されたディスクからブートする
    • gcry_アルゴリズム: 特定のハッシュアルゴリズムと暗号化アルゴリズムをサポートする
    • luks: LUKS で暗号化されたディスクからブートする
    • lvm: LVM 論理ボリュームディスクからブートする
    • mdraid09mdraid1xraid5recraid6rec: RAID 仮想ディスクからブートする

GRUB モジュールのリストはシェル変数の形にしなければなりません (ここでは GRUB_MODULES と表記しています)。最新の Ubuntu スクリプトをベースとして使い、あなたのシステムでは不要なモジュールを取り除くという方法を取ることもできます。モジュールを減らすと、ブートプロセスが比較的速くなり、ESP のスペースをいくらか節約できます。

また、セキュリティを高めるために、EFI バイナリにSecure Boot Advanced Targeting (SBAT) ファイル/セクションを含める必要があります (GRUB が UEFI shim ローダから起動される場合)。SBAT ファイル/セクションには、GRUB バイナリに関するメタデータ (バージョン、メンテナ、開発者、上流の URL) が含まれており、特定の GRUB バージョンに脆弱性がある場合、shim がそのバージョンの GRUB のロードをブロックすることが容易になります [1][2] (shim の UEFI shim bootloader secure boot life-cycle improvements というドキュメントで説明されています)。

SBAT セクションが grubx64.efi に無いと、shim は grubx64.efi の起動に失敗します。

GRUB がインストールされている場合、シンプルな SBAT .csv ファイルが /usr/share/grub/sbat.csv で提供されています。

その /usr/share/grub/sbat.csv ファイルと必要な GRUB_MODULES を使って GRUB を再インストールし、GRUB バイナリを署名してください:

# grub-install --target=x86_64-efi --efi-directory=esp --modules=${GRUB_MODULES} --sbat /usr/share/grub/sbat.csv
# sbsign --key MOK.key --cert MOK.crt --output esp/EFI/GRUB/grubx64.efi esp/EFI/GRUB/grubx64.efi
# cp esp/EFI/GRUB/grubx64.efi esp/EFI/BOOT/grubx64.efi

再起動し、MokManager で鍵を選択すれば、セキュアブートが機能するはずです。

セキュアブートを使用する

インストール後は、セキュアブート#セキュアブートを実現する を見て、セキュアブートを有効化する手順を確認してください。

CA 鍵の方法を取っている場合、鍵の管理や登録、ファイルの署名は sbctl で自動化できます。詳細は セキュアブート#sbctl でより簡単に行う を見てください。

BIOS システム

GUID Partition Table (GPT) 特有の手順

BIOS/GPT の構成では、BIOS ブートパーティションが必要です。GRUB は core.img をこのパーティションに埋め込みます。

ノート:
  • この方法を試す前に、すべてのシステムでこのパーティショニング方式がサポートされているわけではないということを心に留めておいてください。詳細は パーティショニング#GUID Partition Table を見てください。
  • BIOS ブートパーティションは BIOS/GPT のセットアップでのみ GRUB が必要とします。BIOS/MBR セットアップでは、GRUB は MBR の後にある隙間を core.img のために使用します。しかし、GPT では最初のパーティションの前に未使用の領域があることは保証されていません。
  • UEFI システムでは、ブートセクタが組み込まれないので、BIOS ブートパーティションは必要ありません。しかし、UEFI システムでは依然として EFI システムパーティションが必要です。

ディスク上にパーティションタイプ GUID 21686148-6449-6E6F-744E-656564454649 の、ファイルシステムの無い 1 メビバイト (fdiskgdisk+1M) のパーティションを作成してください。

  • fdisk では、パーティションタイプ BIOS boot を選択してください。
  • gdisk では、パーティションタイプコード ef02 を選択してください。
  • parted では、そのパーティションで bios_grub フラグをセット/アクティブ化してください。

このパーティションはどのような順番で配置しても良いですが、ディスクの先頭 2 TiB 以内になければなりません。このパーティションは GRUB のインストール前に作成する必要があります。パーティションの準備が完了したら、以下の指示に従ってブートローダーをインストールします。

GPT のアライメント仕様から外れますが、最初のパーティションの前にあるスペースは BIOS ブートパーティションとしても使用できます。このパーティションは定期的にアクセスされるものではないのでパフォーマンスの問題は無視できますが、一部のディスクユーティリティは警告を発します。fdiskgdisk では、セクター 34 から 2047 までの区間の新しいパーティションを作成して、先のパーティションタイプを設定してください。見える状態のパーティションが先頭から始まるようにするには、このパーティションを最後に追加することを検討してください。

Master Boot Record (MBR) 特有の手順

通常、MBR でパーティションされた環境において MBR の後の隙間 (512 バイトの MBR 領域の後ろで最初のパーティションの前) は 31 KiB になっていて、このパーティションテーブルでは DOS 互換のシリンダーアライメントは問題になりません。しかしながら GRUB の core.img 用に十分な領域を確保するために 1 から 2 MiB ほど MBR の後の領域をとることを推奨します (FS#24103)。この領域を獲得したり他の 512 バイトでないセクターの問題を起こさないために (core.img の埋め込みとは関係ありません) 1 MiB パーティションアライメントをサポートしているパーティションツールを使うのが得策です。

インストール

grub パッケージをインストールしてください (grub-legacyAUR がインストールされている場合は置き換えられます。) 次に以下を実行してください:

# grub-install --target=i386-pc /dev/sdX

i386-pc は実際のアーキテクチャに関わらず使用されます。/dev/sdX は GRUB がインストールされる ディスク (パーティションではありません) です。例えば、/dev/sda/dev/nvme0n1/dev/mmcblk0 です。ブロックデバイスの命名方法については デバイスファイル#ブロックデバイスの名前 を参照してください。

次に、メイン設定ファイルを生成する必要があります。 ​ /bootLVM を使用している場合、GRUB を複数の物理ディスク上にインストールすることができます。

ヒント: USB メモリなどに GRUB をインストールする他の方法については GRUB/ヒントとテクニック#代替インストール方法 を参照してください。

grub-install コマンドの詳細については、grub-install(8) および GRUB Manual を参照してください。

設定

インストールされたシステムでは、GRUB は起動の度に設定ファイル /boot/grub/grub.cfg をロードします。ツールを使う場合は、#grub.cfg の生成 を、手動で作成する場合は #grub.cfg のカスタマイズ を参照してください。

grub.cfg の生成

このセクションでは /etc/default/grub 設定ファイルの編集についてだけ扱っています。他のオプションは GRUB/ヒントとテクニック を見て下さい。

ノート: /etc/grub.d/ 下のファイルや /etc/default/grub に変更を加えた後は必ずメイン設定ファイルの再生成を行なって下さい。
警告: GRUB の新しいバージョンで設定ファイルの構文が変更された場合、ブートローダーをアップデート/再インストールしてください (#UEFI システム#BIOS システム を見てください)。設定が一致しないと、システムが起動できなくなる可能性があります。

メイン設定ファイルの生成

インストールした後は、メインの設定ファイル /boot/grub/grub.cfg を生成する必要があります。生成プロセスは、/etc/default/grub 内の様々なオプションや /etc/grub.d/ 下のスクリプトによって制御されます。/etc/default/grub におけるオプションのリストと、それぞれのオプションの簡潔な説明は、GNU のドキュメントを参照してください。

追加の設定をしていない場合、設定ファイル自動生成スクリプトは、ブートさせるシステムのルートファイルシステムを判定し、その情報を設定ファイルに保存します。これを成功させるには、システムを起動させているか、またはシステムに chroot していることが重要です。

ノート:
  • デフォルトのファイルパスは /boot/grub/grub.cfg です、/boot/grub/i386-pc/grub.cfg ではありません。
  • chrootsystemd-nspawn コンテナで grub-mkconfig を実行しようとした場合、次のようなエラーによりうまく行かないことがあります: grub-probe: error: failed to get canonical path of /dev/sdaX。この場合、このフォーラムの投稿で記述されているように arch-chroot を使ってみて下さい。

grub-mkconfig ツールを使って /boot/grub/grub.cfg を生成してください:

# grub-mkconfig -o /boot/grub/grub.cfg

デフォルトで、生成スクリプトは Arch Linux のカーネルのメニューエントリを自動的に設定に追加します。

ヒント:

他のオペレーティングシステムのエントリを自動的に追加する方法は #他の OS の検出 を見てください。

/etc/grub.d/40_custom を編集して /boot/grub/grub.cfg を再生成することで、追加のカスタムメニューエントリを追加することができます。または、/boot/grub/custom.cfg を作成して、そこにカスタムのメニューエントリを追加することもできます。/boot/grub/custom.cfg を編集した後に grub-mkconfig を再度実行する必要はありません。/etc/grub.d/41_custom は必要な source 文を設定ファイルに追加するからです。

ヒント: /etc/grub.d/40_custom/etc/grub.d/nn_custom を作成する際のテンプレートとして使うことができます。nn の部分は優先順位で、スクリプトを実行する順番を決定します。スクリプトを実行する順番は GRUB ブートメニューエントリの配置を決定します。必要なスクリプトを確実に実行させるために、nn06 よりも大きくする必要があります。

カスタムのメニューエントリの例は #ブートメニューエントリの例 を見てください。

他の OS の検出

grub-mkconfig で、インストールされている他のシステムを検索して自動的にメニューに追加するには、 os-prober パッケージを インストール して、他のシステムが起動するパーティションをマウントしてください。その後、grub-mkconfig を再実行します。もし、Warning: os-prober will not be executed to detect other bootable partitions と出力されたら、/etc/default/grub を編集して次の行を追加/アンコメントしてください:

GRUB_DISABLE_OS_PROBER=false

その後、もう一度試してください。

ノート:
  • 正確なマウントポイントは重要ではありません。os-probermtab を読み込んで、起動可能なエントリを検索すべき場所を特定します。
  • 他のオペレーティングシステムをエントリに含めるために、grub-mkconfig を実行するたびに対象のパーティションをマウントすることを忘れないでください。
  • os-prober は、chroot 内で実行すると正しく動作しないかもしれません。そのような場合は、再起動してシステムに入り、再び試してください。
ヒント: 最後に選択したブートエントリを GRUB に記憶させたい場合もあるでしょう、GRUB/ヒントとテクニック#以前のエントリを思い出させる を参照してください。
Windows

UEFI モードでインストールされた Windows の場合、Windows Boot Manager (bootmgfw.efi) を含んでいる EFI システムパーティションがマウントされていることを確認してください。root として os-prober を実行すると、Windows のエントリを検出・生成します。

BIOS モードでインストールされた Windows の場合、Windows システムパーティション をマウントしてください (そのパーティションのファイルシステムラベルSystem Reserved (システムで予約済み) か SYSTEM であるはずです)。root として os-prober を実行すると、Windows のエントリを検出・生成します。

ノート: BIOS モードでインストールされた Windows の場合:
  • NTFS パーティションはデフォルトの Linux ドライバでマウントすると、必ずしも検出されないかもしれません。GRUB が検出しない場合、NTFS-3G をインストールして再マウントしてみてください。
この記事またはセクションは情報が古くなっています。
理由: Windows 7 以降、bootmgrシステムパーティション内にあり、このパーティションは暗号化されていません。 (Discuss)
  • 暗号化された Windows パーティションは、マウントする前に暗号化を解除する必要があるかもしれません。BitLocker では、cryptsetupdislockerAUR で実行できます。これで os-prober が正しいエントリを追加できるはずです。

追加引数

カスタムの追加引数を Linux イメージに渡すために、/etc/default/grubGRUB_CMDLINE_LINUXGRUB_CMDLINE_LINUX_DEFAULT 変数を設定することができます。これら2つは互いに追加され、標準のブートエントリを作成する際にカーネルに渡されます。recovery ブートエントリについては、GRUB_CMDLINE_LINUX だけが生成時に使われます。

両方を使う必要はありませんが、上手く使えば便利です。例えば、GRUB_CMDLINE_LINUX_DEFAULT="resume=UUID=uuid-of-swap-partition quiet" (uuid-of-swap-partitionハイバネート後に復帰できるようにするためのスワップパーティションの UUID)。この例の設定では、(ハイバネートからの) 復帰をせず、メニューエントリからの起動中にカーネルメッセージを非表示にする quiet も無いリカバリブートエントリを生成します。しかし、他の (標準の) メニューエントリはこれらのオプションを持ちます。

デフォルトでは、grub-mkconfig はルートファイルシステムの UUID を検出して、設定にそれを反映します。これを無効化するには、GRUB_DISABLE_LINUX_UUID=true をアンコメントしてください。

GRUB リカバリエントリを生成するには、/etc/default/grub 内の GRUB_DISABLE_RECOVERYtrue に設定されていない必要があります。

詳細は カーネルパラメータ を参照してください。

トップレベルのメニューエントリを設定する

デフォルトでは、grub-mkconfig は、含まれているカーネルを sort -V を使ってソートし、それらの中の最初のカーネルをトップレベルのエントリとして使用します。すなわち、例えば /boot/vmlinuz-linux-lts/boot/vmlinuz-linux より前に来るので、linux-ltslinux の両方がインストールされている場合、LTS カーネルがトップレベルのメニューエントリとなります。これは、望ましくない場合があるでしょう。この挙動は、/etc/default/grub 内の GRUB_TOP_LEVEL=path_to_kernel" を指定することでオーバーライドすることができます。例えば、標準のカーネルをトップレベルのメニューエントリにするには、GRUB_TOP_LEVEL="/boot/vmlinuz-linux" を使用します。

LVM

警告: GRUB はシンプロビジョニングされた論理ボリュームをサポートしていません。

/boot/LVM を使用している場合、lvm モジュールをプリロードするようにしてください:

/etc/default/grub
GRUB_PRELOAD_MODULES="... lvm"

RAID

GRUB は RAID ボリュームの便利な管理手段を提供します。ボリュームをネイティブに管理できるようにするために、GRUB モジュール mdraid09mdraid1x をロードする必要があります:

/etc/default/grub
GRUB_PRELOAD_MODULES="... mdraid09 mdraid1x"

例えば、/dev/md0 は以下のようになります:

set root=(md/0)

パーティショニングされた RAID ボリューム (例: /dev/md0p1) は以下のようになります:

set root=(md/0,1)

/boot パーティションに RAID1 を使用している場合 (あるいは、/boot が RAID1 ルートパーティション上に存在する場合) に GRUB をインストールするには、BIOS システム上では、両方のドライブ上で grub-install を実行してください。例:

# grub-install --target=i386-pc --debug /dev/sda
# grub-install --target=i386-pc --debug /dev/sdb

ここでは、/boot が存在する RAID1 アレイが、/dev/sda/dev/sdb に存在するとしています。

{{Note|GRUB は Btrfs RAID 0/1/10 からの起動をサポートしていますが、RAID 5/6 はサポートしていません。RAID 5/6 に対しては mdadm を使用することができます (mdadm は GRUB によってサポートされています)。

暗号化された /boot

GRUB には暗号化された /boot を起動するための特別なサポートがあります。これは、LUKS ブロックデバイスをアンロックして、GRUB の設定を読み込み、initramfsカーネル をそのブロックデバイスからロードすることにより行われます。このオプションは暗号化されていないブートパーティションの問題を解決することを試みます。

ヒント: /boot を別のパーティションに保存する必要はありません。システムのルート / ディレクトリツリー下に保存することもできます。
警告: GRUB 2.12rc1 の LUKS2 に対するサポートは限られています。詳細は #LUKS2 セクションを見てください。

この機能を有効化するには、/boot が存在するパーティションを通常通り LUKS を使って暗号化してください。そして、以下のオプションを /etc/default/grub に追加してください。

/etc/default/grub
GRUB_ENABLE_CRYPTODISK=y

このオプションは grub-install により使用され、grub の core.img を生成します。

このオプションを追加した後やパーティションを暗号化した後に GRUB を(再)インストールすることを忘れないでください。

これだけだと、パスフレーズを2回入力させられることになります。1回目は起動の初期段階で GRUB が /boot マウントポイントをアンロックするためのもので、2回目は iniramfs により実装されている root ファイルシステムそれ自体をアンロックするためのものです。キーファイルを使えば、これを防げます。

警告:
  • メインの設定ファイルを生成したいときは、/boot がマウントされていることを確認してください。
  • /boot マウントポイントが関与するシステムアップデートを行うために、アップデートする前に、暗号化された /boot がアンロックされていて、かつ、マウントされていることを確認してください。/boot パーティションが別にある場合、crypttabキーファイルと一緒に使うことでこれを自動化できます。
ノート:
  • 特殊なキーマップを使用している場合、デフォルトの GRUB 環境にはそのようなキーマップが存在しません。このことは、LUKS ブロックデバイスをアンロックするためにどのようにしてパスフレーズを入力するかに関連しています。GRUB/ヒントとテクニック#初期ブートにおけるコアイメージの手動設定 を参照してください。
  • パスワードの入力画面が表示されない問題が発生した場合 (cryptouuid や cryptodisk、"device not found" に関係するエラー)、--modules="part_gpt part_msdos"grub-install コマンドの最後に付け加えて GRUB を再インストールしてみてください。
ヒント: pacman フック を使用すれば、/boot 内のファイルにアクセスする必要のあるアップグレード時に /boot を自動マウントできます。
LUKS2

#インストール 章で説明されているように、grub-install を使用して LUKS サポートありでブータブルな GRUB イメージを作成してください。ただし、いくつかの注意点があります:

  • LUKS2 の初期サポートが GRUB 2.06 で追加されましたが、いくつかの制限があります。これらの制限は、GRUB 2.12rc1 で部分的にのみ対処されています。GRUB bug #55093 を参照してください。
  • GRUB 2.12rc1 から、grub-install で LUKS2 のロックを解除するためのコアイメージを作成できるようになりました。しかし、PBKDF2 のみがサポートされており、Argon2 はサポートされていません。
  • Argon2id (cryptsetup デフォルト) と Argon2i PBKDF はサポートされていません (GRUB bug #59409)。PBKDF2 のみのサポートです。
ヒント: LUKS2 と Argon のサポートパッチが施された grub-improved-luks2-gitAUR を使用できます。このパッケージの Argon サポートには UEFI システムが必要であることに注意してください。[3]
ノート: GRUB 2.12rc1 より前では、カスタムの GRUB 設定ファイルを使って grub-mkimage コマンドで EFI バイナリを手動で作成する必要がありました。(例えば、/boot/grub/grub-pre.cfgcryptomountinsmod normal、そして normal への呼び出しを追加する必要がありました。) しかし、これはもはや必要なくなり、grub-install だけで十分です。ただし、2.06 からアップグレードした後に少なくとも一回は grub-mkconfig -o /boot/grub/grub.cfg を実行する必要があります。

起動中に無効なパスフレーズを入力して GRUB のレスキューシェルに入った場合、cryptomount -a を実行してすべての (できれば1つだけ) 暗号化されたパーティションをマウントしてみてください。または、cryptomount -u $crypto_uuid を使用して特定のパーティションをマウントしてください。その後、通常通り insmod normalnormal で進めてください。

正しいパスフレーズを入力したが Invalid passphrase というエラーにより即座に戻される場合、正しい暗号化モジュールを指定していることを確認してください。cryptsetup luksDump /dev/nvme0n1p2 を使って、ハッシュ関数 (SHA-256, SHA-512) とインストールされているモジュール (gcry_sha256, gcry_sha512) が一致するか、PBKDF アルゴリズムが pbkdf2 であるかを確認してください。cryptsetup luksConvertKey --hash sha256 --pbkdf pbkdf2 /dev/nvme0n1p2 を使えば、ハッシュと PBDKDF アルゴリズムを今あるキーに対して変更することができます。通常の状況では、パスフレーズが処理されるのに数秒掛かるはずです。

grub.cfg のカスタマイズ

このセクションでは grub-mkconfig に頼らずに /boot/grub/grub.cfg 内にある GRUB のブートエントリーを手動で作成する方法について言及します。

基本的な GRUB の設定ファイルでは以下のオプションが使用されます。

  • (hdX,Y) はディスク X 上に存在するパーティション Y を表します。パーティション番号は 1 から始まり、ディスク番号は 0 から始まります。
  • set default=N は、ユーザーが操作せずにタイムアウトした後に選択されるデフォルトのブートエントリを表します。
  • set timeout=M は、ユーザーの選択が無かった場合に M 秒の間待ってデフォルトのブートエントリが起動されることを表します。
  • menuentry "title" {entry options}title というタイトルのブートエントリを表します。
  • set root=(hdX,Y) はカーネルと GRUB モジュールが格納されているブートパーティションを表します。(boot は分離されたパーティションである必要はなく、単に "root" パーティション (/) 下にあるディレクトリを指定しても構いません)

LoaderDevicePartUUID

systemd-gpt-auto-generator(8)GPT パーティションの自動マウントをするために必要な LoaderDevicePartUUID UEFI 変数を GRUB で設定するには、grub.cfgbli モジュールをロードしてください:

if [ "$grub_platform" = "efi" ]; then
  insmod bli
fi

ブートメニューエントリの例

ヒント: 以下のブートエントリは grub-mkconfig によって生成された /boot/grub/grub.cfg でも使用可能です。以下を /etc/grub.d/40_custom に追加してメインの設定ファイルを再生成するか、あるいは以下を直接 /boot/grub/custom.cfg に追加してください。

複数の GRUB エントリーを管理するヒントとして、例えば linuxlinux-lts カーネルを同時使用している場合は GRUB/ヒントとテクニック#複数のエントリ を見てください。

ArchisoArchboot のブートメニューエントリについては マルチブート USB ドライブ#ブートエントリ を見てください。

GRUB コマンド
"Shutdown" メニューエントリ
menuentry "System shutdown" {
	echo "System shutting down..."
	halt
}
"Restart" メニューエントリ
menuentry "System restart" {
	echo "System rebooting..."
	reboot
}
"UEFI Firmware Settings" メニューエントリ
if [ ${grub_platform} == "efi" ]; then
	menuentry 'UEFI Firmware Settings' --id 'uefi-firmware' {
		fwsetup
	}
fi
EFI バイナリ

UEFI モードで起動している場合、GRUB は他の EFI バイナリをチェインロードできます。

ヒント: GRUB が UEFI モードで起動している時にだけメニューエントリを表示するには、メニューエントリを if 文で囲ってください:
if [ ${grub_platform} == "efi" ]; then
	UEFI のときだけ表示するメニューエントリをここへ
fi
UEFI シェル

EFI システムパーティション直下に UEFI シェル を置いてメニューエントリに追加すれば、UEFI シェルを起動できます:

menuentry "UEFI Shell" {
	insmod fat
	insmod chain
	search --no-floppy --set=root --file /shellx64.efi
	chainloader /shellx64.efi
}
gdisk

gdisk EFI アプリケーションをダウンロードして gdisk_x64.efiesp/EFI/tools/ にコピーしてください。

menuentry "gdisk" {
	insmod fat
	insmod chain
	search --no-floppy --set=root --file /EFI/tools/gdisk_x64.efi
	chainloader /EFI/tools/gdisk_x64.efi
}
Unified カーネルイメージをチェインロード

セキュアブートに従って生成したか他の方法によって生成した Unified カーネルイメージを持っているならば、それをブートメニューに追加できます。例えば:

menuentry "Arch Linux" {
	insmod fat
	insmod chain
	search --no-floppy --set=root --fs-uuid FILESYSTEM_UUID
	chainloader /EFI/Linux/arch-linux.efi
}
デュアルブート
GNU/Linux

もう一つのディストリビューションが sda2 パーティションにあると仮定します:

menuentry "Other Linux" {
	set root=(hd0,2)
	linux /boot/vmlinuz (必要であれば追加のオプションをここへ)
	initrd /boot/initrd.img (カーネルが必要とする/使用するイメージはここへ)
}

代わりに UUID やファイルシステムのラベルで GRUB に正しいパーティションを探させるには:

menuentry "Other Linux" {
        # UUID が 763A-9CB6 だとすると
	search --no-floppy --set=root --fs-uuid 763A-9CB6

        # OTHER_LINUX というラベルで探す (パーティションラベルが曖昧でないことを確認してください)
        #search --no-floppy --set=root --label OTHER_LINUX

	linux /boot/vmlinuz (必要であれば追加のオプションをここへ。例えば、root=UUID=763A-9CB6)
	initrd /boot/initrd.img (カーネルが必要とする/使用するイメージはここへ)
}

もう一つのディストリビューションが、インストール済みの GRUB と grub.cfg、カーネル、initramfs のある有効な /boot フォルダーをすでに持っているならば、GRUB にその grub.cfg ファイルを起動中にその場で読み込ませることができます。例えば、hd0 と4番目の GPT パーティションの場合:

menuentry "configfile hd0,gpt4"  {
        insmod part_gpt
        insmod btrfs
        insmod ext2
        set root='hd0,gpt4'
        configfile /boot/grub/grub.cfg
}

このエントリを選ぶと GRUB は他のボリュームからその grub.cfg を読み込み、メニューを表示させます。configfile ファイル内のコマンドによって環境変数が変更されても、configfile から返ると環境変数の変更はすべて破棄されます。始めの GRUB メニューに戻る場合は Esc を押してください。

UEFI/GPT モードでインストールされた Windows

このモードではメニューエントリが選択されると Windows ブートローダーの場所を発見し、GRUB のあとにブートローダーをチェインロードします。ここでするべきことは主に Windows の EFI システムパーティションを見つけて、そのパーティションから Windows のブートローダーを実行することです。

ノート: このメニューエントリは、UEFI ブートモードで実行中であり、かつ Windows のビット数が UEFI のビット数と一致する場合にのみ機能します。BIOS モードでインストールされた GRUB では機能しません。さらなる情報については Windows と Arch のデュアルブート#Windows の UEFI と BIOS の制限Windows と Arch のデュアルブート#ブートローダーの UEFI と BIOS の制限 をご覧ください。
if [ "${grub_platform}" == "efi" ]; then
	menuentry "Microsoft Windows Vista/7/8/8.1 UEFI/GPT" {
		insmod part_gpt
		insmod fat
		insmod chain
		search --no-floppy --fs-uuid --set=root $hints_string $fs_uuid
		chainloader /EFI/Microsoft/Boot/bootmgfw.efi
	}
fi

$hints_string$fs_uuid は以下の2つのコマンドで得られます。

$fs_uuid コマンドは EFI システムパーティションの UUID を割り出します。

# grub-probe --target=fs_uuid esp/EFI/Microsoft/Boot/bootmgfw.efi
1ce5-7f28

代わりに、lsblk --fs を実行して、EFI システムパーティションの UUID をそこから読み込むこともできます。

$hints_string コマンドは EFI システムパーティションの場所を割り出します。以下の例ではハードドライブ0にあります:

# grub-probe --target=hints_string esp/EFI/Microsoft/Boot/bootmgfw.efi
--hint-bios=hd0,gpt1 --hint-efi=hd0,gpt1 --hint-baremetal=ahci0,gpt1

以上の2つのコマンドでは Windows が使用する ESP が esp にマウントされていると仮定しています。Windows である以上、Windows の EFI ファイルへのパスが異なる場合があるかもしれません。

BIOS/MBR モードでインストールされた Windows
ノート: GRUB は bootmgr ディレクトリの直接ブートをサポートしています。Windows を BIOS/MBR で起動するためにパーティションブートセクターを チェインロードする必要はもはやありません。
警告: /bootmgr が存在する場所は システムパーティション であり、"本当"の Windows パーティション (通常、C:) ではありません。システムパーティションのファイルシステムラベルSystem Reserved (システムで予約済み) か SYSTEM であり、サイズは約100~549 MiB 程度です。さらなる情報については Wikipedia:System partition and boot partition をご覧ください。

このセクションを通して Windows のパーティションは /dev/sda1 にあると仮定します。パーティションが異なる場合は hd0,msdos1 という記述をすべて変更してください。

ノート: 以下のメニューエントリは BIOS ブートモードでのみ機能します。UEFI モードでインストールされた GRUB では機能しません。Windows と Arch のデュアルブート#Windows の UEFI と BIOS の制限Windows と Arch のデュアルブート#ブートローダーの UEFI と BIOS の制限 をご覧ください。

両方の例で XXXX-XXXX はファイルシステムの UUID を表しています。UUID は lsblk --fs コマンドを使って得られます。実際の UUID に置き換えてください。

Windows Vista/7/8/8.1/10 では:

if [ "${grub_platform}" == "pc" ]; then
	menuentry "Microsoft Windows Vista/7/8/8.1/10 BIOS/MBR" {
		insmod part_msdos
		insmod ntfs
		insmod ntldr
		search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 XXXX-XXXX
		ntldr /bootmgr
	}
fi

Windows XP では:

if [ "${grub_platform}" == "pc" ]; then
	menuentry "Microsoft Windows XP" {
		insmod part_msdos
		insmod ntfs
		insmod ntldr
		search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 XXXX-XXXX
		ntldr /ntldr
	}
fi
ノート: GRUB をインストールすると Windows 8 が汚染される場合があります。この場合、\boot\bcd (エラーコード 0xc000000f)のエラーにより Windows が起動できなくなります。これを直すには Windows 回復コンソール(インストールディスク上にある cmd.exe)を開いて、以下を実行してください:
X:\> bootrec.exe /fixboot
X:\> bootrec.exe /RebuildBcd

bootrec.exe /Fixmbr実行しないでください。GRUB が吹き飛びます。 あるいは、トラブルシューティングメニューにあるスタートアップ修復機能を使用できます。これは GRUB を吹き飛ばしませんし、ほとんどのエラーを修復します。 また、対象のハードドライブとブート可能ドライブの両方だけを接続しておくほうが良いでしょう。通常、他のデバイスが接続されていると Windows はブート情報の修復に失敗します。

ラベルを使う

search コマンドに対して --label オプションを使えば、ファイルシステムに付けられた人間が読みやすい文字列であるラベルを使うことができます。まずはじめに、ファイルシステムにラベルがあることを確認してください。

そして、ラベルを使ってエントリを追加してください。例えば:

menuentry "Arch Linux, session texte" {
  search --label --set=root archroot
  linux /boot/vmlinuz-linux root=/dev/disk/by-label/archroot ro
  initrd /boot/initramfs-linux.img
}

コマンドシェルを使う

GRUB のモジュールを全て保存するには MBR は小さすぎるので、メニューと基本的なコマンドだけが MBR に入っています。GRUB の機能のほとんどは /boot/grub 内のモジュールとして存在し、必要に応じて挿入されます。エラー状態になると (例: パーティションレイアウトが変更された場合)、GRUB が起動に失敗する場合があります。このとき、コマンドシェルが表示されます。

GRUB は複数のシェル/プロンプトを提供しています。メニューの読込に問題があってもブートローダがディスクを見つけられるときは、おそらく "normal" シェルに落とされるでしょう:

grub>

さらに深刻な問題 (例: GRUB が必要なファイルを見つけられないなど) があるときは、代わりに "rescue" シェルに落とされるでしょう:

grub rescue>

rescue シェルは通常のシェルの制限されたサブセットで、使える機能が非常に少なくなっています。rescue シェルが出てきた時は、まず "normal" モジュールの挿入を試して、"normal" シェルを起動してみて下さい:

grub rescue> set prefix=(hdX,Y)/boot/grub
grub rescue> insmod (hdX,Y)/boot/grub/i386-pc/normal.mod
rescue:grub> normal

ページャのサポート

GRUB はページャをサポートしており長い出力をするコマンド (help コマンドなど) を読むことができます。これは通常のシェルモードでしか動作せずレスキューモードでは使えません。ページャを有効にするには、GRUB コマンドシェルで次を入力して下さい:

sh:grub> set pager=1

コマンドシェル環境を使ってオペレーティングシステムを起動する

grub>

GRUB のコマンドシェル環境を使ってオペレーティングシステムを起動することが可能です。 通常はチェインロードを使ってドライブやパーティションから Windows / Linux を起動するということが考えられます。

チェインロードは現在のブートローダから別のブートローダをロードすることを意味します。

他のブートローダーは、パーティショニングされたディスク (MBR) の先頭や、パーティションレスディスク (VBR) のパーティションの先頭に組み込んだり、あるいは UEFI の場合は EFI バイナリとして組み込むことができます。

パーティションの VBR をチェインロード

set root=(hdX,Y)
chainloader +1
boot

X=0,1,2... Y=1,2,3...

例えば最初のハードディスクの最初のパーティションに保存された Windows をチェインロードするには:

set root=(hd0,1)
chainloader +1
boot

同じようにパーティションにインストールされた GRUB をチェインロードすることもできます。

ディスクの MBR やパーティションレスディスクの VBR をチェインロード

set root=hdX
chainloader +1
boot

UEFI モードでインストールされた Windows/Linux のチェインロード

insmod fat
set root=(hd0,gpt4)
chainloader (${root})/EFI/Microsoft/Boot/bootmgfw.efi
boot

insmod fat は、EFI システムパーティション上の Windows ブートローダーにアクセするために、FAT ファイルシステムモジュールをロードするために使用されます。 (hd0,gpt4) (すなわち /dev/sda4) は、この例における EFI システムパーティションです。 chainloader 行のエントリは、チェインロードすべき .efi ファイルへのパスを指定しています。

通常のロード

#rescue コンソールを使う の例を見て下さい。

rescue コンソールを使う

まず #コマンドシェルを使う を見て下さい。標準シェルを有効にできない場合、ライブ CD や他のレスキューディスクを使って起動し、設定のエラーを直して GRUB を再インストールという方法があります。ただし、そのようなブートディスクはいつも使えるというわけではありません (もしくは必要ありません); レスキューコンソールは驚くほど堅牢です。

GRUB rescue で利用できるコマンドには insmodlssetunset があります。この例では setinsmod を使います。set は変数を変更し insmod は新しいモジュールを挿入して機能を追加します。

始める前に、ユーザーは自分の /boot パーティションの位置を知っていなければなりません (分割パーティションなのか、root 下のサブディレクトリなのか):

grub rescue> set prefix=(hdX,Y)/boot/grub

X は物理ドライブ番号、Y はパーティション番号に置き換えてください。

ノート: boot パーティションを分割している場合、パスから /boot を省いて下さい (つまり、set prefix=(hdX,Y)/grub と入力する)。

コンソールの機能を拡張するために、linux モジュールを挿入します:

grub rescue> insmod i386-pc/linux.mod

もしくは、単純に:

grub rescue> insmod linux

これで、より親しみのあるであろう linuxinitrd のコマンドが使えます。

例えば、Arch Linux を起動する場合:

set root=(hd0,5)
linux /boot/vmlinuz-linux root=/dev/sda5
initrd /boot/initramfs-linux.img
boot

boot パーティションを分割している (例えば、UEFI を使用している場合など) なら、行を適宜変更する必要があります:

ノート: boot は別のパーティションであり、ルートパーティションの一部ではないので、上の prefix 変数と同じような形式で boot パーティションを手動で指定する必要があります。
set root=(hd0,5)
linux (hdX,Y)/vmlinuz-linux root=/dev/sda6
initrd (hdX,Y)/initramfs-linux.img
boot
ノート: linux コマンドの実行中に error: premature end of file /YOUR_KERNEL_NAME と表示される場合は、代わりに linux16 を使ってみて下さい。

Arch Linux 環境のブートに成功したら、必要に応じて grub.cfg を修正し GRUB を再インストールすることができます。

GRUB を再インストールして問題を完全に修正するには、必要応じて /dev/sda を変更してください。詳しくは #インストール を見て下さい。

GRUB を消去

UEFI システム

grub を削除する前に、他のブートローダがインストールされていて、GRUB の後を引き継ぐように設定されていることを確認してください。

$ efibootmgr
BootOrder: 0003,0001,0000,0002
Boot0000* Windows Boot Manager  HD(2,GPT,4dabbedf-191b-4432-bc09-8bcbd1d7dabf,0x109000,0x32000)/File(\EFI\Microsoft\Boot\bootmgfw.efi)
Boot0001* GRUB  HD(2,GPT,4dabbedf-191b-4432-bc09-8bcbd1d7dabf,0x109000,0x32000)/File(\EFI\GRUB\grubx64.efi)
Boot0002* Linux-Firmware-Updater        HD(2,GPT,5dabbedf-191b-4432-bc09-8bcbd1d7dabf,0x109000,0x32000)/File(\EFI\arch\fwupdx64.efi)
Boot0003* Linux Boot Manager    HD(2,GPT,4dabbedf-191b-4432-bc09-8bcbd1d7dabf,0x109000,0x32000)/File(\EFI\systemd\systemd-bootx64.efi)

BootOrdergrub が最初のエントリになっている場合、systemd-boot などの他のブートローダをインストールして最初のエントリにしてください。その後、bootnum を使って grub を削除することができます。

# efibootmgr --delete-bootnum -b 1

また、esp/EFI/grub/boot/grub ディレクトリも削除してください。

BIOS システム

grub を他の BIOS ブートローダに置き換えるには、単に新しいブートローダをインストールしてください (そうすることで、MBR ブートコードが上書きされます)。

grub-install/boot/grub ディレクトリを作成するので、これは手動で削除する必要があります。しかし、grub をまたインストールするかもしれない場合は、このディレクトリを残しておいたほうが良いかもしれません。

UEFI/GPT に移行した後は、dd を使って MBR ブートコードを削除することができます。

トラブルシューティング

サポートのないファイルシステム

GRUB が root のファイルシステムをサポートしていない場合、代替の /boot パーティションをサポートのあるファイルシステムで作成する必要があります。​開発バージョンの GRUB である grub-gitAUR が該当するファイルシステムをネイティブサポートしている場合があります。

サポートされないファイルシステムで GRUB を使用した場合、ドライブの UUID を抽出できないため、GRUB は古典的で非永続的な /dev/sdXx 名を使います。この場合、/boot/grub/grub.cfg を手動で編集し、root=/dev/sdXxroot=UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX のように置き換える必要があるかもしれません。blkid コマンドを使えばデバイスの UUID を得られます。永続的なブロックデバイスの命名 を見てください。

GRUB はバージョン 2.0.4 より F2FS をサポートしていますが、extra_attr フラグを有効にして作成された F2FS パーティションからブートファイルを正しく読み込むことができません。

デバッグメッセージを有効にする

ノート: この変更はメインの設定ファイルを生成すると上書きされます。

以下を grub.cfg に追加してください:

set pager=1
set debug=all

msdos-style エラーメッセージ

grub-setup: warn: This msdos-style partition label has no post-MBR gap; embedding will not be possible!
grub-setup: warn: Embedding is not possible. GRUB can only be installed in this setup by using blocklists.
            However, blocklists are UNRELIABLE and its use is discouraged.
grub-setup: error: If you really want blocklists, use --force.

このエラーは VMware コンテナに GRUB をインストールしようとすると起こることがあります。詳しくは ここ を読んで下さい。最初のパーティションが MBR (ブロック 63) のすぐ後ろから始まっていて、最初のパーティションの前に通常の 1 MiB のスペース (2048 ブロック) がない場合に起こります。#Master Boot Record (MBR) 特有の手順 を読んで下さい。

UEFI

よくあるインストール時のエラー

  • 一部の UEFI デバイスで起こりうるエラーは、Could not prepare Boot variable: Read-only file system です。/sys/firmware/efi/efivars を読み書き可能な状態で再マウントする必要があります。
    # mount -o remount,rw,nosuid,nodev,noexec --types efivarfs efivarfs /sys/firmware/efi/efivars
    ブートローダーのインストールに関しては Gentoo Wiki を見てください。
  • sysfsprocfs がある状態で grub-install を実行すると問題が発生し、modprobe efivarfs を実行しなければならないと言われる場合、efivarfs をマウントして上記のコマンドを実行してみてください。
  • --target--directory オプションのどちらかがないと、grub-install はどこにファームウェアをインストールすればいいのか決められません。そのような場合 grub-installsource_dir does not exist. Please specify --target or --directory というメッセージを表示します。
  • grub-install の実行後に error: esp doesn't look like an EFI partition と表示される場合、おそらくパーティションが FAT32 でフォーマットされていません。

ファームウェアブートマネージャーに GRUB エントリを作成する

grub-install は自動的にブートマネージャーにメニューエントリを追加しようと試みます。もし GRUB がそれを行わない場合、UEFI#efibootmgr を見て、efibootmgr を使ってメニューエントリを作成する指示を読んでください。しかし、UEFI#ISO から UEFI ブータブル USB を作成する にあるように、よくある原因は CD/USB を UEFI モードで起動していないというものです。

GRUB エントリをファームウェアブートマネージャに作成する例として、efibootmgr -c を考えてみましょう。これは、/dev/sda1 が EFI システムパーティションであり、/boot/efi にマウントされていると仮定します。これは efibootmgr のデフォルトの挙動です。このツールは、("Linux" という名前の) 新しいブートオプションを作成し、それをブート順序リストの1番目に配置します。オプションを渡すことでデフォルトの挙動を変更できます。デフォルトの OS ローダーは \EFI\arch\grub.efi です。

レスキューシェルが起動する

GRUB はロードされたが、エラーが表示されずにレスキューシェルに落とされる場合、以下の2つの理由のうち1つが原因である可能性があります:

  • grub.cfg が存在しないか、場所を間違えている。--boot-directory を使って GRUB UEFI をインストールして、grub.cfg が存在しない場合に起こります。
  • ブートパーティションが変更された (grubx64.efi ファイルにハードコードされています)。

GRUB UEFI がロードされない

有効な UEFI の例:

# efibootmgr -u
BootCurrent: 0000
Timeout: 3 seconds
BootOrder: 0000,0001,0002
Boot0000* GRUB HD(1,800,32000,23532fbb-1bfa-4e46-851a-b494bfe9478c)File(\EFI\GRUB\grubx64.efi)
Boot0001* Shell HD(1,800,32000,23532fbb-1bfa-4e46-851a-b494bfe9478c)File(\shellx64.efi)
Boot0002* Festplatte BIOS(2,0,00)P0: SAMSUNG HD204UI

画面が数秒間真っ暗になって、その後、次のブートオプションが試行される場合、この投稿によると、GRUB をルートパーティションに移動することで直るかもしれません。ブートオプションは削除して後でまた作成する必要があります。GRUB のエントリは次のようにしてください:

Boot0000* GRUB HD(1,800,32000,23532fbb-1bfa-4e46-851a-b494bfe9478c)File(\grubx64.efi)

デフォルト/フォールバックのブートパス

一部の UEFI ファーウェアではブート可能なファイルが既知の場所に存在している必要があり、それ以外の場所では UEFI NVRAM ブートエントリに表示されません。この場合、grub-install が、GRUB を起動するエントリが efibootmgr によって追加されたと報告するでしょうが、VisualBIOS のブート順序セレクターには表示されません。解決策は GRUB をデフォルト/フォールバックのブートパスにインストールすることです:

# grub-install --target=x86_64-efi --efi-directory=esp --removable

あるいは、すでにインストールされた GRUB の EFI 実行ファイルをデフォルト/フォールバックのパスに移動することができます:

# mv esp/EFI/grub esp/EFI/BOOT
# mv esp/EFI/BOOT/grubx64.efi esp/EFI/BOOT/BOOTX64.EFI

Invalid signature

(例えば、パーティションを再設定したり、追加のハードドライブを追加したりしたあとで) Windows を起動しようとして "invalid signature" エラーが発生する場合、GRUB のデバイス設定を移動 (削除) し、GRUB に再設定させてください:

# mv /boot/grub/device.map /boot/grub/device.map-old
# grub-mkconfig -o /boot/grub/grub.cfg

これで grub-mkconfig は Windows を含む全てのブートオプションを記述したはずです。これで動作したら、/boot/grub/device.map-old は削除してください。

起動中にフリーズする

GRUB がカーネルと初期 RAM ディスクをロードした後に、エラーメッセージが表示されずにフリーズする場合、add_efi_memmap カーネルパラメータを削除してみてください。

他の OS から Arch が見つからない

他のディストリビューションで os-prober を使って Arch Linux を自動的に検索できないという報告が複数確認されています。この問題が発生する場合、/etc/lsb-release をおくことで検知が改善されると報告されています。このファイルと更新ツールは公式リポジトリにある lsb-release パッケージから利用可能です。

chroot でインストールした時に警告が表示される

(システムのインストール中などに) chroot 環境で LVM システム上に GRUB をインストールする際に、以下のような警告が発生する場合があります:

/run/lvm/lvmetad.socket: connect failed: No such file or directory

または

WARNING: failed to connect to lvmetad: No such file or directory. Falling back to internal scanning.

これは、/run が chroot 内で利用可能でないから起こります。すべてが正しく行われていれば、これらの警告のせいでシステムが起動できなくなることはありません。インストールを継続することができます。

GRUB のロードが遅い

ディスク容量が残りわずかの場合 GRUB がロードされるのにかなり時間がかかることがあります。起動が遅い場合 /boot/ に十分な空き容量があるか確認してください。

error: unknown filesystem

GRUB が error: unknown filesystem と出力して起動しない理由はいくつか考えられます。UUID が正しいこと、全てのファイルシステムが問題なく、GRUB によってサポートされていることが確認できる場合、BIOS Boot Partition がドライブの最初の 2TB の中にない可能性があります [4]。適当なパーティショニングツールを使ってパーティションが最初の 2TB 以内にあるようにして、GRUB を再インストール・再設定してください。

また、このエラーは ext4 ファイルシステムがいくつかの機能をサポートしていないことが原因かもしれません:

  • large_dir - サポートされません。
  • metadata_csum_seed - GRUB 2.11 でサポートされます (コミット).
警告: /boot ファイルシステム上でファイルシステムの新しい機能を有効化する前に、GRUB がそれらをサポートしていることを確認してください。

grub-reboot で再設定されない

GRUB は Btrfs のルートパーティションに書き込むを行うことができません [5]。grub-reboot を使って他のエントリを起動した場合、ディスク上の環境を更新することができなくなります。(ディストリビューションを切り替えるなどの場合に) 他のエントリから grub-reboot を実行するか他のファイルシステムを使ってください。grub-editenv create を実行して /etc/default/grubGRUB_DEFAULT=0 を設定することでエントリをリセットできます (設定後は grub-mkconfig -o /boot/grub/grub.cfg を行ってください)。

古い Btrfs のせいでインストールができない

パーティションテーブルを作成しないで Btrfs を使ってドライブをフォーマットしている場合 (例: /dev/sdx)、後からパーティションテーブルを書き込むと、Btrfs のフォーマットが一部残留します。ほとんどのユーティリティや OS は残留した Btrfs を認識できないため、GRUB は (たとえ --force が付けられていても) インストールを拒否します:

# grub-install: warning: Attempting to install GRUB to a disk with multiple partition labels. This is not supported yet..
# grub-install: error: filesystem `btrfs' does not support blocklists.

ドライブを完全に消去してもいいですが、wipefs -o 0x10040 /dev/sdx を使えばデータを残して Btrfs のスーパーブロックだけを消去することができます。

Windows 8/10 が認識されない

Windows 8/10 の "高速スタートアップ"、"ハイブリッドブート"、"Hiberboot" と呼ばれる設定を有効にしていると Windows のパーティションをマウントすることができなくなる可能性があります。そのため grub-mkconfig が Windows を認識することができなくなります。Windows で高速スタートアップを無効化することで GRUB のメニューに追加することができるようになるはずです。

grub-rescue プロンプトと暗号化済み /boot

暗号化済みの /boot を使用している場合に間違ったパスワードを入力してしまうと grub-rescue プロンプトに入ります。

この grub-rescue プロンプトでは出来ることが限られています。以下のコマンドを使ってブートを完了させます:

grub rescue> cryptomount <partition>
grub rescue> insmod normal
grub rescue> normal

より良い説明はこのブログ投稿[リンク切れ 2023-04-23]をご覧ください。

GRUB をインストールしたが起動時にメニューが表示されない

/etc/default/grub を見て GRUB_TIMEOUT0 に設定されていないかチェックしてください。0 に設定されていた場合、正の数に設定し直してください。この値はデフォルトの GRUB エントリが起動されるまでの秒数を表しています。GRUB_TIMEOUT_STYLEhidden に設定されていないかもチェックしてください。hidden に設定されていた場合、menu に設定し直してください。これでメニューがデフォルトで表示されるようになります。以上が終わったら、メインの設定ファイルを再生成して、再起動してメニューが表示されるか確かめてください。

これでうまく行かない場合、グラフィカルターミナルとの互換性の問題があるのかもしれません。/etc/default/grubGRUB_TERMINAL_OUTPUTconsole に設定し、GRUB のグラフィカルターミナルを無効化してください。

参照

翻訳ステータス: このページは en:GRUB の翻訳バージョンです。最後の翻訳日は 2023-11-11 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。