「GRUB」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎UEFI: 「デフォルト/フォールバックのブートパス」を追加)
(→‎UEFI: 「ファームウェアブートマネージャーに GRUB エントリを作成する」を追加(英語版より))
981行目: 981行目:
 
* {{ic|--target}} と {{ic|--directory}} オプションのどちらかがないと、{{ic|grub-install}} はどこにファームウェアをインストールすればいいのか決められません。そのような場合 {{ic|grub-install}} は {{ic|source_dir does not exist. Please specify --target or --directory}} というメッセージを表示します。
 
* {{ic|--target}} と {{ic|--directory}} オプションのどちらかがないと、{{ic|grub-install}} はどこにファームウェアをインストールすればいいのか決められません。そのような場合 {{ic|grub-install}} は {{ic|source_dir does not exist. Please specify --target or --directory}} というメッセージを表示します。
 
* grub-install を実行した後、パーティションが EFI パーティションではないというような表示がされる場合、おそらくパーティションが {{ic|Fat32}} ではありません。
 
* grub-install を実行した後、パーティションが EFI パーティションではないというような表示がされる場合、おそらくパーティションが {{ic|Fat32}} ではありません。
  +
  +
==== ファームウェアブートマネージャーに GRUB エントリを作成する ====
  +
  +
{{ic|grub-install}} は自動的にブートマネージャーにメニューエントリを追加しようと試みます。もし GRUB がそれを行わない場合、[[UEFI#efibootmgr]] を見て、{{ic|efibootmgr}} を使ってメニューエントリを作成する指示を読んでください。しかし、[[UEFI#ISO から UEFI ブータブル USB を作成する]] にあるように、よくある原因は CD/USB を UEFI モードで起動していないというものです。
   
 
==== レスキューシェルが起動する ====
 
==== レスキューシェルが起動する ====

2022年4月8日 (金) 20:29時点における版

この記事あるいはセクションは翻訳の途中です。
ノート: 記事の内容が古くなっています。飜訳のご協力または原文の方をご参照ください。 (議論: トーク:GRUB#)

関連記事

GRUB (GRand Unified Bootloader) はマルチブートローダー です。GRUB Legacy の後継の研究開発プロジェクト PUPA から GRUB は作られています。全てを整理するため GRUB はスクラッチから書きなおされモジュール性とポータビリティを獲得しました [1]。現在の GRUB は GRUB2 とも呼ばれ、GRUB Legacy はバージョン 0.9x に対応しています。 ​

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

目次

BIOS システム

GUID Partition Table (GPT) 特有の手順

GPT でパーティションされたシステムには core.img を埋め込むための MBR の隙間の領域がないので (GPT のプライマリヘッダーやプライマリパーティションテーブルに使われます)、BIOS-GPT の GRUB 設定では BIOS boot partition が必要になります。このパーティションは BIOS-GPT 環境の GRUB でだけ使われます。MBR パーティションではそのようなパーティションのタイプは存在しません (少なくとも GRUB にはありません)。システムが UEFI を使っている時も (ブートセクタの埋め込みがないので)、このパーティションは必要ありません。

BIOS-GPT 設定では gdisk, cgdisk, GNU Parted などを使って、ディスクの最初にファイルシステムのない 1007 KiB のパーティションを作成してください。1007 KiB という容量 (と先の GPT の 17 KiB) によって次に続くパーティションを 1024 KiB に正しくアライメントすることができます。必要であれば、ディスクの他の場所にこのパーティションを配置することもできますが、先頭の 2TiB の領域内である必要があります。パーティションタイプは (c)gdisk では ef02 に GNU Parted では set BOOT_PART_NUM bios_grub on に設定してください。

GPT パーティションはサポートしてないツールによって変更されるのを止めるための保護 MBR パーティションを作成します。この保護 MBR に cfdisk を使ってブータブルフラグを設定しないと、BIOS/EFI によっては起動しなくなる可能性があります。

ノート:
  • --target=i386-pc を使って grub-install の対象を i386-pc に明示的に指定する必要があります。そうしないとあなたの設定が EFI-GPT ではないかと grub-install が勘違いする可能性があるからです。
  • このパーティションは grub-installgrub-setup を実行する前に作成しておく必要があります
  • 他の全てのパーティションの後にこのパーティションを作成する場合、gdisk では容量の消費が一番少ない場所 (セクター 34-2047) にしか作成できません。なぜなら gdisk はパーティションを出来る限り 2048 セクター境界に自動アライメントするからです

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 をインストールできます。grub-legacyAUR がインストールされている場合は置き換えられます。次に以下の手順を実行します。

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

/dev/sdX は GRUB がインストールされる ディスク (パーティションではありません) です。例えば、/dev/sda/dev/nvme0n1 または /dev/mmcblk0 です。ブロックデバイスの命名方法については、デバイスファイル#ブロックデバイスの名前を参照してください。

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

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

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

UEFI システム

ノート: UEFI, GPT, ブートローダーのページをよく読んでおいてください。

GPT と ESP があるかどうか確認する

EFI を使って起動するにはディスク上に EFI System Partition (ESP) が必要になります。GPT は必ずしも必要ではありませんが、強く推奨されており、この記事では GPT を使う方法しか記述していません。Windows 8 など、既にオペレーティングシステムが動作している EFI が使えるコンピュータに Archlinux をインストールする場合、既に ESP は存在するはずです。GPT と ESP を確認するには、root で parted を使って起動に使いたいディスクのパーティションテーブル (例: /dev/sda) を表示して下さい。

# parted /dev/sda print

GPT なら、"Partition Table: gpt" と表示されます。EFI なら、vfat/fat32 ファイルシステムで 'boot' フラグが有効になっている小さな (512 MiB 以下) パーティションがあります。そのパーティション上には、"EFI" という名前のフォルダがあるはずです。これらの存在が確認できたのなら、それは ESP になります。そのパーティション番号を覚えておいて下さい。後で GRUB を ESP にインストールするときに使います。

ESP を作成する

ESP が存在しない場合、作成する必要があります。EFI システムパーティションの指示に従って ESP を作成してください。

インストール

ノート: それぞれのマザーボードの製造者によって UEFI は別々に実装されているということは有名です。GRUB や EFI が正しく動作しないという問題が起きたユーザーは下で説明されていること以外のハードウェア特有のケースについて詳しい手順を共有することが奨励されています。この記事では総合的なことしか書かれていないので、特別な場合については GRUB/EFI サンプルのページを見て下さい。

下のコマンドでは GRUB を x86_64-efi でインストールすると仮定しています (i686 環境用の IA32-efi を使うのなら下のコマンドの x86_64-efii386-efi に置き換えて下さい)。

Bash シェルにログインしていることを確認して下さい。例えば、Arch ISO から起動している場合:

# arch-chroot /mnt /bin/bash

grubefibootmgr パッケージをインストールしてください。GRUB はブートローダーであり、efibootmgr.efi ブータブルスタブを作成します (GRUB のインストールスクリプトによって使用されます)。

以下の手順では GRUB UEFI アプリケーションを $esp/EFI/grub にインストールして、モジュールを /boot/grub/x86_64-efi にインストールします。そして、grubx64.efi ブータブルスタブを $esp/EFI/grub に配置します。

ブートディレクトリとブートローダー ID を設定してインストールしてください。$esp は efi パーティションに置き換えて下さい (通常は /boot):

# grub-install --target=x86_64-efi --efi-directory=$esp --bootloader-id=grub
ヒント: bootloader-id に boot と指定した場合、EFI 変数がリセットされた場合やドライブを他のコンピュータに移した場合でもドライブから起動することができるようになります。通常は BIOS を使用する方法と同じようにドライブを選択することで使うことができます。Windows とデュアルブートする場合、Windows は EFI パーティションの EFI フォルダの中に boot という名前のフォルダを作成するので注意してください。このフォルダによって Windows の EFI ブートオプションが再作成されます。

インストールが完了するとメインの GRUB ディレクトリが /boot/grub/ に作成されます。

後で設定を変更した後は忘れずにメイン設定ファイルを生成してください。

ノート:
  • ディストリビューションによっては /boot/efi/boot/EFI ディレクトリが必要な場合がありますが、Arch では不要です。
  • オプション --efi-directory--bootloader-id は GRUB UEFI 専用です。--efi-directory は ESP のマウントポイントを指定します。このオプションと同じものとして以前は --root-directory が使われていました。
  • GRUB を BIOS システムで設定するときと異なり grub-install コマンドの最後に <device_path> オプション (例: /dev/sda) を使わないことに注意してください。UEFI のブートローダーは MBR やパーティションのブートセクタを全く使わないので <device_path> が指定されてもインストールスクリプトはそれを無視します。

問題が発生した場合は #UEFI を見て下さい。

特記事項

他のインストール方法

GRUB のブートファイルを全て EFI System Partition の中に収めたい時は、grub-install コマンドに --boot-directory=$esp を追加してください:

# grub-install --target=x86_64-efi --efi-directory=$esp --bootloader-id=grub --boot-directory=$esp --debug

このコマンドによって GRUB モジュールは $esp/grub に置かれます (このパスの最後の '/grub' はハードコードされています)。この方法を使うと、grub.cfg も EFI System Partition 上に作る必要があり、設定するときに正しい位置を grub-mkconfig に示す必要があります:

# grub-mkconfig -o $esp/grub/grub.cfg

設定の他のところは同じです。

UEFI ファームウェアの応急処置

UEFI ファームウェアによっては .efi ブータブルスタブが特定の名前で特定の場所に配置されていることが必要とされます: $esp/EFI/boot/bootx64.efi ($esp は UEFI パーティションのマウントポイントに置き換えて下さい)。そうしておかないと場合によって起動できなくなってしまうことがあります。幸いに、これを必要としない他のファームウェアでは問題は起きません。

応急処置を行うには、必要なディレクトリを作成して、それから grub の .efi スタブをコピーしてください:

# mkdir $esp/EFI/boot
# cp $esp/EFI/grub_uefi/grubx64.efi  $esp/EFI/boot/bootx64.efi

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

grub-install は自動でブートマネージャにメニューエントリを作成しようとします。作成されないときは、efibootmgr を使ってメニューエントリを作成してください。また、UEFI モードで CD/USB を起動できないような問題については Unified Extensible Firmware Interface#ISO から UEFI ブータブル USB を作成する を参照してください。

GRUB Standalone

ノート: grub パッケージには様々な grub-mkstandalone のフィックス (特に必須の ${cmdpath} サポート) が含まれていないのでスタンドアロンの GRUB EFI イメージでは grub-gitAUR パッケージを使って下さい。

全てのモジュールを UEFI アプリケーション内の memdisk に埋め込んだ grubx64_standalone.efi アプリケーションを作成することができ、これによって GRUB UEFI モジュールやその他関連ファイルが利用するディレクトリを別に持つ必要がなくなります。これを行うには grub に含まれている grub-mkstandalone コマンドを使います。

# echo 'configfile ${cmdpath}/grub.cfg' > /tmp/grub.cfg                                ## use single quotes, ${cmdpath}/grub.cfg should be present as it is
# grub-mkstandalone -d /usr/lib/grub/x86_64-efi/ -O x86_64-efi --modules="part_gpt part_msdos" --fonts="unicode" --locales="en@quot" --themes="" -o "$esp/EFI/grub/grubx64_standalone.efi"  "boot/grub/grub.cfg=/tmp/grub.cfg" -v
ノート: オプション --modules="part_gpt part_msdos" (クォート付き) は ${cmdpath} 機能を正しく動作させるために必要です。

それから GRUB の設定ファイルを $esp/EFI/grub/grub.cfg にコピーして efibootmgr を使って $esp/EFI/grub/grubx64_standalone.efi の UEFI Boot Manager エントリを作成してください。

技術的な情報

GRUB EFI のファイルはいつでも設定ファイルが ${prefix}/grub.cfg にあることを期待しています。しかしながらスタンドアロンの GRUB EFI ファイルでは、${prefix} は tar アーカイブの中に置かれスタンドアロンの GRUB EFI ファイルそれ自体に埋め込まれます (GRUB ではクォートのない "(memdisk)" で示される)。この tar アーカイブには通常の GRUB EFI インストールで /boot/grub に保存される全てのファイルが含まれています。

/boot/grub の中身がスタンドアロンのイメージに埋め込まれることによって、全てにおいて実際の (外部的な) /boot/grub を使うことはできなくなります。そのためスタンドアロンの GRUB EFI ファイルでは ${prefix}==(memdisk)/boot/grub とスタンドアロンの GRUB EFI ファイルは設定ファイルが ${prefix}/grub.cfg==(memdisk)/boot/grub/grub.cfg にあるとして読み込みます。

このためスタンドアロンの GRUB EFI ファイルに同じディレクトリにある外部的 grub.cfg を EFI ファイルとして読み込ませるには (GRUB では ${cmdpath} で示される)、GRUB に設定として ${cmdpath}/grub.cfg を使うように記述した /tmp/grub.cfg を作る必要があります ((memdisk)/boot/grub/grub.cfgconfigfile ${cmdpath}/grub.cfg コマンド)。それから grub-mkstandalone にこの /tmp/grub.cfg ファイルを ${prefix}/grub.cfg (実際には (memdisk)/boot/grub/grub.cfg) にコピーさせるためにオプション "/boot/grub/grub.cfg=/tmp/grub.cfg" を使います。

これでスタンドアロンの GRUB EFI ファイルと実際の grub.cfg は EFI System Partition の中のディレクトリに (同じディレクトリである限り) 保存することが出来るようになり、持ち運びが容易になります。

設定

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

grub.cfg の生成

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

ノート: /etc/default/grub に変更を加えた後は必ずメイン設定ファイルの再生成を行なって下さい。

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

インストールした後は、メインの設定ファイル grub.cfg を生成する必要があります。生成されるファイルは /etc/default/grub の様々なオプションや /etc/grub.d/ のスクリプトによって設定されます。これについては #設定 のセクションで説明しています。

ノート: /etc/default/grub/etc/grub.d/* に変更を加えた後は grub.cfg を再生成する必要があることを覚えておいて下さい。
警告: パッケージバージョン 1:2.02.beta2-1 (2014-01-10) から grub-mkconfig は異常な設定ファイルを作成するようになっています。生成される grub.cfg にはブートエントリが重複して含まれ、initramfs が見つからなかったりセルフコンパイルしたカーネルがメニューに表示されなかったりします (FS#38455)。

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

# grub-mkconfig -o /boot/grub/grub.cfg
ノート:
  • このファイルのパスは /boot/grub/grub.cfg です、/boot/grub/i386-pc/grub.cfg ではありません。
  • EFI システムでは、--boot-directory=$esp/EFI オプションを使って GRUB がインストールされた場合、grub.cfg ファイルは grubx64.efi と同じディレクトリにあるはずです。そうでないのなら、GRUB BIOS と同じように grub.cfg ファイルは /boot/grub/ にあります。
  • chroot や systemd-nspawn コンテナで grub-mkconfig を実行しようとした場合、grub-probe が "/dev/sdaX の正規パス" を取得できないといて動かないことがあります。この場合、ここに記述されているように arch-chroot を使ってみて下さい。

生成スクリプトはデフォルトで生成する設定に Arch Linux のメニューエントリを自動で追加します。しかしながら、他のオペレーティングシステムのエントリは設定しないといけません。BIOS システムでは os-prober をインストールすれば、マシンにインストールされている他のオペレーティングシステムを検知して、それぞれのエントリを grub.cfg に追加することができます。インストールされていれば、grub-mkconfig の実行時に os-prober が起動します。高度な設定は #デュアルブート を見てください。マルチブート USB ドライブ#ブートエントリも参照。

他の 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 を含めるために grub-mkconfig を実行するたびにパーティションをマウントすることを忘れないでください。
ヒント: 最後に選択したブートエントリを GRUB に記憶させたい場合もあるでしょう、GRUB/ヒントとテクニック#以前のエントリを思い出させる

を参照してください。

MS Windows

多くの場合、Windows を含むパーティションは os-prober によって自動的に検出されます。しかし、NTFS パーティションはデフォルトの Linux ドライバでマウントすると、必ずしも検出されないかもしれません。GRUB が検出しない場合、NTFS-3G をインストールして再マウントしてみてください。

暗号化された Windows パーティションは、マウントする前に暗号化を解除する必要があるかもしれません。BitLocker では、dislockerAUR で実行できます。これで os-prober が正しいエントリを追加出来ます。

追加引数

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

両方を使う必要はありませんが、上手く使えば便利です。例えば、GRUB_CMDLINE_LINUX_DEFAULT="resume=/dev/sdaX quiet" (sdaX はスワップパーティション) を使ってハイバネーションの後の復帰を有効にすることができます。生成された recovery ブートエントリでは resume やメニューエントリからの起動中のカーネルメッセージを表示しない quiet は使われません。そして、他の (標準の) メニューエントリではオプションとして使われます。

GRUB のリカバリエントリを生成するには /etc/default/grub#GRUB_DISABLE_RECOVERY=true をコメントアウトする必要があります。

また、GRUB_CMDLINE_LINUX="resume=/dev/disk/by-uuid/${swap_uuid}" を使うこともできます (${swap_uuid} は swap パーティションの UUID に置き換えて下さい)。

複数のエントリを使う時はダブルクォートの中でスペースで区切って下さい。resume と systemd の両方を使うなら次のようになります:

GRUB_CMDLINE_LINUX="resume=/dev/sdaX init=/usr/lib/systemd/systemd"

詳しくはカーネルパラメータを見て下さい。

LVM

LVM/boot で使っている場合、メニューエントリの行の前に次を追加してください:

insmod lvm

そしてメニューエントリで root を次のように指定してください:

set root=lvm/lvm_group_name-lvm_logical_boot_partition_name

サンプル:

# (0) Arch Linux
menuentry "Arch Linux" {
  insmod lvm
  set root=lvm/VolumeGroup-lv_boot
  # you can only set following two lines
  linux /vmlinuz-linux root=/dev/mapper/VolumeGroup-root ro
  initrd /initramfs-linux.img
}

RAID

GRUB には RAID ボリュームの便利な制御機能があります。ボリュームをネイティブに指定できる insmod mdraid09 または mdraid1x を追加する必要があります。例えば、/dev/md0 は次のようになります:

set root=(md/0)

一方パーティション済みの RAID ボリューム (例: /dev/md0p1) は次のとおりです:

set root=(md/0,1)

RAID1 を GPT ef02/'BIOS boot partition' のドライブ上の、/boot パーティション (もしくは RAID1 root パーティション上の /boot) で使っている場合に grub をインストールするには、ドライブの両方で grub-install を実行するだけです。例:

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

ここで /boot がある RAID1 アレイは /dev/sda/dev/sdb に収容されます。

ノート: GRUB は2015年9月現在 Btrfs の RAID 0/1/10 からの起動をサポートしていますが、RAID 5/6 からの起動はサポートしていません。RAID 5/6 では GRUB によってサポートされている mdadm を使ってください。

暗号化

Root パーティション

ルートファイルシステムを暗号化して GRUB で使用するには、mkinitcpioencrypt フックまたは sd-encrypt フック (systemd フックを使用している場合) を追加してください。詳しくは Dm-crypt/システム設定#mkinitcpioMkinitcpio#通常のフックを見てください。

encrypt フックを使う場合、cryptdevice パラメータを /etc/default/grub に追加してください。以下の例では、sda2 パーティションを /dev/mapper/cryptroot として暗号化しています:

/etc/default/grub
GRUB_CMDLINE_LINUX="cryptdevice=/dev/sda2:cryptroot"

sd-encrypt フックを使用する場合、luks.uuid を追加してください:

/etc/default/grub
GRUB_CMDLINE_LINUX="luks.uuid=UUID"

UUID は LUKS で暗号化したデバイスの UUID に置き換えてください。

/etc/default/grub を修正したら、メイン設定ファイルの生成を忘れずにしてください。

暗号化デバイスのブートローダー設定に関する詳細は、Dm-crypt/システム設定#ブートローダーを見て下さい。

ノート: /boot パーティションを暗号化したい場合、さらに設定が必要です。#Boot パーティションを見てください。
ヒント: GRUB Legacy の設定から更新する場合は、/boot/grub/menu.lst.pacsave を確認して適切なデバイス・ラベルを加えて下さい。kernel /vmlinuz-linux という文の後ろにあるはずです。
Boot パーティション

GRUB パラメータ GRUB_ENABLE_CRYPTODISK を使うことで LUKS ブロックデバイスを開くときに GRUB にパスワードを要求させて、設定を読み込んでブロックデバイスから initramfsカーネルをロードすることができます。このオプションは boot パーティションが暗号化されてないという問題を解決します。

/etc/default/grub に以下を追加することで機能が有効になります:

GRUB_ENABLE_CRYPTODISK=y

設定した後は /boot をマウントしてから grub-mkconfig を実行してメイン設定ファイルを生成してください。

以下のことに注意してください:

  • この機能を使うために /boot を別パーティションにする必要はありません。システムの root / ディレクトリツリー下に配置できます。ただし、どちらにしても起動するには二回パスフレーズを入力する必要があります。ひとつ目のパスワードは /boot マウントポイントのロックを解除して、ふたつ目のパスワードは root ファイルシステムのロックを解除します。
  • /boot マウントポイントも関連するシステムアップデートを実行するときは、暗号化された /boot のロックが解除されて initramfs やカーネルによって再マウントされている必要があります。/boot パーティションを分割している場合、/etc/crypttab にエントリとキーファイルを追加することで再マウントさせることができます。Dm-crypt/システム設定#crypttab を参照。
  • 特殊なキーマップを使っている場合、デフォルトの GRUB では反映されていません。LUKS ブロックデバイスのロックを解除するためにパスフレーズを入力するときに問題になります。
  • パスワードを入力するプロンプトに問題が発生する場合 (cryptouuid や cryptodisk のエラー、あるいは "device not found")、以下のように GRUB を再インストールしてみてください:
# grub-install --target=x86_64-efi --efi-directory=$esp --bootloader-id=grub --modules="part_gpt part_msdos"

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" パーティション(/)下にあるディレクトリを指定しても構いません)

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

ヒント: 以下のブートエントリは 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

代わりに、blkid を(root として)実行して、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 ReservedSYSTEM であり、サイズは約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 の制限 をご覧ください。

両方の例で XXXXXXXXXXXXXXXX はファイルシステムの 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 XXXXXXXXXXXXXXXX
		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 XXXXXXXXXXXXXXXX
		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 に自動で他のシステムを検索してほしい場合は、os-prober をインストールするとよいでしょう。

/etc/grub.d/40_custom と grub-mkconfig を使って自動生成する

他のエントリを追加する最適の方法は /etc/grub.d/40_custom/boot/grub/custom.cfg を編集することです。grub-mkconfig の実行時にこのファイルにエントリが自動で追加されます。 新しい行を追加した後、次を実行して grub.cfg を生成・更新してください:

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

UEFI-GPT モードでは:

# grub-mkconfig -o /boot/efi/EFI/GRUB/grub.cfg

例として、典型的な /etc/grub.d/40_custom ファイルは以下のようになります。これは Microsoft Windows 8 がプリインストールされている HP Pavilion 15-e056sl Notebook PC にあわせて作成されています。それぞれの menuentry は以下のエントリと同じような構造である必要があります。GRUB 内の UEFI パーティション /dev/sda2hd0,gpt2ahci0,gpt2 と記述するので注意してください (詳しくはここを見て下さい)。

/etc/grub.d/40_custom:

/etc/grub.d/40_custom
#!/bin/sh

exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.

menuentry "HP / Microsoft Windows 8.1" {
	echo "Loading HP / Microsoft Windows 8.1..."
	insmod part_gpt
	insmod fat
	insmod search_fs_uuid
	insmod chain
	search --fs-uuid --no-floppy --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2 763A-9CB6
	chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}

menuentry "HP / Microsoft Control Center" {
	echo "Loading HP / Microsoft Control Center..."
	insmod part_gpt
	insmod fat
	insmod search_fs_uuid
	insmod chain
	search --fs-uuid --no-floppy --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2 763A-9CB6
	chainloader /EFI/HP/boot/bootmgfw.efi
}

menuentry "System shutdown" {
	echo "System shutting down..."
	halt
}

menuentry "System restart" {
	echo "System rebooting..."
	reboot
}
GNU/Linux のメニューエントリ

他のディストリが sda2 パーティションに存在する場合:

menuentry "Other Linux" {
  set root=(hd0,2)
  linux /boot/vmlinuz (必要に応じて他のオプションを追加してください)
  initrd /boot/initrd.img (他のカーネルが使用している場合)
}
暗号化されている GNU/Linux のメニューエントリ
menuentry "Other Linux (Encrypted)"{
      insmod luks
      cryptomount (hd0,2)
      set root=(crypto0)
      linux /boot/vmlinuz cryptdevice=/dev/sda2:cryptroot root=/dev/mapper/cryptroot (必要に応じて他のオプションを追加してください)
      initrd /boot/initrd.img (他のカーネルが使用している場合)
}
FreeBSD のメニューエントリ

以下の3つの方法はどれも UFS(v2) でシングルパーティションに FreeBSD がインストールされている必要があります。ネストされた BSD パーティションテーブルが sda4 にある場合:

カーネルを直接ロードする
menuentry 'FreeBSD' {
	insmod ufs2
	set root='hd0,gpt4,bsd1'
	## or 'hd0,msdos4,bsd1', if using an IBM-PC (MS-DOS) style partition table
	kfreebsd /boot/kernel/kernel
	kfreebsd_loadenv /boot/device.hints
	set kFreeBSD.vfs.root.mountfrom=ufs:/dev/ada0s4a
	set kFreeBSD.vfs.root.mountfrom.options=rw
}
埋め込まれたブートレコードをチェインロード
menuentry 'FreeBSD' {
	insmod ufs2
	set root='hd0,gpt4,bsd1'
	chainloader +1
}
伝統的な BSD の 2nd stage ローダーを実行
menuentry 'FreeBSD' {
  insmod ufs2
  set root='(hd0,4)'
  kfreebsd /boot/loader
}
Windows XP のメニューエントリ

ここでは Windows のパーティションが sda3 にあると仮定しています。実際に windows があるパーティションではなく、インストール時に windows が作成したシステムの予約済みパーティションに set root と chainloader を設定する必要があります。あなたのシステムの予約済みパーティションが sda3 の場合:

# (2) Windows XP
menuentry "Windows XP" {
  set root="(hd0,3)"
  chainloader +1
}

Windows のブートローダーが GRUB とは完全に異なるハードドライブに存在する場合、Windows に GRUB が存在するのが最初のハードドライブだと信じこませる必要があるかもしれません。これは drivemap を使ってできます。GRUB が hd0 に、Windows が hd2 にあるとするには、set root の後に次を追加してください:

drivemap -s hd0 hd2
UEFI-GPT モードでインストールされた Windows のメニューエントリ
if [ "${grub_platform}" == "efi" ]; then
  menuentry "Microsoft Windows Vista/7/8/8.1 UEFI-GPT" {
    insmod part_gpt
    insmod fat
    insmod search_fs_uuid
    insmod chain
    search --fs-uuid --set=root $hints_string $fs_uuid
    chainloader /EFI/Microsoft/Boot/bootmgfw.efi
  }
fi

$hints_string$fs_uuid は以下の2つのコマンドで知ることができます。$fs_uuid のコマンドは:

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

$hints_string のコマンドは:

# 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 の EFI ファイルのパスが異なっている可能性があります。

"シャットダウン" メニューエントリ
menuentry "System shutdown" {
	echo "System shutting down..."
	halt
}
"再起動" メニューエントリ
menuentry "System restart" {
	echo "System rebooting..."
	reboot
}
"ファームウェア設定" メニューエントリ (UEFI のみ)
menuentry "Firmware setup" {
	fwsetup
}
BIOS-MBR モードでインストールされた Windows
ノート: GRUB は bootmgr の直接起動をサポートしており、もはや BIOS-MBR 環境で Windows を起動するためにパーティションブートセクタのチェインロードをする必要はありません。
警告: bootmgr が存在するのはシステムパーティションであり、"実際に使っている" Windows のパーティション (一般的に C:) ではありません。blkid で全ての UUID を表示した際、システムパーティションは LABEL="SYSTEM RESERVED" もしくは LABEL="SYSTEM" のパーティションであり容量は僅か 100 MB から 200 MB (Arch の boot パーティションとほぼ同じ大きさ) です。詳細は Wikipedia:System partition and boot partition を参照してください。

このセクションでは、あなたの Windows パーティションは /dev/sda1 だと仮定しています。違うパーティションを使っている場合は全ての hd0,msdos1 を修正しなくてはなりません。最初に、bootmgr と関連ファイルがある Windows のシステムパーティションの NTFS ファイルシステムの UUID を見つけて下さい。例えば、Windows の bootmgr/media/SYSTEM_RESERVED/bootmgr に存在する場合:

Windows Vista/7/8 では:

# grub-probe --target=fs_uuid /media/SYSTEM_RESERVED/bootmgr
69B235F6749E84CE
# grub-probe --target=hints_string /media/SYSTEM_RESERVED/bootmgr
--hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1
ノート: Windows XP では、上記のコマンドにある bootmgrNTLDR に置き換えて下さい。さらに、SYSTEM_RESERVED パーティションは存在しない可能性があることに注意してください; あなたの Windows パーティション上に NTLDR ファイルがないか調べて下さい。

次に、BIOS-MBR モードでインストールされた Windows (XP, Vista, 7, 8, 10) を起動するために下のコードを /etc/grub.d/40_custom/boot/grub/custom.cfg に追加して、上で説明したように grub-mkconfig を使って grub.cfg を再生成してください:

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 search_fs_uuid
    insmod ntldr     
    search --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 69B235F6749E84CE
    ntldr /bootmgr
  }
fi

Windows XP では:

if [ "${grub_platform}" == "pc" ]; then
  menuentry "Microsoft Windows XP" {
    insmod part_msdos
    insmod ntfs
    insmod search_fs_uuid
    insmod ntldr     
    search --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 69B235F6749E84CE
    ntldr /bootmgr
  }
fi

上記で使っているパーティションの UUID の例である 69B235F6749E84CElsblk --fs コマンドで確認できます。

ノート: たまに (Windows 8 で GRUB をインストールした場合など)、\boot\bcd でエラーが起こって Windows を起動できなくなることがあります (エラーコード 0xc000000f)。Windows の回復コンソール (インストールディスクから cmd) を使って以下を実行することで修復することが可能です:
x:\> "bootrec.exe /fixboot" 
x:\> "bootrec.exe /RebuildBcd".
bootrec.exe /Fixmbr を使わないで下さい、GRUB が消去されてしまいます。

/etc/grub.d/40_custom をテンプレートとして使って /etc/grub.d/nn_custom を作成することができます。nn は優先順位を定義し、スクリプトが実行される順番を示します。スクリプトが実行される順番で grub のブートメニューの場所が決まります。

ノート: 最初に必要なスクリプトが実行されるように nn は 06 よりも大きな値にするべきです。

EasyBCD と NeoGRUB を使って Windows とデュアルブート

現在 EasyBCD の NeoGRUB は GRUB のメニューフォーマットを認識しないので、C:\NST\menu.lst ファイルの中身を以下のように置き換えることでチェインロードしてください:

default 0
timeout 1
title       Chainload into GRUB v2
root        (hd0,7)
kernel      /boot/grub/i386-pc/core.img

そして、grub-mkconfig を使って grub.cfg を再生成してください。

parttool for hide/unhide

C:\ ディスクを隠している Windows 9x がある場合、GRUB は parttool を使ってディスクを隠したり表示したりすることができます。例えば、3つの Windows 9x インストールがあり3番目の C:\ ディスクを起動するには CLI に入り以下を実行してください:

parttool hd0,1 hidden+ boot-
parttool hd0,2 hidden+ boot-
parttool hd0,3 hidden- boot+
set root=hd0,3
chainloader +1
boot

コマンドシェルを使う

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

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

sh: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) やパーティションの最初に埋め込むことができます。

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

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

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

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

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

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

ディスクやドライブのチェインロード

set root=hdX
chainloader +1
boot

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

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

insmod ntfs を使うことで ntfs ファイルシステムモジュールをロードして Windows をロードすることができます。上記の例では (hd0,gpt4) または /dev/sda4 が EFI System Partition (ESP) です。chainloader 行のエントリはチェインロードする .efi ファイルのパスを指定しています。

通常のロード

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

rescue コンソールを使う

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

GRUB rescue で利用できるコマンドには insmod, ls, set, unset があります。この例では 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 パーティションを分割しているなら、行を変更する必要があります:

ノート: 上の 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 を消去

一般に、grub を消去するにはインストール手順を逆の順番で行う必要があります。おそらく最後には残ったものをすべて綺麗にします。しかし、作業を始める前に、grub を削除した後に PC が起動するかどうかや、どう起動させるかを考えておかなければなりません。grub を削除したい理由はおそらく他のブートローダーを使いたくなったからでしょう。安全ですが少し難しい方法は grub を削除する前に他のブートローダーが動作することを確認することです。

他のブートローダーをインストールする前に grub を削除するときでも、他の如何なる場合でも、UEFI の場合は以下を実行してください:

$ efibootmgr

そして、他のブートローダーが BootOrder の行にあることを確認してください。もし grub が削除されていない場合、他のブートローダーが grub の前にあるはずです。もし grub がすでに削除されている場合、grub はその行に存在しないはずです。しかし、これは PC が他のブートローダーを起動するための必要条件であり、十分条件ではないことに注意してください。また、grub を完全に削除するための十分条件でもありません。

UEFI マシンと非 UEFI マシンの両方において、grub-installgrub のインストール作業の一部として手動で実行されます。UEFI の場合、grub-install は仕事の1つとして efibootmgr --create の実行と等価なことを行います。grub を削除するには grub-install の成果物を削除する必要があります。efibootmgr --create と反対のことをするコマンドは efibootmgr --delete-bootnum やこれと等価なプログラムです。efibootmgr --delete-bootnum コマンドを実行すべきブートエントリの番号を得る一つの方法は(引数なしの) efibootmgr の出力です。

grub-install/boot/grub ディレクトリを作成し、これは手動で削除する必要があります。しかし、grub を再びインストールするためにこのディレクトリを残しておきたいユーザーもいるでしょう。

GPT/UEFI に移行した後に MBR boot code を削除したい場合は dd を使ってください:

# dd if=/dev/zero of=/dev/sdX bs=440 count=1

トラブルシューティング

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

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 パーティションからブートファイルを正しく読み込むことができません。

Intel BIOS が GPT をブートしない

MBR

Intel BIOS によっては起動時に最低でも1つ起動可能な MBR パーティションが必要なため、GPT でパーティションされたブートセットアップが起動できなくなることがあります。

この問題は fdisk を使って GPT パーティションのひとつ (GRUB のために作成した 1007 KiB のパーティションが好ましい) を MBR でブータブルだと印をつけることで回避できます。fdisk を使って次のコマンドを実行してください: fdisk をインストールするディスクで起動し (例: fdisk /dev/sda)、a を押してから数字を入力してブータブルにしたいパーティション (おそらく #1) を選択してください。最後に w を押して変更を MBR に書き込みます。

ノート: ブータブルの設定は GParted ではなく、fdisk などで行う必要があります。GParted は MBR で bootable フラグを設定しないからです。

最新版の parted では disk_toggle pmbr_boot オプションを使うことができます。実行後 Disk Flags に pmbr_boot と表示されることを確認してください。

# parted /dev/sdx disk_toggle pmbr_boot
# parted /dev/sdx print

詳細は ここ から見ることができます。

EFI パス

UEFI ファームウェアによっては UEFI NVRAM ブートエントリを表示する前に特定の場所にブータブルファイルを必要とします。この場合、grub-installefibootmgr に GRUB をブートするエントリを追加するように指示しますが、VisualBIOS のブートオーダーセレクタではエントリが表示されません。解決方法は特定の場所にファイルを配置することです。EFI パーティションが /boot/efi/ の場合、以下のコマンドで解決します:

mkdir /boot/efi/EFI/boot
cp /boot/efi/EFI/grub/grubx64.efi /boot/efi/EFI/boot/bootx64.efi

この解決方法は2014年1月、Intel DH87MC マザーボードのファームウェアで確認しました。

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

以下を 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

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

  • grub-install の実行時に sysfs や procfs に関する問題が表示される場合、modprobe efivars を実行してください。Unified Extensible Firmware Interface#UEFI 変数 を参照。
  • --target--directory オプションのどちらかがないと、grub-install はどこにファームウェアをインストールすればいいのか決められません。そのような場合 grub-installsource_dir does not exist. Please specify --target or --directory というメッセージを表示します。
  • grub-install を実行した後、パーティションが EFI パーティションではないというような表示がされる場合、おそらくパーティションが Fat32 ではありません。

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

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

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

GRUB がロードしたときにエラーを表示せずにレスキューシェルを起動する場合、おそらく grub.cfg が存在しなかったり間違った場所に置かれていることが原因です。GRUB UEFI を --boot-directory でインストールして grub.cfg がなかったり、ブートパーティションのパーティション番号 (grubx64.efi ファイルにハードコードされています) が変更されているときにこの問題が発生します。

GRUB UEFI がロードされない

EFI の動作の例:

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

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

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

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

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

# 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 のデバイス設定を移動(削除)して再設定してください:

# 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 がカーネルと initial ramdisk をロードした後、エラーを出さずにブートが固まる場合、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 の中にない可能性があります [2]。適当なパーティショニングツールを使ってパーティションが最初の 2TB 以内にあるようにして、GRUB を再インストール・再設定してください。

grub-reboot で再設定されない

GRUB は Btrfs のルートパーティションに書き込むを行うことができません [3]。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' doesn't support blocklists.

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

Windows 8/10 が認識されない

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

VirtualBox EFI モード

バージョン6.1以前の VirtualBox では デフォルト/フォールバックのブートパス に GRUB をインストールしてください。

Device /dev/xxx not initialized in udev database even after waiting 10000000 microseconds

​ If grub-mkconfig hangs and gives error: WARNING: Device /dev/xxx not initialized in udev database even after waiting 10000000 microseconds. ​ You may need to provide /run/lvm/ access to the chroot environment using: ​

# mkdir /mnt/hostlvm
# mount --bind /run/lvm /mnt/hostlvm
# arch-chroot /mnt
# ln -s /hostlvm /run/lvm

​ See FS#61040 and workaround. ​

GRUB rescue and encrypted /boot

​ When using an encrypted /boot, and you fail to input a correct password, you will be dropped in grub-rescue prompt. ​ This grub-rescue prompt has limited capabilities. Use the following commands to complete the boot:

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

​ See this blog post for a better description.

参照