Difference between revisions of "GRUB (日本語)"

From ArchWiki
Jump to: navigation, search
(GRUB Standalone - 技術的な情報)
m
Line 14: Line 14:
 
[[zh-TW:GRUB2]]
 
[[zh-TW:GRUB2]]
 
{{Related articles start (日本語)}}
 
{{Related articles start (日本語)}}
 +
{{Related|GRUB Legacy}}
 
{{Related2|Arch Boot Process (日本語)|Arch Boot Process}}
 
{{Related2|Arch Boot Process (日本語)|Arch Boot Process}}
 
{{Related2|Boot Loaders (日本語)|ブートローダ}}
 
{{Related2|Boot Loaders (日本語)|ブートローダ}}
Line 22: Line 23:
 
{{Related articles end}}
 
{{Related articles end}}
  
[https://www.gnu.org/software/grub/ GRUB] - [[GRUB Legacy]] と混同しないでください - は次世代の GRand Unified Bootloader です。GRUB Legacy の後継の研究開発プロジェクト [http://www.nongnu.org/pupa/ PUPA] から GRUB は作られています。全てを整理するため GRUB はスクラッチから書きなおされモジュール性とポータビリティを獲得しました [https://www.gnu.org/software/grub/grub-faq.html#q1]。
+
[https://www.gnu.org/software/grub/ GRUB] は次世代の GRand Unified Bootloader です。GRUB Legacy の後継の研究開発プロジェクト [http://www.nongnu.org/pupa/ PUPA] から GRUB は作られています。全てを整理するため GRUB はスクラッチから書きなおされモジュール性とポータビリティを獲得しました [https://www.gnu.org/software/grub/grub-faq.html#q1]。
  
 
手短に言えば、''ブートローダー''はコンピューターが起動した時に最初に走るソフトウェアプログラムです。Linux カーネルのロードとコントロールの移譲を担当しています。そして、カーネルはオペレーションシステムの他全てを初期化します。
 
手短に言えば、''ブートローダー''はコンピューターが起動した時に最初に走るソフトウェアプログラムです。Linux カーネルのロードとコントロールの移譲を担当しています。そして、カーネルはオペレーションシステムの他全てを初期化します。
Line 64: Line 65:
 
GPT でパーティションされたシステムには {{ic|core.img}} を埋め込むための MBR の隙間の領域がないので (GPT のプライマリヘッダーやプライマリパーティションテーブルに使われます)、[[GUID Partition Table (日本語)|BIOS-GPT]] の GRUB 設定では [http://www.gnu.org/software/grub/manual/html_node/BIOS-installation.html BIOS boot partition] が必要になります。このパーティションは BIOS-GPT 環境の GRUB でだけ使われます。MBR パーティションではそのようなパーティションのタイプは存在しません (少なくとも GRUB にはありません)。システムが UEFI を使っている時も (ブートセクタの埋め込みがないので)、このパーティションは必要ありません。
 
GPT でパーティションされたシステムには {{ic|core.img}} を埋め込むための MBR の隙間の領域がないので (GPT のプライマリヘッダーやプライマリパーティションテーブルに使われます)、[[GUID Partition Table (日本語)|BIOS-GPT]] の GRUB 設定では [http://www.gnu.org/software/grub/manual/html_node/BIOS-installation.html BIOS boot partition] が必要になります。このパーティションは BIOS-GPT 環境の GRUB でだけ使われます。MBR パーティションではそのようなパーティションのタイプは存在しません (少なくとも GRUB にはありません)。システムが UEFI を使っている時も (ブートセクタの埋め込みがないので)、このパーティションは必要ありません。
  
BIOS-GPT 設定では gdisk, cgdisk, GNU Parted などを使って、ディスクの最初にファイルシステムのない 1007 KiB のパーティションを作成してください。1007 KiB という容量によって次に続くパーティションを 1024 KiB に正しくアライメントすることができます。必要であれば、ディスクの他の場所にこのパーティションを配置することもできますが、先頭の 2TiB の領域内である必要があります。パーティションタイプは (c)gdisk では {{ic|ef02}} に GNU Parted では {{ic|set ''BOOT_PART_NUM'' bios_grub on}} に設定してください。
+
BIOS-GPT 設定では gdisk, cgdisk, GNU Parted などを使って、ディスクの最初にファイルシステムのない 1007 KiB のパーティションを作成してください。1007 KiB という容量 (と先の GPT の 17 KiB) によって次に続くパーティションを 1024 KiB に正しくアライメントすることができます。必要であれば、ディスクの他の場所にこのパーティションを配置することもできますが、先頭の 2TiB の領域内である必要があります。パーティションタイプは (c)gdisk では {{ic|ef02}} に GNU Parted では {{ic|set ''BOOT_PART_NUM'' bios_grub on}} に設定してください。
  
 
GPT パーティションはサポートしてないツールによって変更されるのを止めるための保護 MBR パーティションを作成します。この保護 MBR に cfdisk を使ってブータブルフラグを設定しないと、BIOS/EFI によっては起動しなくなる可能性があります。
 
GPT パーティションはサポートしてないツールによって変更されるのを止めるための保護 MBR パーティションを作成します。この保護 MBR に cfdisk を使ってブータブルフラグを設定しないと、BIOS/EFI によっては起動しなくなる可能性があります。
  
 
{{Note|
 
{{Note|
 +
* {{ic|<nowiki>--target=i386-pc</nowiki>}} を使って {{ic|grub-install}} の対象を {{ic|i386-pc}} に明示的に指定する必要があります。そうしないとあなたの設定が EFI-GPT ではないかと {{ic|grub-install}} が勘違いする可能性があるからです。
 
* このパーティションは {{ic|grub-install}} や {{ic|grub-setup}} を実行する前に作成しておく必要があります
 
* このパーティションは {{ic|grub-install}} や {{ic|grub-setup}} を実行する前に作成しておく必要があります
 
* 他の全てのパーティションの後にこのパーティションを作成する場合、gdisk では容量の消費が一番少ない場所 (セクター 34-2047) にしか作成できません。なぜなら gdisk はパーティションを出来る限り 2048 セクター境界に自動アライメントするからです
 
* 他の全てのパーティションの後にこのパーティションを作成する場合、gdisk では容量の消費が一番少ない場所 (セクター 34-2047) にしか作成できません。なぜなら gdisk はパーティションを出来る限り 2048 セクター境界に自動アライメントするからです
Line 96: Line 98:
  
 
=== BIOS システム ===
 
=== BIOS システム ===
 +
 +
{{Note|Arch ライブ CD から[[Installation Guide (日本語)|初期設定]]を行っているときは、grub をインストールする前にインストールしたシステムに chroot してください。CD 自体の grub のインストールスクリプトを使うと {{ic|grub.cfg}} がおかしくなったりして、システムが起動しなくなる問題が発生する可能性があります。}}
  
 
[[Official Repositories (日本語)|公式リポジトリ]] にある {{Pkg|grub}} パッケージから GRUB を[[pacman (日本語)|インストール]]できます。{{AUR|grub-legacy}} がインストールされている場合は置き換えられます。
 
[[Official Repositories (日本語)|公式リポジトリ]] にある {{Pkg|grub}} パッケージから GRUB を[[pacman (日本語)|インストール]]できます。{{AUR|grub-legacy}} がインストールされている場合は置き換えられます。
  
 
{{Note|パッケージをインストールするだけでは {{ic|/boot/grub/i386-pc/core.img}} ファイルや {{ic|/boot/grub/i386-pc}} 内の GRUB モジュールは更新されません。下で説明されているように {{ic|grub-install}} を使って手動でアップデートする必要があります。}}
 
{{Note|パッケージをインストールするだけでは {{ic|/boot/grub/i386-pc/core.img}} ファイルや {{ic|/boot/grub/i386-pc}} 内の GRUB モジュールは更新されません。下で説明されているように {{ic|grub-install}} を使って手動でアップデートする必要があります。}}
 
インストールする前に、あなたのディスクの正しい UUID を {{ic|grub.cfg}} に挿入してください:
 
 
# grub-mkconfig -o /boot/grub/grub.cfg
 
  
 
==== ブートファイルをインストール ====
 
==== ブートファイルをインストール ====
Line 118: Line 118:
 
{{Note|この方法は GRUB を (MBR か GPT で) パーティション済みのディスクにインストールして、GRUB ファイルを {{ic|/boot/grub}} に第1ステージコードを440バイトの MBR ブートコード領域にインストールする方法です (MBR パーティションテーブルとは違います)。パーティションレスディスク (super-floppy) については [[#パーティションやパーティションレスディスクにインストールする]] を参照してください。}}
 
{{Note|この方法は GRUB を (MBR か GPT で) パーティション済みのディスクにインストールして、GRUB ファイルを {{ic|/boot/grub}} に第1ステージコードを440バイトの MBR ブートコード領域にインストールする方法です (MBR パーティションテーブルとは違います)。パーティションレスディスク (super-floppy) については [[#パーティションやパーティションレスディスクにインストールする]] を参照してください。}}
  
440バイトの Master Boot Record ブートコード領域に {{ic|grub}} をセットアップするには、{{ic|/boot/grub}} ディレクトリを作り、{{ic|/boot/grub/i386-pc/core.img}} ファイルを生成して、それを 31 KiB の (最低限の容量 - パーティションのアライメントによって変化します) MBR の後の領域 (もしくは GPT でパーティションされたディスクの場合 BIOS Boot Partition、parted では {{ic|bios_grub}} フラグ、gdisk では EF02 タイプコードで示される) に埋め込み、設定ファイルを生成します。次を実行してください:
+
440バイトの Master Boot Record ブートコード領域に GRUB をセットアップするには、{{ic|/boot/grub}} ディレクトリを作り、{{ic|/boot/grub/i386-pc/core.img}} ファイルを生成して、それを 31 KiB の (最低限の容量 - パーティションのアライメントによって変化します) MBR の後の領域 (もしくは GPT でパーティションされたディスクの場合 BIOS Boot Partition、parted では {{ic|bios_grub}} フラグ、gdisk では EF02 タイプコードで示される) に埋め込み、設定ファイルを生成します。次を実行してください:
  
 
  # grub-install --target=i386-pc --recheck --debug /dev/sda
 
  # grub-install --target=i386-pc --recheck --debug /dev/sda
Line 160: Line 160:
 
  Installation finished. No error reported.
 
  Installation finished. No error reported.
  
デフォルトで {{ic|grub-setup}} がパーティションやパーティションレスディスクへのインストールをしないようになっている理由は、この場合に限って {{ic|grub}} がパーティションのブートセクタにある埋め込みブロックリストを使って {{ic|/boot/grub/i386-pc/core.img}} ファイルと prefix ディレクトリ {{ic|/boot/grub}} を見つける必要があるからです。{{ic|core.img}} のセクタ位置はパーティション上の (ファイルのコピーや削除など) ファイルシステムに変更が加えられた時に変化してしまうことがあります。詳細は https://bugzilla.redhat.com/show_bug.cgi?id=728742 や https://bugzilla.redhat.com/show_bug.cgi?id=730915 を見て下さい。
+
デフォルトで {{ic|grub-setup}} がパーティションやパーティションレスディスクへのインストールをしないようになっている理由は、この場合に限って GRUB がパーティションのブートセクタにある埋め込みブロックリストを使って {{ic|/boot/grub/i386-pc/core.img}} ファイルと prefix ディレクトリ {{ic|/boot/grub}} を見つける必要があるからです。{{ic|core.img}} のセクタ位置はパーティション上の (ファイルのコピーや削除など) ファイルシステムに変更が加えられた時に変化してしまうことがあります。詳細は https://bugzilla.redhat.com/show_bug.cgi?id=728742 や https://bugzilla.redhat.com/show_bug.cgi?id=730915 を見て下さい。
  
これを回避する方法は {{ic|/boot/grub/i386-pc/core.img}} に (上で説明しているように chattr コマンドを使って) immutable フラグを設定することで、これによってディスク上の {{ic|core.img}} ファイルのセクタ位置が変化しなくなります。{{ic|/boot/grub/i386-pc/core.img}} に immutable フラグを設定するのは、{{ic|grub}} をパーティションブートセクタやパーティションレスディスクにインストールするときだけ必要になることで、ブートセクタに埋め込まず MBR にインストールしたり {{ic|core.img}} だけを生成する時は必要ありません (上述)。
+
これを回避する方法は {{ic|/boot/grub/i386-pc/core.img}} に (上で説明しているように {{ic|chattr}} コマンドを使って) immutable フラグを設定することで、これによってディスク上の {{ic|core.img}} ファイルのセクタ位置が変化しなくなります。{{ic|/boot/grub/i386-pc/core.img}} に immutable フラグを設定するのは、GRUB をパーティションブートセクタやパーティションレスディスクにインストールするときだけ必要になることで、ブートセクタに埋め込まず MBR にインストールしたり {{ic|core.img}} だけを生成する時は必要ありません (上述)。
 +
 
 +
残念ながら、エラーが表示されなかったとしても、作成される {{ic|grub.cfg}} ファイルには起動するための正しい UUID が含まれません。https://bbs.archlinux.org/viewtopic.php?pid=1294604#p1294604 を参照してください。この問題を修正するには以下のコマンドを実行してください:
 +
 
 +
# mount /dev/sdxY /mnt        #Your root partition.
 +
# mount /dev/sdxZ /mnt/boot  #Your boot partiton (if you have one).
 +
# arch-chroot /mnt
 +
# pacman -S linux
 +
# grub-mkconfig -o /boot/grub/grub.cfg
  
 
===== core.img だけを生成する =====
 
===== core.img だけを生成する =====
  
{{ic|grub}} のブートセクタコードを MBR, MBR の後の隙間またはパーティションのブートセクタに'''埋め込まずに''' {{ic|/boot/grub}} ディレクトリを作成して {{ic|/boot/grub/i386-pc/core.img}} ファイルを生成するには、{{ic|grub-install}} に {{ic|1=--grub-setup=/bin/true}} を加えて下さい:
+
GRUB のブートセクタコードを MBR, MBR の後の隙間またはパーティションのブートセクタに'''埋め込まずに''' {{ic|/boot/grub}} ディレクトリを作成して {{ic|/boot/grub/i386-pc/core.img}} ファイルを生成するには、{{ic|grub-install}} に {{ic|1=--grub-setup=/bin/true}} を加えて下さい:
  
 
  # grub-install --target=i386-pc --grub-setup=/bin/true --recheck --debug /dev/sda
 
  # grub-install --target=i386-pc --grub-setup=/bin/true --recheck --debug /dev/sda
Line 191: Line 199:
 
{{Note|
 
{{Note|
 
* 下のコマンドでは GRUB を {{ic|x86_64-efi}} でインストールすると仮定しています ({{ic|IA32-efi}} を使うのなら下のコマンドの {{ic|x86_64-efi}} を {{ic|i386-efi}} に置き換えて下さい)。
 
* 下のコマンドでは GRUB を {{ic|x86_64-efi}} でインストールすると仮定しています ({{ic|IA32-efi}} を使うのなら下のコマンドの {{ic|x86_64-efi}} を {{ic|i386-efi}} に置き換えて下さい)。
* インストールを行うために、BIOS ではなく UEFI を使って起動する必要があります。ISO ファイルを USB ドライブにコピーして起動した場合、あなたは BIOS を使って起動しています。[[Unified Extensible Firmware Interface (日本語)#ISO から UEFI ブータブル USB を作成する|UEFI ブータブル USB デバイス]]を作成し、それを使って再起動してください。そうしないと {{ic|grub-install}} はエラーを出します。
+
* インストールを行うために、BIOS ではなく UEFI を使って起動する必要があります。そうしないと {{ic|grub-install}} はエラーを出します。
 
}}
 
}}
  
Line 238: Line 246:
 
===== GRUB Standalone - 技術的な情報 =====
 
===== GRUB Standalone - 技術的な情報 =====
  
GRUB EFI のファイルはいつでも設定ファイルが {{ic|${prefix}/grub.cfg}} にあることを期待しています。しかしながらスタンドアロンの GRUB EFI ファイルでは、{{ic|${prefix} }} は tar アーカイブの中に置かれスタンドアロンの GRUB EFI ファイルそれ自体に埋め込まれます (grub env ではクォートのない {{ic|"(memdisk)"}} で示される)。この tar アーカイブには通常の GRUB EFI インストールで {{ic|/boot/grub}} に保存される全てのファイルが含まれています。
+
GRUB EFI のファイルはいつでも設定ファイルが {{ic|${prefix}/grub.cfg}} にあることを期待しています。しかしながらスタンドアロンの GRUB EFI ファイルでは、{{ic|${prefix} }} は tar アーカイブの中に置かれスタンドアロンの GRUB EFI ファイルそれ自体に埋め込まれます (GRUB ではクォートのない {{ic|"(memdisk)"}} で示される)。この tar アーカイブには通常の GRUB EFI インストールで {{ic|/boot/grub}} に保存される全てのファイルが含まれています。
  
 
{{ic|/boot/grub}} の中身がスタンドアロンのイメージに埋め込まれることによって、全てにおいて実際の (外部的な) {{ic|/boot/grub}} を使うことはできなくなります。そのためスタンドアロンの GRUB EFI ファイルでは {{ic|1=${prefix}==(memdisk)/boot/grub}} とスタンドアロンの GRUB EFI ファイルは設定ファイルが {{ic|1=${prefix}/grub.cfg==(memdisk)/boot/grub/grub.cfg}} にあるとして読み込みます。
 
{{ic|/boot/grub}} の中身がスタンドアロンのイメージに埋め込まれることによって、全てにおいて実際の (外部的な) {{ic|/boot/grub}} を使うことはできなくなります。そのためスタンドアロンの GRUB EFI ファイルでは {{ic|1=${prefix}==(memdisk)/boot/grub}} とスタンドアロンの GRUB EFI ファイルは設定ファイルが {{ic|1=${prefix}/grub.cfg==(memdisk)/boot/grub/grub.cfg}} にあるとして読み込みます。
  
このためスタンドアロンの GRUB EFI ファイルに同じディレクトリにある外部的 {{ic|grub.cfg}} を EFI ファイルとして読み込ませるには (grub env では {{ic|${cmdpath} }} で示される)、GRUB に設定として {{ic|${cmdpath}/grub.cfg}} を使うように記述した {{ic|/tmp/grub.cfg}} を作る必要があります ({{ic|(memdisk)/boot/grub/grub.cfg}} の {{ic|configfile ${cmdpath}/grub.cfg}} コマンド)。それから grub-mkstandalone にこの {{ic|/tmp/grub.cfg}} ファイルを {{ic|${prefix}/grub.cfg}} (実際には {{ic|(memdisk)/boot/grub/grub.cfg}}) にコピーさせるためにオプション {{ic|1="/boot/grub/grub.cfg=/tmp/grub.cfg"}} を使います。
+
このためスタンドアロンの GRUB EFI ファイルに同じディレクトリにある外部的 {{ic|grub.cfg}} を EFI ファイルとして読み込ませるには (GRUB では {{ic|${cmdpath} }} で示される)、GRUB に設定として {{ic|${cmdpath}/grub.cfg}} を使うように記述した {{ic|/tmp/grub.cfg}} を作る必要があります ({{ic|(memdisk)/boot/grub/grub.cfg}} の {{ic|configfile ${cmdpath}/grub.cfg}} コマンド)。それから grub-mkstandalone にこの {{ic|/tmp/grub.cfg}} ファイルを {{ic|${prefix}/grub.cfg}} (実際には {{ic|(memdisk)/boot/grub/grub.cfg}}) にコピーさせるためにオプション {{ic|1="/boot/grub/grub.cfg=/tmp/grub.cfg"}} を使います。
  
 
これでスタンドアロンの GRUB EFI ファイルと実際の {{ic|grub.cfg}} は EFI System Partition の中のディレクトリに (同じディレクトリである限り) 保存することが出来るようになり、持ち運びが容易になります。
 
これでスタンドアロンの GRUB EFI ファイルと実際の {{ic|grub.cfg}} は EFI System Partition の中のディレクトリに (同じディレクトリである限り) 保存することが出来るようになり、持ち運びが容易になります。
Line 429: Line 437:
  
 
{{ic|/etc/default/grub}} を好きなように編集してください。以下は2つの行の最初のコメントを削除して機能を有効にする例で、タイムアウトを5秒に、そして表示するように設定しています:
 
{{ic|/etc/default/grub}} を好きなように編集してください。以下は2つの行の最初のコメントを削除して機能を有効にする例で、タイムアウトを5秒に、そして表示するように設定しています:
 +
GRUB_TIMEOUT=0
 
  GRUB_HIDDEN_TIMEOUT=5
 
  GRUB_HIDDEN_TIMEOUT=5
 
  GRUB_HIDDEN_TIMEOUT_QUIET=false
 
  GRUB_HIDDEN_TIMEOUT_QUIET=false
 +
GRUB_HIDDEN_TIMEOUT がメニューの表示まで待機する秒数です。メニューを隠すには GRUB_TIMEOUT=0 も設定する必要があります。
  
 
==== フレームバッファの無効化 ====
 
==== フレームバッファの無効化 ====
Line 486: Line 496:
 
GRUB が自動で root 暗号化のためのカーネルパラメータを追加するようにするには、{{ic|/etc/default/grub}} の {{ic|GRUB_CMDLINE_LINUX}} に {{ic|1=cryptdevice=/dev/yourdevice:label}} を加えて下さい。
 
GRUB が自動で root 暗号化のためのカーネルパラメータを追加するようにするには、{{ic|/etc/default/grub}} の {{ic|GRUB_CMDLINE_LINUX}} に {{ic|1=cryptdevice=/dev/yourdevice:label}} を加えて下さい。
  
{{Tip|If you are upgrading from a working GRUB Legacy configuration, check {{ic|/boot/grub/menu.lst.pacsave}} for the correct device/label to add. Look for them after the text {{ic|kernel /vmlinuz-linux}}.}}
+
{{Tip|GRUB Legacy の設定から更新する場合は、{{ic|/boot/grub/menu.lst.pacsave}} を確認して適切なデバイス・ラベルを加えて下さい。{{ic|kernel /vmlinuz-linux}} という文の後ろにあるはずです。}}
  
 
{{ic|/dev/mapper/root}} にマップされた root の例:
 
{{ic|/dev/mapper/root}} にマップされた root の例:
Line 753: Line 763:
  
 
{{Note|以下の例では ISO が {{ic|hd0,6}} 上の {{ic|/archives}} にあると仮定しています。}}
 
{{Note|以下の例では ISO が {{ic|hd0,6}} 上の {{ic|/archives}} にあると仮定しています。}}
{{Tip|For thumbdrives, use something like {{ic|(hd1,$partition)}} and either {{ic|/dev/sdb'''Y'''}} for the {{ic|img_dev}} parameter or [[Persistent_block_device_naming|a persistent name]], e.g. {{ic|img_dev&#61;/dev/disk/by-label/CORSAIR}}.}}
+
{{Tip|USB メモリーでは、{{ic|(hd1,$partition)}} のように指定してください。{{ic|img_dev}} パラメータには {{ic|/dev/sdb'''Y'''}} [[Persistent_block_device_naming|永続的な名前]] (例: {{ic|img_dev&#61;/dev/disk/by-label/CORSAIR}}) を使って下さい。}}
  
 
===== x86_64 =====
 
===== x86_64 =====
Line 821: Line 831:
  
 
GRUB には RAID ボリュームの便利な制御機能があります。ボリュームをネイティブに指定できる {{ic|insmod mdraid}} を追加する必要があります。例えば、{{ic|/dev/md0}} は次のようになります:
 
GRUB には RAID ボリュームの便利な制御機能があります。ボリュームをネイティブに指定できる {{ic|insmod mdraid}} を追加する必要があります。例えば、{{ic|/dev/md0}} は次のようになります:
  set root=(md0)
+
  set root=(md/0)
  
 
一方パーティション済みの RAID ボリューム (例: {{ic|/dev/md0p1}}) は次のとおりです:
 
一方パーティション済みの RAID ボリューム (例: {{ic|/dev/md0p1}}) は次のとおりです:
  set root=(md0,1)
+
  set root=(md/0,1)
  
 
RAID1 を GPT ef02/'BIOS boot partition' のドライブ上の、{{ic|/boot}} パーティション (もしくは RAID1 root パーティション上の {{ic|/boot}}) で使っている場合に grub をインストールするには、ドライブの両方で ''ic|grub-install'' を実行するだけです。例:
 
RAID1 を GPT ef02/'BIOS boot partition' のドライブ上の、{{ic|/boot}} パーティション (もしくは RAID1 root パーティション上の {{ic|/boot}}) で使っている場合に grub をインストールするには、ドライブの両方で ''ic|grub-install'' を実行するだけです。例:
Line 1,126: Line 1,136:
 
この問題は fdisk を使って GPT パーティションのひとつ (GRUB のために作成した 1007 KiB のパーティションが好ましい) を MBR でブータブルだと印をつけることで回避できます。fdisk を使って次のコマンドを実行してください: fdisk をインストールするディスクで起動し (例: {{ic|fdisk /dev/sda}})、{{ic|a}} を押してから数字を入力してブータブルにしたいパーティション (おそらく #1) を選択してください。最後に {{ic|w}} を押して変更を MBR に書き込みます。
 
この問題は fdisk を使って GPT パーティションのひとつ (GRUB のために作成した 1007 KiB のパーティションが好ましい) を MBR でブータブルだと印をつけることで回避できます。fdisk を使って次のコマンドを実行してください: fdisk をインストールするディスクで起動し (例: {{ic|fdisk /dev/sda}})、{{ic|a}} を押してから数字を入力してブータブルにしたいパーティション (おそらく #1) を選択してください。最後に {{ic|w}} を押して変更を MBR に書き込みます。
  
{{Note|The bootable-marking must be done in {{ic|fdisk}} or similar, not in GParted or others, as they will not set the bootable flag in the MBR.}}
+
{{Note|ブータブルの設定は GParted ではなく、{{ic|fdisk}} などで行う必要があります。GParted は MBR で bootable フラグを設定しないからです。}}
  
 
詳細は [http://www.rodsbooks.com/gdisk/bios.html ここ] から見ることができます。
 
詳細は [http://www.rodsbooks.com/gdisk/bios.html ここ] から見ることができます。
Line 1,194: Line 1,204:
 
=== GRUB UEFI がロードされない ===
 
=== GRUB UEFI がロードされない ===
  
動作する EFI の例:
+
EFI の動作の例:
 
{{hc|# efibootmgr -v|
 
{{hc|# efibootmgr -v|
 
BootCurrent: 0000
 
BootCurrent: 0000
Line 1,204: Line 1,214:
 
}}
 
}}
  
If the screen only goes black for a second and the next boot option is tried afterwards, according to [https://bbs.archlinux.org/viewtopic.php?pid=981560#p981560 this post], moving GRUB to the partition root can help. The boot option has to be deleted and recreated afterwards. The entry for GRUB should look like this then:
+
画面が数秒間真っ暗になってその後次のブートオプションが試行される場合、[https://bbs.archlinux.org/viewtopic.php?pid=981560#p981560 この投稿]によると、GRUB を root パーティションに移動することで直るかもしれません。ブートオプションは削除して後でまた作成する必要があります。GRUB のエントリは次のようにしてください:
 
  Boot0000* Grub HD(1,800,32000,23532fbb-1bfa-4e46-851a-b494bfe9478c)File(\grub.efi)
 
  Boot0000* Grub HD(1,800,32000,23532fbb-1bfa-4e46-851a-b494bfe9478c)File(\grub.efi)
  

Revision as of 05:54, 26 January 2014

Template:Related articles start (日本語)

  • GRUB Legacy
  • Arch Boot Process
  • ブートローダ
  • Master Boot Record
  • GUID Partition Table
  • Unified Extensible Firmware Interface
  • GRUB EFI Examples
  • </ul></div>

    GRUB は次世代の GRand Unified Bootloader です。GRUB Legacy の後継の研究開発プロジェクト PUPA から GRUB は作られています。全てを整理するため GRUB はスクラッチから書きなおされモジュール性とポータビリティを獲得しました [1]

    手短に言えば、ブートローダーはコンピューターが起動した時に最初に走るソフトウェアプログラムです。Linux カーネルのロードとコントロールの移譲を担当しています。そして、カーネルはオペレーションシステムの他全てを初期化します。

    Contents

    前置き

    • GRUB という名前は公式でソフトウェアのバージョン2を示しています、[2] を見て下さい。古いバージョンについての記事は GRUB Legacy を見て下さい。
    • GRUB は root で (/boot ファイルシステムを分割しないで) Btrfs を使った zlib や LZO による圧縮をサポートしています。
    • GRUB は root で F2fs を使うことをサポートしていないため、サポートされているファイルシステムで /boot を分割する必要があります。

    GRUB Legacy ユーザーへのメモ

    • GRUB Legacy から GRUB へのアップグレードはで書かれている GRUB のフレッシュインストールとほとんど同じです。
    • GRUB Legacy と GRUB ではコマンドが異なります。先に進む前に GRUB commands を確認してください (例: "find" は "search" に置き換わっています)。
    • 今の GRUB はモジュール式であり "stage 1.5" を必要としません。そのため、ブートローダー自体の機能は限定的です -- 拡張機能の必要に応じてハードドライブからモジュールがロードされます (例: RAID サポートや LVM)。
    • デバイスの命名規則が GRUB Legacy と GRUB で変わっています。パーティションは0ではなく1から番号付けされ、ドライブは0から番号が始まり、パーティションテーブルのタイプが前に付きます。例えば、/dev/sda1(hd0,msdos1) (MBR) や (hd0,gpt1) (GPT) と表記されます。
    • GRUB は GRUB legacy よりもかなり大きくなっています (/boot に ~13 MB は占領します)。分割された /boot パーティションから起動している状態で、このパーティションが 32MB よりも小さい場合、ディスク容量の問題が起こったり、pacman が新しいカーネルのインストールを拒否したりします。

    重要なデータのバックアップ

    GRUB のインストールはスムーズに行われるべきですが、GRUB v2 にアップグレードする前に GRUB Legacy のファイルを保持しておくことを強く推奨します。

    # mv /boot/grub /boot/grub-legacy
    

    ブートコードやパーティションテーブルを含んでいる MBR をバックアップするには (/dev/sdX は実際のディスクパスに置き換えてください):

    # dd if=/dev/sdX of=/path/to/backup/mbr_backup bs=512 count=1
    

    MBR の446バイトにはブートコードが含まれていて、次の64バイトにはパーティションテーブルが含まれています。リストアする際にパーティションテーブルを上書きしたくない場合は、MBR ブートコードだけをバックアップすることを推奨します:

    # dd if=/dev/sdX of=/path/to/backup/bootcode_backup bs=446 count=1
    

    GRUB2 を正しくインストールできないときは、#GRUB Legacy のリストア を見て下さい。

    事前の注意事項

    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 によっては起動しなくなる可能性があります。

    Note:
    • --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 パーティション・アライメントをサポートしているパーティションツールを使うのが得策です。

    UEFI システム

    Note: UEFI, GPT, UEFI Bootloaders のページをよく読んでおいてください。
    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 ファイルシステムで 'boot' フラグが有効になっている小さな (512 MiB 以下) パーティションがあります。そのパーティション上には、"EFI" という名前のフォルダがあるはずです。これらの存在が確認できたのなら、それは ESP になります。そのパーティション番号を覚えておいて下さい。後で GRUB を ESP にインストールするときに使います。

    ESP を作成する

    ESP が存在しない場合、作成する必要があります。Unified Extensible Firmware Interface (日本語)#EFI System Partition の指示に従って ESP を作成してください。

    インストール

    BIOS システム

    Note: Arch ライブ CD から初期設定を行っているときは、grub をインストールする前にインストールしたシステムに chroot してください。CD 自体の grub のインストールスクリプトを使うと grub.cfg がおかしくなったりして、システムが起動しなくなる問題が発生する可能性があります。

    公式リポジトリ にある grub パッケージから GRUB をインストールできます。grub-legacyAUR がインストールされている場合は置き換えられます。

    Note: パッケージをインストールするだけでは /boot/grub/i386-pc/core.img ファイルや /boot/grub/i386-pc 内の GRUB モジュールは更新されません。下で説明されているように grub-install を使って手動でアップデートする必要があります。

    ブートファイルをインストール

    BIOS ブートで GRUB ブートファイルをインストールする方法は3つあります:

    Note: http://www.gnu.org/software/grub/manual/html_node/BIOS-installation.html に詳しいドキュメントがあります。
    ディスクにインストールする
    Note: この方法は GRUB を (MBR か GPT で) パーティション済みのディスクにインストールして、GRUB ファイルを /boot/grub に第1ステージコードを440バイトの MBR ブートコード領域にインストールする方法です (MBR パーティションテーブルとは違います)。パーティションレスディスク (super-floppy) については #パーティションやパーティションレスディスクにインストールする を参照してください。

    440バイトの Master Boot Record ブートコード領域に GRUB をセットアップするには、/boot/grub ディレクトリを作り、/boot/grub/i386-pc/core.img ファイルを生成して、それを 31 KiB の (最低限の容量 - パーティションのアライメントによって変化します) MBR の後の領域 (もしくは GPT でパーティションされたディスクの場合 BIOS Boot Partition、parted では bios_grub フラグ、gdisk では EF02 タイプコードで示される) に埋め込み、設定ファイルを生成します。次を実行してください:

    # grub-install --target=i386-pc --recheck --debug /dev/sda
    
    Note:
    • /dev/sda はインストール先に置き換えて下さい。
    • --target=i386-pcgrub-install に BIOS システムだけにインストールすることを示します。grub-install があいまいな動作をしないように常時使用することが推奨されています。

    /bootLVM を使っている場合は、複数の物理ディスクに GRUB をインストールすることができます。

    パーティションやパーティションレスディスクにインストールする
    Note: GRUB は GRUB Legacy や Syslinux と同じようにパーティションのブートセクタやパーティションレスディスクへのインストールを推奨していません。この種のセットアップは破損しやすく (特にアップデート中)、Arch の開発陣によるサポートはされていません。

    パーティションブートセクタや、パーティションレスディスク (別名 superfloppy) やフロッピーディスクに grub をセットアップするには、以下を実行してください (/boot パーティションを /dev/sdaX として例にしています):

    # chattr -i /boot/grub/i386-pc/core.img
    # grub-install --target=i386-pc --recheck --debug --force /dev/sdaX
    # chattr +i /boot/grub/i386-pc/core.img
    
    Note:
    • /dev/sda はインストール先に置き換えて下さい。
    • --target=i386-pcgrub-install に BIOS システムだけにインストールすることを示します。grub-install があいまいな動作をしないように常時使用することが推奨されています。

    --force オプションを使ってブロックリストを利用する必要があります --grub-setup=/bin/true は使えません (core.img を生成するだけと同じです)。

    grub-install は以下のような警告を表示し、この方法で失敗するようなことについてヒントを与えます:

    /sbin/grub-setup: warn: Attempting to install GRUB to a partitionless disk or to a partition. This is a BAD idea.
    /sbin/grub-setup: warn: Embedding is not possible. GRUB can only be installed in this setup by using blocklists. 
                            However, blocklists are UNRELIABLE and their use is discouraged.
    

    --force がないと下のエラーが表示され grub-setup はパーティションブートセクタにブートコードを設定しません:

    /sbin/grub-setup: error: will not proceed with blocklists
    

    --force をつければ次のように表示されるはずです:

    Installation finished. No error reported.
    

    デフォルトで grub-setup がパーティションやパーティションレスディスクへのインストールをしないようになっている理由は、この場合に限って GRUB がパーティションのブートセクタにある埋め込みブロックリストを使って /boot/grub/i386-pc/core.img ファイルと prefix ディレクトリ /boot/grub を見つける必要があるからです。core.img のセクタ位置はパーティション上の (ファイルのコピーや削除など) ファイルシステムに変更が加えられた時に変化してしまうことがあります。詳細は https://bugzilla.redhat.com/show_bug.cgi?id=728742https://bugzilla.redhat.com/show_bug.cgi?id=730915 を見て下さい。

    これを回避する方法は /boot/grub/i386-pc/core.img に (上で説明しているように chattr コマンドを使って) immutable フラグを設定することで、これによってディスク上の core.img ファイルのセクタ位置が変化しなくなります。/boot/grub/i386-pc/core.img に immutable フラグを設定するのは、GRUB をパーティションブートセクタやパーティションレスディスクにインストールするときだけ必要になることで、ブートセクタに埋め込まず MBR にインストールしたり core.img だけを生成する時は必要ありません (上述)。

    残念ながら、エラーが表示されなかったとしても、作成される grub.cfg ファイルには起動するための正しい UUID が含まれません。https://bbs.archlinux.org/viewtopic.php?pid=1294604#p1294604 を参照してください。この問題を修正するには以下のコマンドを実行してください:

    # mount /dev/sdxY /mnt        #Your root partition.
    # mount /dev/sdxZ /mnt/boot  #Your boot partiton (if you have one).
    # arch-chroot /mnt
    # pacman -S linux
    # grub-mkconfig -o /boot/grub/grub.cfg
    
    core.img だけを生成する

    GRUB のブートセクタコードを MBR, MBR の後の隙間またはパーティションのブートセクタに埋め込まずに /boot/grub ディレクトリを作成して /boot/grub/i386-pc/core.img ファイルを生成するには、grub-install--grub-setup=/bin/true を加えて下さい:

    # grub-install --target=i386-pc --grub-setup=/bin/true --recheck --debug /dev/sda
    
    Note:
    • /dev/sda はインストール先に置き換えて下さい。
    • --target=i386-pcgrub-install に BIOS システムだけにインストールすることを示します。grub-install があいまいな動作をしないように常時使用することが推奨されています。

    これで Linux カーネルやマルチブートカーネルとして GRUB Legacy や syslinux から GRUB の core.img をチェインロードできます。

    UEFI システム

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

    最初に grub, dosfstools, efibootmgr パッケージをインストールして、それから下の手順に従って下さい (後ろの2つのパッケージは grub が EFI をサポートするのに必要になります)。

    Note: パッケージをインストールするだけでは core.efi ファイルや EFI System Partition 内の GRUB モジュールは更新されません。下で説明されているように grub-install を使って手動でアップデートする必要があります。

    ブートファイルのインストール

    推奨方法
    Note:
    • 下のコマンドでは GRUB を x86_64-efi でインストールすると仮定しています (IA32-efi を使うのなら下のコマンドの x86_64-efii386-efi に置き換えて下さい)。
    • インストールを行うために、BIOS ではなく UEFI を使って起動する必要があります。そうしないと grub-install はエラーを出します。

    まず、ESP をお好きなマウントポイントにマウントしてください (通常は /boot/efi を使います、以下 $esp として示します)。最初のインストールでは、mkdir /boot/efi を実行する必要があります。

    GRUB UEFI アプリケーションを $esp/EFI/grub に、GRUB のモジュールを /boot/grub/x86_64-efi にインストールしてください:

    # grub-install --target=x86_64-efi --efi-directory=$esp --bootloader-id=grub --recheck --debug
    
    Note:
    • --target--directory オプションのどちらかがないと、grub-install はどこにファームウェアをインストールすればいいのか決められません。そのような場合 grub-installsource_dir does not exist. Please specify --target or --directory というメッセージを表示します。
    • オプション --efi-directory--bootloader-id は GRUB UEFI 専用です。--efi-directory は ESP のマウントポイントを指定します。このオプションと同じものとして以前は --root-directory が使われていました。--bootloader-idgrubx64.efi ファイルを保存するのに使うディレクトリの名前を指定します。
    • GRUB を BIOS システムで設定するときと異なり grub-install コマンドの最後に <device_path> オプション (例: /dev/sda) を使わないことに注意してください。UEFI のブートローダーは MBR やパーティションのブートセクタを全く使わないので <device_path> が指定されてもインストールスクリプトはそれを無視します。

    これで GRUB はインストールされました。

    他の方法

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

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

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

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

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

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

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

    GRUB Standalone

    Note: 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} 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
    
    Note: オプション --modules="part_gpt part_msdos" (クォート付き) は ${cmdpath} 機能を正しく動作させるために必要です。

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

    GRUB Standalone - 技術的な情報

    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.cfg を生成する必要があります。生成されるファイルは /etc/default/grub の様々なオプションや /etc/grub.d/ のスクリプトによって設定されます。これについては #基本的な設定#高度な設定 のセクションで説明しています。

    Note: /etc/default/grub/etc/grub.d/* に変更を加えた後は grub.cfg を再生成する必要があることを覚えておいて下さい。

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

    # grub-mkconfig -o /boot/grub/grub.cfg
    
    Note:
    • このファイルのパスは /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 が起動します。高度な設定は #デュアルブート を見て下さい。

    GRUB Legacy の設定ファイルを新しいフォーマットに変換する

    grub-mkconfig が失敗する場合、次のコマンドで /boot/grub/menu.lst ファイルを /boot/grub/grub.cfg に変換してください:

    # grub-menulst2cfg /boot/grub/menu.lst /boot/grub/grub.cfg
    
    Note: このオプションは BIOS システムでだけ機能します、UEFI システム上では使えません。

    例えば:

    /boot/grub/menu.lst
    default=0
    timeout=5
    
    title  Arch Linux Stock Kernel
    root   (hd0,0)
    kernel /vmlinuz-linux root=/dev/sda2 ro
    initrd /initramfs-linux.img
    
    title  Arch Linux Stock Kernel Fallback
    root   (hd0,0)
    kernel /vmlinuz-linux root=/dev/sda2 ro
    initrd /initramfs-linux-fallback.img
    
    /boot/grub/grub.cfg
    set default='0'; if [ x"$default" = xsaved ]; then load_env; set default="$saved_entry"; fi
    set timeout=5
    
    menuentry 'Arch Linux Stock Kernel' {
      set root='(hd0,1)'; set legacy_hdbias='0'
      legacy_kernel   '/vmlinuz-linux' '/vmlinuz-linux' 'root=/dev/sda2' 'ro'
      legacy_initrd '/initramfs-linux.img' '/initramfs-linux.img'
      
    }
    
    menuentry 'Arch Linux Stock Kernel Fallback' {
      set root='(hd0,1)'; set legacy_hdbias='0'
      legacy_kernel   '/vmlinuz-linux' '/vmlinuz-linux' 'root=/dev/sda2' 'ro'
      legacy_initrd '/initramfs-linux-fallback.img' '/initramfs-linux-fallback.img'
    }
    

    GRUB の /boot/grub/grub.cfg 設定ファイルを作るのを忘れて、再起動したら GRUB のコマンドシェルが表示された場合、以下を入力してください:

    sh:grub> insmod legacycfg
    sh:grub> legacy_configfile ${prefix}/menu.lst
    

    Arch で起動して正しい GRUB /boot/grub/grub.cfg 設定ファイルを再生成してください。

    基本的な設定

    このセクションでは /etc/default/grub 設定ファイルの編集についてだけ扱っています。他のオプションは #高度な設定 を見て下さい。

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

    追加引数

    カスタムの追加引数を 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"

    詳しくは Kernel parameters (日本語) を見て下さい。

    外観の設定

    GRUB には初めからメニューの見た目を変更する機能が備わっています。GRUB で GRUB graphical terminal, gfxterm を適切なビデオモードで初期化できているか確認してください。これについては #"No suitable mode found" エラー のセクションで説明されています。GRUB から linux カーネルへは 'gfxpayload' を通してビデオモードが渡されるので、外観の変更を適用するにはこのモードが必要になります。

    フレームバッファの解像度を設定する

    GRUB は GRUB 自身とカーネル両方のフレームバッファを設定することができます。古い vga= は deprecated になりました。以下のように /etc/default/grub を編集する方法が推奨されています:

    GRUB_GFXMODE=1024x768x32
    GRUB_GFXPAYLOAD_LINUX=keep
    

    変更を適用するには、次を実行してください:

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

    gfxpayload プロパティによってカーネルに解像度を維持させます。

    Note:
    • 上記のサンプルで上手く行かないときは gfxmode="1024x768x32"vbemode="0x105" に置き換えてみて下さい。解像度も、あなたの画面に合った解像度に置き換えることを忘れないで下さい
    • # hwinfo --framebuffer を使って利用できる全てのモードを表示することができます (hwinfo は [community] から利用可能です)、GRUB のプロンプトでは vbeinfo コマンドが使用できます

    この方法が使えない時は、昔の vga= を使って下さい。/etc/default/grub"GRUB_CMDLINE_LINUX_DEFAULT=" という行に追加するだけです、例えば: "GRUB_CMDLINE_LINUX_DEFAULT="quiet splash vga=792" は解像度が 1024x768 になります。

    以下の解像度のどれかを選ぶことができます: 640×480, 800×600, 1024×768, 1280×1024, 1600×1200, 1920×1200

    915resolution hack

    たまに Intel のグラフィックドライバーで # hwinfo --framebuffervbeinfo のどちらも希望する解像度を表示しないことがあります。この場合、915resolution を使うことができます。この hack は一時的にビデオ BIOS を修正して必要な解像度を追加します。915resolution のホームページ を見て下さい。

    まず後で修正されるビデオモードを見つける必要があります。そのために GRUB のコマンドシェルが必要です:

    sh:grub> 915resolution -l
    Intel 800/900 Series VBIOS Hack : version 0.5.3
    [...]
    Mode 30 : 640x480, 8 bits/pixel
    [...]
    

    次に、Mode 301440x900 解像度で上書きします:

    /etc/grub.d/00_header
    [...]
    915resolution 30 1440 900  # Inserted line
    set gfxmode=${GRUB_GFXMODE}
    [...]
    

    最後に、先に説明したように GRUB_GFXMODE を設定して、GRUB の設定ファイルを再生成し、再起動して変更を確認しましょう。

    背景画像とビットマップフォント

    GRUB は背景画像と pf2 フォーマットのビットマップフォントをサポートしています。grub パッケージに含まれている unifont フォントは unicode.pf2 というファイル名で置いてあり、同じく ASCII 文字は ascii.pf2 という名前です。

    サポートされている画像フォーマットは tga, png, jpeg で適切なモジュールがロードされます。利用できる最大解像度はあなたのハードウェアによります。

    正しいフレームバッファの解像度を設定するようにしてください。

    /etc/default/grub を以下のように編集してください:

    GRUB_BACKGROUND="/boot/grub/myimage"
    #GRUB_THEME="/path/to/gfxtheme"
    GRUB_FONT="/path/to/font.pf2"
    
    Note: GRUB を分割して別のパーティションにインストールしている場合、/boot/grub/myimage/grub/myimage になります。

    変更を適用するには grub.cfg再生成してください。スプラッシュイメージの追加が成功したのならば、上のコマンドを実行したときに "Found background image..." と表示されるはずです。 この文句が表示されない場合、画像情報はおそらく grub.cfg ファイルに組み入れられていません。

    画像が表示されないときは、以下をチェックしてください:

    • /etc/default/grub に記述したパスとファイル名が正しいか
    • 画像のサイズとフォーマットは問題ないか (tga, png, 8-bit jpg)
    • 画像が RGB モードで保存されていて、インデックスは付いていないか
    • コンソールモードが /etc/default/grub で無効になっているか
    • 背景画像を /boot/grub/grub.cfg ファイルに入れるために grub-mkconfig コマンドをちゃんと実行したか

    テーマ

    以下は GRUB パッケージに含まれている Starfield テーマを設定する例です。

    /etc/default/grub を編集してください:

    GRUB_THEME="/usr/share/grub/themes/starfield/theme.txt"
    

    変更を適用するには grub.cfg再生成してください。テーマの設定が成功すると、ターミナルに Found theme: /usr/share/grub/themes/starfield/theme.txt と表示されます。 テーマを使っている時は基本的にスプラッシュイメージは表示されません。

    メニューの色

    GRUB のメニューの色を設定することができます。GRUB で利用できる色は the GRUB Manual にあります。 以下サンプルです:

    /etc/default/grub を編集してください:

    GRUB_COLOR_NORMAL="light-blue/black"
    GRUB_COLOR_HIGHLIGHT="light-cyan/blue"
    

    メニューを隠す

    GRUB のユニークな機能のひとつとして、メニューを隠して必要な時に Esc を押して表示することができます。また、タイムアウトカウンターを表示するかどうか設定することもできます。

    /etc/default/grub を好きなように編集してください。以下は2つの行の最初のコメントを削除して機能を有効にする例で、タイムアウトを5秒に、そして表示するように設定しています:

    GRUB_TIMEOUT=0
    GRUB_HIDDEN_TIMEOUT=5
    GRUB_HIDDEN_TIMEOUT_QUIET=false
    

    GRUB_HIDDEN_TIMEOUT がメニューの表示まで待機する秒数です。メニューを隠すには GRUB_TIMEOUT=0 も設定する必要があります。

    フレームバッファの無効化

    バイナリドライバーに問題が発生するので NVIDIA のプロプライエタリドライバーを使っているユーザーは GRUB のフレームバッファを無効化するべきです。

    フレームバッファを無効にするには、/etc/default/grub を編集して次の行をアンコメントしてください:

    GRUB_TERMINAL_OUTPUT=console
    

    他にも、GRUB でフレームバッファを使いつつカーネルを起動する直前にテキストモードに戻すこともできます。これをするには、/etc/default/grub 内の次の変数を変更してください:

    GRUB_GFXPAYLOAD_LINUX=text
    

    永続的なブロックデバイスの命名

    Persistent block device naming を行う方法のひとつとして"古い" /dev/sd* の代わりに世界でただひとつの UUID を使ってパーティションを識別する方法があります。利点については上のリンクされている記事で説明しています。

    ファイルシステムの UUID の永続的命名はデフォルトで GRUB で使われています。

    Note: 関連するファイルシステムのサイズを変えたり再作成したときはいつでも /etc/default/grub の新しい UUID を使って /boot/grub.cfg ファイルを再生成する必要があります。ライブ CD でパーティションやファイルシステムを修正するときは、このことを覚えておいて下さい。

    UUID を使うかどうかは /etc/default/grub 内のオプションによって決めます:

    # GRUB_DISABLE_LINUX_UUID=true
    

    どちらにしても、変更を生成することを忘れないで下さい:

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

    以前のエントリを思い出させる

    GRUB はあなたが最後に起動したエントリを記憶することができ、次の起動時にはそれをデフォルトエントリにすることができます。この機能は複数のカーネル (つまり、新しい Arch カーネルと fallback としての LTS カーネル) やオペレーティングシステムを使っている時に便利です。この機能を使うには /etc/default/grub を編集して GRUB_DEFAULT の値を変更してください:

    GRUB_DEFAULT=saved
    

    これで GRUB は保存されたエントリをデフォルトにします。選択したエントリの保存を有効にするには、次の行を /etc/default/grub に追加してください:

    GRUB_SAVEDEFAULT=true
    
    Note: 手動で追加したメニューアイテム (例: /etc/grub.d/40_custom/boot/grub/custom.cfg の Windows) には savedefault の追加が必要です。設定ファイルを再生成するのを忘れないで下さい。

    デフォルトのメニューエントリを変更する

    デフォルトで選択されるエントリを変更するには、/etc/default/grub を編集して GRUB_DEFAULT の値を変更してください:

    数字を使う:

    GRUB_DEFAULT=0
    

    Grub は生成されたメニューを0からカウントします。つまり最初のエントリは0で (デフォルト値)、次のエントリは1と続きます。

    メニューのタイトルを使う:

    GRUB_DEFAULT='Arch Linux, with Linux core repo kernel'
    
    Note: 設定ファイルを再生成するのを忘れないで下さい。

    Root 暗号化

    GRUB が自動で root 暗号化のためのカーネルパラメータを追加するようにするには、/etc/default/grubGRUB_CMDLINE_LINUXcryptdevice=/dev/yourdevice:label を加えて下さい。

    Tip: GRUB Legacy の設定から更新する場合は、/boot/grub/menu.lst.pacsave を確認して適切なデバイス・ラベルを加えて下さい。kernel /vmlinuz-linux という文の後ろにあるはずです。

    /dev/mapper/root にマップされた root の例:

    GRUB_CMDLINE_LINUX="cryptdevice=/dev/sda2:root"
    

    また、rootfs で UUID の使用を無効化して下さい:

    GRUB_DISABLE_LINUX_UUID=true
    

    設定を再生成してください。

    デフォルトでないエントリを一度だけ起動する

    デフォルトエントリ以外のエントリを一度だけ起動するのに grub-reboot はとても便利です。次にシステムが再起動した時に、GRUB は最初のコマンドライン引数で指定されたエントリをロードします。そして、その後のブートでは GRUB はデフォルトエントリをロードするように戻ります。設定ファイルの変更や GRUB メニューでのエントリの選択は必要ありません。

    Note: これをするには /etc/default/grubGRUB_DEFAULT=saved を設定 (して grub.cfg を再生成) する必要があります、grub.cfg を手動で編集する場合は set default="${saved_entry}" という行を設定します。

    高度な設定

    このセクションでは grub.cfg の手動編集や、/etc/grub.d/ に記述するカスタムスクリプト、その他高度な設定を扱っています。

    grub.cfg を手動で編集する

    Warning: grub.cfg ファイルの編集は非推奨です。このファイルは grub-mkconfig コマンドで生成して、/etc/default/grub や、/etc/grub.d フォルダ内のスクリプトを編集するのに越したことはありません。

    基本的な 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 パーティションを指定します (boot パーティションを分割する必要はなく、"root" パーティション (/) 下のただのディレクトリでもかまいません

    設定サンプル:

    /boot/grub/grub.cfg
    # Config file for GRUB - The GNU GRand Unified Bootloader
    # /boot/grub/grub.cfg
    
    # DEVICE NAME CONVERSIONS
    #
    #  Linux           Grub
    # -------------------------
    #  /dev/fd0        (fd0)
    #  /dev/sda        (hd0)
    #  /dev/sdb2       (hd1,2)
    #  /dev/sda3       (hd0,3)
    #
    
    # Timeout for menu
    set timeout=5
    
    # Set default boot entry as Entry 0
    set default=0
    
    # (0) Arch Linux
    menuentry "Arch Linux" {
      set root=(hd0,1)
      linux /vmlinuz-linux root=/dev/sda3 ro
      initrd /initramfs-linux.img
    }
    
    ## (1) Windows
    #menuentry "Windows" {
    #  set root=(hd0,3)
    #  chainloader +1
    #}
    

    デュアルブート

    Note: 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:

    #!/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 --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2 763A-9CB6
    	chainloader (${root})/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 --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2 763A-9CB6
    	chainloader (${root})/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 (add other options here as required)
      initrd /boot/initrd.img (if the other kernel uses/needs one)
    }
    
    FreeBSD のメニューエントリ

    FreeBSD は UFS でシングルパーティションにインストールする必要があります。sda4 にインストールされている場合:

    menuentry "FreeBSD" {
      set root=(hd0,4)
      chainloader +1
    }
    
    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 x86_64 UEFI-GPT" {
        insmod part_gpt
        insmod fat
        insmod search_fs_uuid
        insmod chain
        search --fs-uuid --set=root $hints_string $uuid
        chainloader /EFI/Microsoft/Boot/bootmgfw.efi
      }
    fi
    

    $hints_string$uuid は以下の2つのコマンドで知ることができます。$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
    }
    BIOS-MBR モードでインストールされた Windows
    Note: GRUB は bootmgr の直接起動をサポートしており、もはや BIOS-MBR 環境で Windows を起動するためにパーティションブートセクタのチェインロードをする必要はありません。
    Warning: 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
    
    Note: Windows XP では、上記のコマンドにある bootmgrNTLDR に置き換えて下さい。さらに、SYSTEM_RESERVED パーティションは存在しない可能性があることに注意してください; あなたの Windows パーティション上に NTLDR ファイルがないか調べて下さい。

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

    Windows Vista/7/8 では:

    if [ "${grub_platform}" == "pc" ]; then
      menuentry "Microsoft Windows Vista/7/8 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
    
    Note: たまに (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 のブートメニューの場所が決まります。

    Note: 最初に必要なスクリプトが実行されるように 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 を再生成してください。

    GRUB から ISO を直接起動する

    /etc/grub.d/40_custom/boot/grub/custom.cfg を編集して対象の ISO のエントリを追加してください。編集したら、通常通り grub-mkconfig -o /boot/grub/grub.cfg を (root で) 実行して GRUB メニューを更新してください。

    Arch ISO

    Note: 以下の例では ISO が hd0,6 上の /archives にあると仮定しています。
    Tip: USB メモリーでは、(hd1,$partition) のように指定してください。img_dev パラメータには /dev/sdbY永続的な名前 (例: img_dev=/dev/disk/by-label/CORSAIR) を使って下さい。
    x86_64
    menuentry "Archlinux-2013.05.01-dual.iso" --class iso {
      set isofile="/archives/archlinux-2013.05.01-dual.iso"
      set partition="6"
      loopback loop (hd0,$partition)/$isofile
      linux (loop)/arch/boot/x86_64/vmlinuz archisolabel=ARCH_201305 img_dev=/dev/sda$partition img_loop=$isofile earlymodules=loop
      initrd (loop)/arch/boot/x86_64/archiso.img
    }
    
    i686
    menuentry "Archlinux-2013.05.01-dual.iso" --class iso {
      set isofile="/archives/archlinux-2013.05.01-dual.iso"
      set partition="6"
      loopback loop (hd0,$partition)/$isofile
      linux (loop)/arch/boot/i686/vmlinuz archisolabel=ARCH_201305 img_dev=/dev/sda$partition img_loop=$isofile earlymodules=loop
      initrd (loop)/arch/boot/i686/archiso.img
    }
    

    Ubuntu ISO

    Note: この例では ISO が hd0,6 上の /archives にあると仮定しています。必要に応じて hdd やパーティションの位置を調整する必要があります。
    menuentry "ubuntu-13.04-desktop-amd64.iso" {
      set isofile="/archives/ubuntu-13.04-desktop-amd64.iso"
      loopback loop (hd0,6)/$isofile
      linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=$isofile quiet noeject noprompt splash --
      initrd (loop)/casper/initrd.lz
    }
    
    menuentry "ubuntu-12.04-desktop-amd64.iso" {
      set isofile="/archives/ubuntu-12.04-desktop-amd64.iso"
      loopback loop (hd0,6)/$isofile
      linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile quiet noeject noprompt splash --
      initrd (loop)/casper/initrd.lz
    }
    

    他の ISO

    他の設定は http://askubuntu.com/questions/141940/how-to-boot-live-iso-images にあります。

    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 mdraid を追加する必要があります。例えば、/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 をインストールするには、ドライブの両方で ic|grub-install を実行するだけです。例:

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

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

    ラベルを使う

    --label オプションを search に使うことで、人間が読めるラベルをファイルシステムに付けることができます。まず最初に、既存のパーティションにラベリングしてください:

    # tune2fs -L LABEL PARTITION
    

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

    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 メニューのパスワード保護

    ブートパラメータを変えたりコマンドラインを使えないようにして GRUB をセキュアにしたい場合、GRUB の設定ファイルにユーザー名・パスワードの組み合わせを追加することができます。これをするには、grub-mkpasswd-pbkdf2 コマンドを実行してください。パスワードを入力して確認してください:

    grub-mkpasswd-pbkdf2
    [...]
    Your PBKDF2 is grub.pbkdf2.sha512.10000.C8ABD3E93C4DFC83138B0C7A3D719BC650E6234310DA069E6FDB0DD4156313DA3D0D9BFFC2846C21D5A2DDA515114CF6378F8A064C94198D0618E70D23717E82.509BFA8A4217EAD0B33C87432524C0B6B64B34FBAD22D3E6E6874D9B101996C5F98AB1746FE7C7199147ECF4ABD8661C222EEEDB7D14A843261FFF2C07B1269A
    

    次に、以下を /etc/grub.d/00_header に追加して下さい:

    /etc/grub.d/00_header
    cat << EOF
    
    set superusers="username"
    password_pbkdf2 username <password>
    
    EOF
    

    <password>grub-mkpasswd_pbkdf2 によって生成された文字列に置き換えてください。

    設定ファイルを再生成すれば、GRUB コマンドライン、ブートパラメータ、そしてブートエントリには全てプロテクトがかけられます。

    この制限は GRUB manual の "Security" パートに書かれている方法によって緩めたりカスタマイズすることができます。

    Shift キーが押されていない時は GRUB を隠す

    起動を高速化するために、GRUB にタイムアウトを待たせる代わりに、GRUB の起動時に Shift キーが押されていない限り、GRUB にメニューを隠させるということが可能です。

    これをするためには、次の行を /etc/default/grub に追加する必要があります:

     GRUB_FORCE_HIDDEN_MENU="true"
    

    そして下のファイルを作成してください:

    /etc/grub.d/31_hold_shift
    
    #! /bin/sh
    set -e
    
    # grub-mkconfig helper script.
    # Copyright (C) 2006,2007,2008,2009  Free Software Foundation, Inc.
    #
    # GRUB is free software: you can redistribute it and/or modify
    # it under the terms of the GNU General Public License as published by
    # the Free Software Foundation, either version 3 of the License, or
    # (at your option) any later version.
    #
    # GRUB is distributed in the hope that it will be useful,
    # but WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    # GNU General Public License for more details.
    #
    # You should have received a copy of the GNU General Public License
    # along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
    
    prefix="/usr"
    exec_prefix="${prefix}"
    datarootdir="${prefix}/share"
    
    export TEXTDOMAIN=grub
    export TEXTDOMAINDIR="${datarootdir}/locale"
    source "${datarootdir}/grub/grub-mkconfig_lib"
    
    found_other_os=
    
    make_timeout () {
    
      if [ "x${GRUB_FORCE_HIDDEN_MENU}" = "xtrue" ] ; then 
        if [ "x${1}" != "x" ] ; then
          if [ "x${GRUB_HIDDEN_TIMEOUT_QUIET}" = "xtrue" ] ; then
        verbose=
          else
        verbose=" --verbose"
          fi
    
          if [ "x${1}" = "x0" ] ; then
        cat <<EOF
    if [ "x\${timeout}" != "x-1" ]; then
      if keystatus; then
        if keystatus --shift; then
          set timeout=-1
        else
          set timeout=0
        fi
      else
        if sleep$verbose --interruptible 3 ; then
          set timeout=0
        fi
      fi
    fi
    EOF
          else
        cat << EOF
    if [ "x\${timeout}" != "x-1" ]; then
      if sleep$verbose --interruptible ${GRUB_HIDDEN_TIMEOUT} ; then
        set timeout=0
      fi
    fi
    EOF
          fi
        fi
      fi
    }
    
    adjust_timeout () {
      if [ "x$GRUB_BUTTON_CMOS_ADDRESS" != "x" ]; then
        cat <<EOF
    if cmostest $GRUB_BUTTON_CMOS_ADDRESS ; then
    EOF
        make_timeout "${GRUB_HIDDEN_TIMEOUT_BUTTON}" "${GRUB_TIMEOUT_BUTTON}"
        echo else
        make_timeout "${GRUB_HIDDEN_TIMEOUT}" "${GRUB_TIMEOUT}"
        echo fi
      else
        make_timeout "${GRUB_HIDDEN_TIMEOUT}" "${GRUB_TIMEOUT}"
      fi
    }
    
      adjust_timeout
    
        cat <<EOF
    if [ "x\${timeout}" != "x-1" ]; then
      if keystatus; then
        if keystatus --shift; then
          set timeout=-1
        else
          set timeout=0
        fi
      else
        if sleep$verbose --interruptible 3 ; then
          set timeout=0
        fi
      fi
    fi
    EOF
    

    UUID の使用と基本的なスクリプトの混合

    信頼できない BIOS マッピングをやめて UUID を使いたい場合や GRUB の構文に混乱している場合、以下が UUID を使って GRUB にシステムの正しいディスクパーティションを教える小さなスクリプトのブートメニューアイテムのサンプルです。サンプルの中の UUID をあなたのシステムの正しい UUID に置き換えるだけで使うことができます。この例ではシステムに boot と root パーティションを適用しています。他にもパーティションがある場合は GRUB の設定を修正する必要があります:

     menuentry "Arch Linux 64" {
             # Set the UUIDs for your boot and root partition respectively
             set the_boot_uuid=ece0448f-bb08-486d-9864-ac3271bd8d07
             set the_root_uuid=c55da16f-e2af-4603-9e0b-03f5f565ec4a
       
             # (Note: This may be the same as your boot partition)
       
             # Get the boot/root devices and set them in the root and grub_boot variables
             search --fs-uuid $the_root_uuid --set=root
             search --fs-uuid $the_boot_uuid --set=grub_boot
       
             # Check to see if boot and root are equal.
             # If they are, then append /boot to $grub_boot (Since $grub_boot is actually the root partition)
             if [ $the_boot_uuid == $the_root_uuid ] ; then
                 set grub_boot=($grub_boot)/boot
             else
                 set grub_boot=($grub_boot)
             fi
       
             # $grub_boot now points to the correct location, so the following will properly find the kernel and initrd
             linux $grub_boot/vmlinuz-linux root=/dev/disk/by-uuid/$the_root_uuid ro
             initrd $grub_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
    

    Pager サポート

    GRUB は pager をサポートしており長い出力をするコマンド (help コマンドなど) を読むことができます。これは通常のシェルモードでしか動作せずレスキューモードでは使えません。pager を有効にするには、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
    

    通常のロード

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

    GUI 設定ツール

    以下のパッケージがインストール可能です:

    • grub-customizer — ブートローダー (GRUB や BURG) のカスタマイズ
    https://launchpad.net/grub-customizer || grub-customizerAUR
    • grub2-editor — GRUB ブートローダー設定の KDE4 コントロールモジュール
    http://kde-apps.org/content/show.php?content=139643 || grub2-editorAUR
    • kcm-grub2 — この Kcm モジュールは GRUB の基本的な設定を管理します
    http://kde-apps.org/content/show.php?content=137886 || kcm-grub2AUR
    • startupmanager — GRUB Legacy, GRUB, Usplash, Splashy の設定を変更できる GUI アプリ (abandonned)
    http://sourceforge.net/projects/startup-manager/ || startupmanagerAUR

    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
    

    rescue コンソールを使う

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

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

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

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

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

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

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

    これで linuxinitrd コマンドが使えます、これらのコマンドは慣れているはずです (#高度な設定 を見て下さい)。

    例えば、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 /vmlinuz-linux root=/dev/sda6
    initrd /initramfs-linux.img
    boot
    

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

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

    トラブルシューティング

    Intel BIOS が GPT をブートしない

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

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

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

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

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

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

    set pager=1
    set debug=all
    

    "No suitable mode found" エラー

    メニューエントリのどれかを起動したときに以下のエラーが表示される場合:

    error: no suitable mode found
    Booting however
    

    GRUB の正しいビデオモード (gfxmode) を使って GRUB グラフィカルターミナル (gfxterm) を初期化する必要があります。このビデオモードは 'gfxpayload' を使って GRUB から linux カーネルに渡されます。UEFI 環境の場合、GRUB のビデオモードが初期化されないと、端末にカーネルのブートメッセージが (少なくとも KMS が有効になるまで) 全く表示されません。

    /usr/share/grub/unicode.pf2 を ${GRUB_PREFIX_DIR} (BIOS と UEFI システムの場合 /boot/grub/) にコピーしてください。GRUB UEFI をインストールしたときに --boot-directory=$esp/EFI を設定したときは、ディレクトリは $esp/EFI/grub/ になります:

    # cp /usr/share/grub/unicode.pf2 ${GRUB_PREFIX_DIR}
    

    /usr/share/grub/unicode.pf2 が存在しないときは、bdf-unifont をインストールして、unifont.pf2 ファイルを作成し ${GRUB_PREFIX_DIR} にコピーしてください:

    # grub-mkfont -o unicode.pf2 /usr/share/fonts/misc/unifont.bdf
    

    次に、grub.cfg ファイルの中に、以下の行を追加して GRUB がカーネルに正しくビデオモードを渡すようにしてください。どちらかがないと黒画面 (出力なし) になりますが起動は問題なく (フリーズせずに) 進みます。

    BIOS システム:

    insmod vbe
    

    UEFI システム:

    insmod efi_gop
    insmod efi_uga
    

    その後以下のコードを追加してください (BIOS と UEFI 両方で共通):

    insmod font
    
    if loadfont ${prefix}/fonts/unicode.pf2
    then
        insmod gfxterm
        set gfxmode=auto
        set gfxpayload=keep
        terminal_output gfxterm
    fi
    

    gfxterm (graphical terminal) が正しく動作すれば、unicode.pf2 フォントファイルは ${GRUB_PREFIX_DIR} にあるはずです。

    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) 特有の手順 を読んで下さい。

    GRUB 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)
    

    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 カーネルパラメータを取り除いてみてください。

    GRUB Legacy のリストア

    • GRUB v2 のファイルをどけてください:
    # mv /boot/grub /boot/grub.nonfunctional
    
    • GRUB Legacy を /boot にコピーしてください:
    # cp -af /boot/grub-legacy /boot/grub
    
    • MBR と sda の次の 62 セクタをバックアップしたコピーで置き換えて下さい:
    Warning: このコマンドはパーティションテーブルも復元するので、古いパーティションテーブルで修正済みのパーティションテーブルを上書きすることに注意してください。あなたのシステムが破壊されます
    # dd if=/path/to/backup/first-sectors of=/dev/sdX bs=512 count=1
    

    MBR のブートコードだけをリストアするとより安全です:

    # dd if=/path/to/backup/mbr-boot-code of=/dev/sdX bs=446 count=1
    

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

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

    参照

    1. 公式 GRUB マニュアル - https://www.gnu.org/software/grub/manual/grub.html
    2. Ubuntu wiki の GRUB ページ - https://help.ubuntu.com/community/Grub2
    3. GRUB wiki page describing steps to compile for UEFI systems - https://help.ubuntu.com/community/UEFIBooting
    4. Wikipedia の BIOS Boot partition ページ
    5. http://members.iinet.net/~herman546/p20/GRUB2%20Configuration%20File%20Commands.html - GRUB の設定方法の詳細な説明