GRUB
関連記事
GRUB (GRand Unified Bootloader) はブートローダーです。現在の GRUB は GRUB 2 とも呼ばれています。元の GRUB (GRUB Legacy) はバージョン 0.9x に対応しています。このページでは GRUB 2 についてのみ説明します。
目次
- 1 UEFI システム
- 2 BIOS システム
- 3 設定
- 4 コマンドシェルを使う
- 5 GRUB を消去
- 6 トラブルシューティング
- 6.1 サポートのないファイルシステム
- 6.2 デバッグメッセージを有効にする
- 6.3 msdos-style エラーメッセージ
- 6.4 UEFI
- 6.5 Invalid signature
- 6.6 起動中にフリーズする
- 6.7 他の OS から Arch が見つからない
- 6.8 chroot でインストールした時に警告が表示される
- 6.9 GRUB のロードが遅い
- 6.10 error: unknown filesystem
- 6.11 grub-reboot で再設定されない
- 6.12 古い Btrfs のせいでインストールができない
- 6.13 Windows 8/10 が認識されない
- 6.14 grub-rescue プロンプトと暗号化済み /boot
- 6.15 GRUB をインストールしたが起動時にメニューが表示されない
- 7 参照
UEFI システム
インストール
まず、grub と efibootmgr をインストールしてください。GRUB はブートローダである一方、efibootmgr はブートエントリを NVRAM に書き込むために GRUB のインストールスクリプトによって使用されます。
そして、以下の手順に従って GRUB をディスクにインストールしてください:
- EFI システムパーティションをマウントしてください。そして、このセクションの後の部分で出てくる
esp
という記述をそのマウントポイントに置き換えてください。 - ブートローダの識別子を選んでください、ここでは仮に
GRUB
としましょう。esp/EFI/
にあなたが選んだものと同じ名前のディレクトリが作成され、そこに EFI バイナリが格納されます。その名前が UEFI ブートメニューの GRUB ブートエントリの名前になります。 - 以下のコマンドを実行して、GRUB EFI アプリケーション
grubx64.efi
をesp/EFI/GRUB/
に、モジュールを/boot/grub/x86_64-efi/
にインストールしてください。
# grub-install --target=x86_64-efi --efi-directory=esp --bootloader-id=GRUB
上記のインストール作業が完了した後、メインの GRUB ディレクトリが /boot/grub/
に作成されています。別の場所を指定する方法については GRUB/ヒントとテクニック#代替インストール方法 を見てください。grub-install
はファームウェアのブートマネージャにもエントリを作成しようとすることに注意してください。その名前は上記の例では GRUB
となります。しかし、ブートエントリが埋まっていると、これは失敗します。この場合は efibootmgr を使って必要ないエントリを削除してください。
設定を確定したあとにメインの設定ファイルを生成することを忘れないでください。
問題が発生した場合は 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-lock を使用する場合、GRUB をセキュアブートモードでブートさせるには、vmlinuz と initramfs のイメージが含まれているファイルシステムを読むために必要なモジュール全てが 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_video
、boot
、btrfs
、cat
、chain
、configfile
、echo
、efifwsetup
、efinet
、ext2
、fat
、font
、gettext
、gfxmenu
、gfxterm
、gfxterm_background
、gzio
、halt
、help
、hfsplus
、iso9660
、jpeg
、keystatus
、loadenv
、loopback
、linux
、ls
、lsefi
、lsefimmap
、lsefisystab
、lssal
、memdisk
、minicmd
、normal
、ntfs
、part_apple
、part_msdos
、part_gpt
、password_pbkdf2
、png
、probe
、reboot
、regexp
、search
、search_fs_uuid
、search_fs_file
、search_label
、sleep
、smbios
、squash4
、test
、true
、video
、xfs
、zfs
、zfscrypt
、zfsinfo
- x84_64-efi アーキテクチャ用の "プラットフォーム固有" のモジュール。例えば:
play
: ブート中に音を鳴らすcpuid
: ブート時に CPU の機能を確認するtpm
: Measured Boot / Trusted Platform Modules をサポートする
- "高度な" モジュール。以下が含まれます:
cryptodisk
: plain モードで暗号化されたディスクからブートするgcry_アルゴリズム
: 特定のハッシュアルゴリズムと暗号化アルゴリズムをサポートするluks
: LUKS で暗号化されたディスクからブートするlvm
: LVM 論理ボリュームディスクからブートするmdraid09
、mdraid1x
、raid5rec
、raid6rec
: 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/GRUB/grubx64.efi esp/boot/grubx64.efi
再起動し、MokManager で鍵を選択すれば、セキュアブートが機能するはずです。
セキュアブートを使用する
インストール後は、セキュアブート#セキュアブートを実現する を見て、セキュアブートを有効化する手順を確認してください。
CA 鍵の方法を取っている場合、鍵の管理や登録、ファイルの署名は sbctl で自動化できます。詳細は セキュアブート#sbctl でプロセスをアシスト を見てください。
BIOS システム
GUID Partition Table (GPT) 特有の手順
BIOS/GPT の構成では、BIOS ブートパーティションが必要です。GRUB は core.img
をこのパーティションに埋め込みます。
ディスク上にパーティションタイプ GUID 21686148-6449-6E6F-744E-656564454649
の、ファイルシステムの無い 1 メビバイト (fdisk や gdisk で +1M
) のパーティションを作成してください。
- fdisk では、パーティションタイプ
BIOS boot
を選択してください。 - gdisk では、パーティションタイプコード
ef02
を選択してください。 - parted では、そのパーティションで
bios_grub
フラグをセット/アクティブ化してください。
このパーティションはどのような順番で配置しても良いですが、ディスクの先頭 2 TiB 以内になければなりません。このパーティションは GRUB のインストール前に作成する必要があります。パーティションの準備が完了したら、以下の指示に従ってブートローダーをインストールします。
GPT のアライメント仕様から外れますが、最初のパーティションの前にあるスペースは BIOS ブートパーティションとしても使用できます。このパーティションは定期的にアクセスされるものではないのでパフォーマンスの問題は無視できますが、一部のディスクユーティリティは警告を発します。fdisk や gdisk では、セクター 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
です。ブロックデバイスの命名方法については デバイスファイル#ブロックデバイスの名前 を参照してください。
次に、メイン設定ファイルを生成する必要があります。
/boot
に LVM を使用している場合、GRUB を複数の物理ディスク上にインストールすることができます。
grub-install
コマンドの詳細については、grub-install(8) および GRUB Manual を参照してください。
設定
インストールされたシステムでは、GRUB は起動の度に設定ファイル /boot/grub/grub.cfg
をロードします。ツールを使う場合は、#grub.cfg の生成 を、手動で作成する場合は #grub.cfg のカスタマイズ を参照してください。
grub.cfg の生成
このセクションでは /etc/default/grub
設定ファイルの編集についてだけ扱っています。他のオプションは GRUB/ヒントとテクニック を見て下さい。
メイン設定ファイルの生成
インストールした後は、メインの設定ファイル /boot/grub/grub.cfg
を生成する必要があります。生成プロセスは、/etc/default/grub
内の様々なオプションや /etc/grub.d/
下のスクリプトによって制御されます。/etc/default/grub
におけるオプションのリストと、それぞれのオプションの簡潔な説明は、GNU のドキュメントを参照してください。
追加の設定をしていない場合、設定ファイル自動生成スクリプトは、ブートさせるシステムのルートファイルシステムを判定し、その情報を設定ファイルに保存します。これを成功させるには、システムを起動させているか、またはシステムに 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
文を設定ファイルに追加するからです。
カスタムのメニューエントリの例は #ブートメニューエントリの例 を見てください。
他の 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
その後、もう一度試してください。
Windows
UEFI モードでインストールされた Windows の場合、Windows Boot Manager (bootmgfw.efi
) を含んでいる EFI システムパーティションがマウントされていることを確認してください。root として os-prober
を実行すると、Windows のエントリを検出・生成します。
BIOS モードでインストールされた Windows の場合、Windows システムパーティション をマウントしてください (そのパーティションのファイルシステムラベルは System Reserved
(システムで予約済み
) か SYSTEM
であるはずです)。root として os-prober
を実行すると、Windows のエントリを検出・生成します。
追加引数
カスタムの追加引数を Linux イメージに渡すために、/etc/default/grub
で GRUB_CMDLINE_LINUX
と GRUB_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_RECOVERY
が true
に設定されていない必要があります。
詳細は カーネルパラメータ を参照してください。
トップレベルのメニューエントリを設定する
デフォルトでは、grub-mkconfig は、含まれているカーネルを sort -V
を使ってソートし、それらの中の最初のカーネルをトップレベルのエントリとして使用します。すなわち、例えば /boot/vmlinuz-linux-lts
は /boot/vmlinuz-linux
より前に来るので、linux-lts と linux の両方がインストールされている場合、LTS カーネルがトップレベルのメニューエントリとなります。これは、望ましくない場合があるでしょう。この挙動は、/etc/default/grub
内の GRUB_TOP_LEVEL=path_to_kernel"
を指定することでオーバーライドすることができます。例えば、標準のカーネルをトップレベルのメニューエントリにするには、GRUB_TOP_LEVEL="/boot/vmlinuz-linux"
を使用します。
LVM
/boot
や /
に LVM を使用している場合、lvm
モジュールをプリロードするようにしてください:
/etc/default/grub
GRUB_PRELOAD_MODULES="... lvm"
RAID
GRUB は RAID ボリュームの便利な管理手段を提供します。ボリュームをネイティブに管理できるようにするために、GRUB モジュール mdraid09
か mdraid1x
をロードする必要があります:
/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
が存在するパーティションを通常通り LUKS を使って暗号化してください。そして、以下のオプションを /etc/default/grub
に追加してください。
/etc/default/grub
GRUB_ENABLE_CRYPTODISK=y
このオプションは grub-install により使用され、grub の core.img
を生成します。
このオプションを追加した後やパーティションを暗号化した後に GRUB を(再)インストールすることを忘れないでください。
これだけだと、パスフレーズを2回入力させられることになります。1回目は起動の初期段階で GRUB が /boot
マウントポイントをアンロックするためのもので、2回目は iniramfs により実装されている root ファイルシステムそれ自体をアンロックするためのものです。キーファイルを使えば、これを防げます。
LUKS2
- GRUB 2.06 の LUKS2 に対するサポートは限られています。GRUB bug #55093 を参照してください。
grub-install
は LUKS2 のアンロックに使用できるコアイメージの作成をサポートしていません。回避策については、下記のコメントや grub-gitAUR のコメントを参照してください。- Argon2id (cryptsetup デフォルト) と Argon2i PBKDF はサポートされていません (GRUB bug #59409)。PBKDF2 のみのサポートです。
- #インストール セクションに書かれてある通りに
grub-install
を使用して、GRUB モジュールディレクトリを生成してください。上で説明したように/etc/default/grub
を編集してgrub-mkconfig -o /boot/grub/grub.cfg
を実行することを忘れずに。生成された EFI バイナリは LUKS2 をサポートしておらず、次のステップで置き換えられます。
/boot/grub/grub-pre.cfg
を作成します。UUID
は LUKS の暗号化デバイスの UUID に置き換えてください。ルートドライブが LUKS ボリューム内の LVM 論理ボリューム上にある場合は、crypto0
ではなくlvm/NameOfVolumeGroup-NameOfLogicalVolume
という形式を用いてください。それ以外の場合は、crypto0
を変更しないでください、これが GRUB の暗号化ボリュームの命名法です。
/boot/grub/grub-pre.cfg
set crypto_uuid=UUID cryptomount -u $crypto_uuid set root=crypto0 set prefix=($root)/boot/grub insmod normal normal
- LVM を使用する場合は
lvm
を追加してください。必要ならば、ext2
はbtrfs
か他のファイルシステムモジュールに置き換えてください。必要ならば、キースロットの設定に応じてgcry_sha256
はgcry_sha512
かgcry_whirlpool
に置き換えてください。Argon2 キースロットで grub-improved-luks2-gitAUR を使用している場合、pbkdf2
はargon2
に置き換えてください。
$ grub-mkimage -p /boot/grub -O x86_64-efi -c grub-pre.cfg -o /tmp/grubx64.efi luks2 part_gpt cryptodisk gcry_rijndael pbkdf2 gcry_sha256 ext2
GRUB が grub-pre.cfg
を見つけられない場合、上記を -c /boot/grub/grub-pre.cfg
に変更してください。
- ESP にコピーしてください:
# install -v /tmp/grubx64.efi esp/EFI/GRUB/grubx64.efi
起動中に無効なパスフレーズを入力して GRUB のレスキューシェルに入った場合、cryptomount -a
を実行してすべての (できれば1つだけ) 暗号化されたパーティションをマウントしてみてください。または、cryptomount -u $crypto_uuid
を使用して特定のパーティションをマウントしてください。その後、通常通り insmod normal
と normal
で進めてください。
正しいパスフレーズを入力したが 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.cfg
で bli
モジュールをロードしてください:
if [ "$grub_platform" = "efi" ]; then insmod bli fi
ブートメニューエントリの例
複数の GRUB エントリーを管理するヒントとして、例えば linux と linux-lts カーネルを同時使用している場合は GRUB/ヒントとテクニック#複数のエントリ を見てください。
Archiso と Archboot のブートメニューエントリについては マルチブート 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 バイナリをチェインロードできます。
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.efi
を esp/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 のブートローダーを実行することです。
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
このセクションを通して Windows のパーティションは /dev/sda1
にあると仮定します。パーティションが異なる場合は hd0,msdos1
という記述をすべて変更してください。
両方の例で 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
ラベルを使う
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 で利用できるコマンドには insmod
、ls
、set
、unset
があります。この例では set
と insmod
を使います。set
は変数を変更し insmod
は新しいモジュールを挿入して機能を追加します。
始める前に、ユーザーは自分の /boot
パーティションの位置を知っていなければなりません (分割パーティションなのか、root 下のサブディレクトリなのか):
grub rescue> set prefix=(hdX,Y)/boot/grub
X
は物理ドライブ番号、Y
はパーティション番号に置き換えてください。
コンソールの機能を拡張するために、linux
モジュールを挿入します:
grub rescue> insmod i386-pc/linux.mod
もしくは、単純に:
grub rescue> insmod linux
これで、より親しみのあるであろう linux
と initrd
のコマンドが使えます。
例えば、Arch Linux を起動する場合:
set root=(hd0,5) linux /boot/vmlinuz-linux root=/dev/sda5 initrd /boot/initramfs-linux.img boot
boot パーティションを分割している (例えば、UEFI を使用している場合など) なら、行を適宜変更する必要があります:
set root=(hd0,5) linux (hdX,Y)/vmlinuz-linux root=/dev/sda6 initrd (hdX,Y)/initramfs-linux.img boot
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)
BootOrder
で grub が最初のエントリになっている場合、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/sdXx
を root=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 を見てください。 - sysfs か procfs がある状態で grub-install を実行すると問題が発生し、
modprobe efivarfs
を実行しなければならないと言われる場合、efivarfs をマウントして上記のコマンドを実行してみてください。 --target
と--directory
オプションのどちらかがないと、grub-install
はどこにファームウェアをインストールすればいいのか決められません。そのような場合grub-install
はsource_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 でサポートされます (コミット).
grub-reboot で再設定されない
GRUB は Btrfs のルートパーティションに書き込むを行うことができません [5]。grub-reboot を使って他のエントリを起動した場合、ディスク上の環境を更新することができなくなります。(ディストリビューションを切り替えるなどの場合に) 他のエントリから grub-reboot を実行するか他のファイルシステムを使ってください。grub-editenv create
を実行して /etc/default/grub
に GRUB_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_TIMEOUT
が 0
に設定されていないかチェックしてください。0
に設定されていた場合、正の数に設定し直してください。この値はデフォルトの GRUB エントリが起動されるまでの秒数を表しています。GRUB_TIMEOUT_STYLE
が hidden
に設定されていないかもチェックしてください。hidden
に設定されていた場合、menu
に設定し直してください。これでメニューがデフォルトで表示されるようになります。以上が終わったら、メインの設定ファイルを再生成して、再起動してメニューが表示されるか確かめてください。
これでうまく行かない場合、グラフィカルターミナルとの互換性の問題があるのかもしれません。/etc/default/grub
で GRUB_TERMINAL_OUTPUT
を console
に設定し、GRUB のグラフィカルターミナルを無効化してください。