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

From ArchWiki
Jump to: navigation, search
(他のオプション)
m (GUID Partition Table (GPT) 特有の手順)
Line 64: Line 64:
 
===== GUID Partition Table (GPT) 特有の手順 =====
 
===== GUID Partition Table (GPT) 特有の手順 =====
  
GPT でパーティションされたシステムには {{ic|core.img}} を埋め込むための MBR の隙間の領域がないので (GPT のプライマリヘッダーやプライマリパーティションテーブルに使われます)、[[GPT|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 という容量によって次に続くパーティションを 1024 KiB に正しくアライメントすることができます。必要であれば、ディスクの他の場所にこのパーティションを配置することもできますが、先頭の 2TiB の領域内である必要があります。パーティションタイプは (c)gdisk では {{ic|ef02}} に GNU Parted では {{ic|set ''BOOT_PART_NUM'' bios_grub on}} に設定してください。

Revision as of 06:36, 21 October 2013

Template:Article summary start Template:Article summary text Template:Article summary heading Template:Article summary text Template:Article summary heading Template:Article summary wiki - BURG は GRUB v2 をベースにした全く新しいブートローダーです。幅広い OS で使うことができ、テキスト・グラフィックモードで動く、細かく設定可能なメニューシステムを持っています。 Template:Article summary wiki - 前のバージョンで、今はサポートされていません。 Template:Article summary heading Template:Article summary wiki Template:Article summary link Template:Article summary end

GRUB - GRUB Legacy と混同しないでください - は次世代の 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 という容量によって次に続くパーティションを 1024 KiB に正しくアライメントすることができます。必要であれば、ディスクの他の場所にこのパーティションを配置することもできますが、先頭の 2TiB の領域内である必要があります。パーティションタイプは (c)gdisk では ef02 に GNU Parted では set BOOT_PART_NUM bios_grub on に設定してください。

Note:
  • このパーティションは 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 システム

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

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 をインストールすることができます。

下の #設定ファイルの生成 に進んで下さい。GRUB の設定ファイルは grub-install コマンドでは生成されません。

パーティションやパーティションレスディスクにインストールする
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 の設定ファイルは grub-install コマンドでは生成されません。

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 をチェインロードできます。

設定ファイルの生成

最後に、GRUB の設定を生成してください (設定については設定セクションで詳しく説明しています):

# grub-mkconfig -o /boot/grub/grub.cfg
Note: このファイルのパスは /boot/grub/grub.cfg です、/boot/grub/i386-pc/grub.cfg ではありません。

GRUB がブート中に "no suitable mode found" とエラーを表示するときは、#"No suitable mode found" エラー を見て下さい。

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 設定ファイルを再生成してください。

マルチブート

追加のユーティリティをインストールすれば、すぐに動かすことができます: os-prober。パッケージをインストールして、grub-mkconfig -o /boot/grub/grub.cfg を再度実行してください。失敗する場合は、下の説明を見て手動でエントリを加えて下さい。

Note: Windows が見つからない時は、Windows の boot パーティションをマウントしてみてください
BIOS-MBR モードでインストールされた Microsoft 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 よりも大きな値にするべきです。

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 を使って起動する必要があります。ISO ファイルを USB ドライブにコピーして起動した場合、あなたは BIOS を使って起動しています。UEFI ブータブル USB デバイスを作成し、それを使って再起動してください。そうしないと 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 の独立 UEFI アプリケーションを作成する

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

これを行う一番簡単な方法は、既に上述したインストールコマンドを使って、モジュールを含めるように指定することです。例えば:

# grub-mkstandalone --directory="/usr/lib/grub/x86_64-efi/" --format="x86_64-efi" --compression="xz" \
--output="$esp/EFI/grub/grubx64_standalone.efi" <any extra files you want to include>

The grubx64_standalone.efi file expects grub.cfg to be within its $prefix which is (memdisk)/boot/grub. The memdisk is embedded within the EFI app. The grub-mkstandlone script allow passing files to be included in the memdisk image to be as the arguments to the script (in <any extra files you want to include>).

If you have the grub.cfg at /home/user/Desktop/grub.cfg, then create a temporary /home/user/Desktop/boot/grub/ directory, copy the /home/user/Desktop/grub.cfg to /home/user/Desktop/boot/grub/grub.cfg, cd into /home/user/Desktop/boot/grub/ and run:

# grub-mkstandalone --directory="/usr/lib/grub/x86_64-efi/" --format="x86_64-efi" --compression="xz" \
--output="$esp/EFI/grub/grubx64_standalone.efi" "boot/grub/grub.cfg"

The reason to cd into /home/user/Desktop/boot/grub/ and to pass the file path as boot/grub/grub.cfg (notice the lack of a leading slash - boot/ vs. /boot/ ) is because dir1/dir2/file is included as (memdisk)/dir1/dir2/file by the grub-mkstandalone script.

If you pass /home/user/Desktop/grub.cfg the file will be included as (memdisk)/home/user/Desktop/grub.cfg. If you pass /home/user/Desktop/boot/grub/grub.cfg the file will be included as (memdisk)/home/user/Desktop/boot/grub/grub.cfg. That is the reason for cd'ing into /home/user/Desktop/boot/grub/ and passing boot/grub/grub.cfg, to include the file as (memdisk)/boot/grub/grub.cfg, which is what grub.efi expects the file to be.

efibootmgr を使って $esp/EFI/arch_grub/grubx64_standalone.efi の UEFI ブートマネージャエントリを作成する必要があります。#ファームウェアのブートマネージャに GRUB エントリを作成する に従って下さい。

設定

grub.cfg を自動で生成するか手動で編集するか選ぶことができます。

Note:
  • EFI システムでは、--boot-directory=$esp/EFI オプションを使って GRUB がインストールされた場合、grub.cfg ファイルは grubx64.efi と同じディレクトリにあるはずです。そうでないのなら、GRUB BIOS と同じように grub.cfg ファイルは /boot/grub/ にあります
  • ここ に GRUB の設定方法のほとんど完璧に近い説明があります。

grub-mkconfig を使って自動で生成する

GRUB の menu.lst に同等の設定ファイルが /etc/default/grub/etc/grub.d/* です。grub-mkconfig はこれらのファイルを使って grub.cfg を生成します。デフォルトではスクリプトは標準出力に出力します。grub.cfg ファイルを生成するには次のコマンドを実行してください:

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

何も設定しなくても Arch Linux のメニューアイテムが自動的に追加され /etc/grub.d/10_linux が設定されます。他のオペレーティングシステムは /etc/grub.d/40_custom/boot/grub/custom.cfg に手動で追加する必要があるかもしれません。

Note: If you're trying to do this in a chroot or systemd-nspawn container, you might notice that it doesn't work, complaining that grub-probe can't get the 'canonical path of /dev/sdaX'. In this case, try using arch-chroot as described here.

追加引数

カスタムの追加引数を 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.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 をインストールするとよいでしょう。

grub-mkconfig を使う

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

# grub-mkconfig -o /boot/grub/grub.cfg
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 とデュアルブート

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

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 には初めからメニューの見た目を変更する機能が備わっています。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-mkconfig -o /boot/grub/grub.cfg
# reboot

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

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 に情報を追加するには、次を実行して下さい:

# grub-mkconfig -o /boot/grub/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-mkconfig -o /boot/grub/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-mkconfig -o /boot/grub/grub.cfg

メニューを隠す

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

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

GRUB_HIDDEN_TIMEOUT=5
GRUB_HIDDEN_TIMEOUT_QUIET=false

そして次を実行して下さい:

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

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

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

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

GRUB_TERMINAL_OUTPUT=console

そして次を実行して下さい:

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

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

GRUB_GFXPAYLOAD_LINUX=text

そして同じように設定を再生成してください。

他のオプション

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=(md0)

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

set root=(md0,1)

raid1 を GPT ef02/'BIOS boot partition' のドライブ上の、/boot パーティション (もしくは raid1 root パーティション上の /boot) で使っている場合に grub をインストールするには、ドライブの両方で 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 に収容されています。

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

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

ラベルを使う

--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 はあなたが最後に起動したエントリを記憶することができ、次の起動時にはそれをデフォルトエントリにすることができます。この機能は複数のカーネル (つまり、新しい 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: 設定ファイルを再生成するのを忘れないで下さい。

セキュリティ

ブートパラメータを変えたりコマンドラインを使えないようにして 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" パートに書かれている方法によって緩めたりカスタマイズすることができます。

Root 暗号化

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

Tip: If you are upgrading from a working GRUB Legacy configuration, check /boot/grub/menu.lst.pacsave for the correct device/label to add. Look for them after the text kernel /vmlinuz-linux.

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

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

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

GRUB_DISABLE_LINUX_UUID=true

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

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

The command grub-reboot is very helpful to boot another entry than the default only once. GRUB loads the entry passed in the first command line argument, when the system is rebooted the next time. Most importantly GRUB returns to loading the default entry for all future booting. Changing the configuration file or selecting an entry in the GRUB menu is not necessary.

Note: This requires GRUB_DEFAULT=saved in /etc/default/grub (and then regenerating grub.cfg) or, in case of hand-made grub.cfg, the line set default="${saved_entry}".

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

GRUB から ISO を直接起動する

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

Arch ISO

Note: The following examples assume the ISO is in /archives on hd0,6.
Tip: For thumbdrives, use something like (hd1,$partition) and either /dev/sdbY for the img_dev parameter or a persistent name, e.g. 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: The example assumes that the iso is in /archives on hd0,6. Users must adjust the location and hdd/partition in the lines below to match their systems.
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

Other working configurations from link Source.

コマンドシェルを使う

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

If you have a Windows 9x paradigm with hidden C:\ disks GRUB can hide/unhide it using parttool. For example, to boot the third C:\ disk of three Windows 9x installations on the CLI enter the CLI and:

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 を変更します。詳しくは #インストール を見て下さい。

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

If you like the idea of using UUIDs to avoid unreliable BIOS mappings or are struggling with GRUB's syntax, here is an example boot menu item that uses UUIDs and a small script to direct GRUB to the proper disk partitions for your system. All you need to do is replace the UUIDs in the sample with the correct UUIDs for your system. The example applies to a system with a boot and root partition. You will obviously need to modify the GRUB configuration if you have additional partitions:

 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
 }

トラブルシューティング

Intel BIOS が GPT をブートしない

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

This can be circumvented by using (for instance) fdisk to mark one of the GPT partitions (preferably the 1007 KiB partition you have created for GRUB already) bootable in the MBR. This can be achieved, using fdisk, by the following commands: Start fdisk against the disk you are installing, for instance fdisk /dev/sda, then press a and select the partition you wish to mark as bootable (probably #1) by pressing the corresponding number, finally press w to write the changes to the MBR.

Note: The bootable-marking must be done in fdisk or similar, not in GParted or others, as they will not set the bootable flag in the MBR.

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

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

以下を 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 がロードされない

An example of a working 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

If the screen only goes black for a second and the next boot option is tried afterwards, according to 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:

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: This command also restores the partition table, so be careful of overwriting a modified partition table with the old one. It will mess up your system.
# 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 ページ

参照

  1. A Linux Bash Shell script to compile and install GRUB for BIOS from BZR Source
  2. A Linux Bash Shell script to compile and install GRUB for UEFI from BZR Source