GRUB
関連記事
GRUB (GRand Unified Bootloader) はマルチブートローダー です。GRUB Legacy の後継の研究開発プロジェクト PUPA から GRUB は作られています。全てを整理するため GRUB はスクラッチから書きなおされモジュール性とポータビリティを獲得しました [1]。現在の GRUB は GRUB2 とも呼ばれ、GRUB Legacy はバージョン 0.9x に対応しています。
目次
- 1 BIOS システム
- 2 UEFI システム
- 3 設定
- 4 コマンドシェルを使う
- 5 GRUB を消去
- 6 トラブルシューティング
- 6.1 サポートのないファイルシステム
- 6.2 Intel BIOS が GPT をブートしない
- 6.3 デバッグメッセージを有効にする
- 6.4 msdos-style エラーメッセージ
- 6.5 UEFI
- 6.6 Invalid signature
- 6.7 起動中にフリーズする
- 6.8 他の OS から Arch が見つからない
- 6.9 chroot でインストールした時に警告が表示される
- 6.10 GRUB のロードが遅い
- 6.11 error: unknown filesystem
- 6.12 grub-reboot で再設定されない
- 6.13 Btrfs のせいでインストールができない
- 6.14 Windows 8/10 が認識されない
- 6.15 VirtualBox EFI モード
- 6.16 Device /dev/xxx not initialized in udev database even after waiting 10000000 microseconds
- 6.17 grub-rescue プロンプトと暗号化済み /boot
- 6.18 GRUB をインストールしたが起動時にメニューが表示されない
- 7 参照
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 によっては起動しなくなる可能性があります。
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 を複数の物理ディスクにインストールすることができます。
grub-install
コマンドの詳細については、grub-install(8) および GRUB Manual を参照してください。
UEFI システム
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 を作成してください。
インストール
下のコマンドでは GRUB を x86_64-efi
でインストールすると仮定しています (i686 環境用の IA32-efi
を使うのなら下のコマンドの x86_64-efi
を i386-efi
に置き換えて下さい)。
Bash シェルにログインしていることを確認して下さい。例えば、Arch ISO から起動している場合:
# arch-chroot /mnt /bin/bash
grub と efibootmgr パッケージをインストールしてください。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
インストールが完了するとメインの GRUB ディレクトリが /boot/grub/
に作成されます。
後で設定を変更した後は忘れずにメイン設定ファイルを生成してください。
問題が発生した場合は #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
全てのモジュールを 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
それから 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.cfg
の configfile ${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/ヒントとテクニック を見て下さい。
メイン設定ファイルの生成
インストールした後は、メインの設定ファイル grub.cfg
を生成する必要があります。生成されるファイルは /etc/default/grub
の様々なオプションや /etc/grub.d/
のスクリプトによって設定されます。これについては #設定 のセクションで説明しています。
grub-mkconfig ツールを使って grub.cfg
を生成してください:
# grub-mkconfig -o /boot/grub/grub.cfg
生成スクリプトはデフォルトで生成する設定に 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 を追加、もしくはコメントアウトを外します。
その後、もう一度試してください。
を参照してください。
MS Windows
多くの場合、Windows を含むパーティションは os-prober によって自動的に検出されます。しかし、NTFS パーティションはデフォルトの Linux ドライバでマウントすると、必ずしも検出されないかもしれません。GRUB が検出しない場合、NTFS-3G をインストールして再マウントしてみてください。
暗号化された Windows パーティションは、マウントする前に暗号化を解除する必要があるかもしれません。BitLocker では、dislockerAUR で実行できます。これで os-prober が正しいエントリを追加出来ます。
追加引数
カスタムの追加引数を Linux イメージに渡すために、/etc/default/grub
で GRUB_CMDLINE_LINUX
と GRUB_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
に収容されます。
暗号化
Root パーティション
ルートファイルシステムを暗号化して GRUB で使用するには、mkinitcpio に encrypt
フックまたは sd-encrypt
フック (systemd フックを使用している場合) を追加してください。詳しくは Dm-crypt/システム設定#mkinitcpio や Mkinitcpio#通常のフックを見てください。
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 パーティション
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 エントリーを管理するヒントとして、例えば 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
代わりに、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
このセクションを通して Windows のパーティションは /dev/sda1
にあると仮定します。パーティションが異なる場合は hd0,msdos1
という記述をすべて変更してください。
両方の例で 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
ラベルを使う
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" シェルが出ます:
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
があります。この例では 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 パーティションを分割しているなら、行を変更する必要があります:
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 を消去
一般に、grub を消去するにはインストール手順を逆の順番で行う必要があります。おそらく最後には残ったものをすべて綺麗にします。しかし、作業を始める前に、grub を削除した後に PC が起動するかどうかや、どう起動させるかを考えておかなければなりません。grub を削除したい理由はおそらく他のブートローダーを使いたくなったからでしょう。安全ですが少し難しい方法は grub を削除する前に他のブートローダーが動作することを確認することです。
他のブートローダーをインストールする前に grub を削除するときでも、他の如何なる場合でも、UEFI の場合は以下を実行してください:
$ efibootmgr
そして、他のブートローダーが BootOrder
の行にあることを確認してください。もし grub が削除されていない場合、他のブートローダーが grub の前にあるはずです。もし grub がすでに削除されている場合、grub はその行に存在しないはずです。しかし、これは PC が他のブートローダーを起動するための必要条件であり、十分条件ではないことに注意してください。また、grub を完全に削除するための十分条件でもありません。
UEFI マシンと非 UEFI マシンの両方において、grub-install
は grub のインストール作業の一部として手動で実行されます。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/sdXx
を root=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 に書き込みます。
最新版の 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-install
は efibootmgr
に 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-install
はsource_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/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' 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
grub-mkconfig が止まって以下のようなエラーを吐く場合:
WARNING: Device /dev/xxx not initialized in udev database even after waiting 10000000 microseconds
chroot 環境が /run/lvm/
にアクセスできるようにする必要があります:
# mkdir /mnt/hostlvm # mount --bind /run/lvm /mnt/hostlvm # arch-chroot /mnt # ln -s /hostlvm /run/lvm
grub-rescue プロンプトと暗号化済み /boot
暗号化済みの /boot を使用している場合に間違ったパスワードを入力してしまうと grub-rescue プロンプトに入ります。
この grub-rescue プロンプトでは出来ることが限られています。以下のコマンドを使ってブートを完了させます:
grub rescue> cryptomount <partition> grub rescue> insmod normal grub rescue> normal
より良い説明は このブログ投稿をご覧ください。
GRUB をインストールしたが起動時にメニューが表示されない
/etc/default/grub
を見て GRUB_TIMEOUT
が 0
に設定されていないかチェックしてください。0
に設定されていた場合、正の数に設定し直してください。この値はデフォルトの GRUB エントリが起動されるまでの秒数を表しています。GRUB_TIMEOUT_STYLE
が hidden
に設定されていないかもチェックしてください。hidden
に設定されていた場合、menu
に設定し直してください。これでメニューがデフォルトで表示されるようになります。以上が終わったら、メインの設定ファイルを再生成して、再起動してメニューが表示されるか確かめてください。