GRUB (日本語)
| 概要 |
|---|
| GRand Unified Bootloader (GRUB) のバージョン2について様々なことを説明します。 |
| 概括 |
| Arch Linux を起動するためには、GRUB(2), Syslinux, LILO, GRUB Legacy などの Linux 対応のブートローダを、Master Boot Record もしくは GUID Partition Table にインストールする必要があります。ブートローダは、ブートプロセスが始まる前にカーネルやイニシャルラムディスクをロードする仕事を行います。 |
| 関連項目 |
| BURG (日本語) - BURG は GRUB v2 をベースにした全く新しいブートローダーです。幅広い OS で使うことができ、テキスト・グラフィックモードで動く、細かく設定可能なメニューシステムを持っています。 |
| GRUB Legacy - 前のバージョンで、今はサポートされていません。 |
| 資料 |
| GRUB EFI Examples |
| GNU GRUB - GNU Project |
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 に設定してください。
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 システム
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 がインストールされている場合は置き換えられます。
ブートファイルをインストール
BIOS ブートで GRUB ブートファイルをインストールする方法は3つあります:
- #ディスクにインストールする (推奨)
- #パーティションやパーティションレスディスクにインストールする (非推奨)
- #core.img だけを生成する (一番安全な方法ですが、
/boot/grub/i386-pc/core.imgを chainload するために GRUB Legacy や Syslinux など他の BIOS ブートローダーが必要になります)
ディスクにインストールする
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
/boot に LVM を使っている場合は、複数の物理ディスクに GRUB をインストールすることができます。
下の #設定ファイルの生成 に進んで下さい。GRUB の設定ファイルは grub-install コマンドでは生成されません。
パーティションやパーティションレスディスクにインストールする
パーティションブートセクタや、パーティションレスディスク (別名 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
--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=728742 や https://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
これで Linux カーネルやマルチブートカーネルとして GRUB Legacy や syslinux から GRUB の core.img をチェインロードできます。
設定ファイルの生成
最後に、GRUB の設定を生成してください (設定については設定セクションで詳しく説明しています):
# grub-mkconfig -o /boot/grub/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
例えば:
/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 を再度実行してください。失敗する場合は、下の説明を見て手動でエントリを加えて下さい。
BIOS-MBR モードでインストールされた Microsoft Windows
このセクションでは、あなたの 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
次に、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
/etc/grub.d/40_custom をテンプレートとして使って /etc/grub.d/nn_custom を作成することができます。nn は優先順位を定義し、スクリプトが実行される順番を示します。スクリプトが実行される順番で grub のブートメニューの場所が決まります。
UEFI システム
最初に grub, dosfstools, efibootmgr パッケージをインストールして、それから下の手順に従って下さい (後ろの2つのパッケージは grub が EFI をサポートするのに必要になります)。
ブートファイルのインストール
推奨方法
まず、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
これで 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>
grubx64_standalone.efi ファイルは grub.cfg が $prefix の (memdisk)/boot/grub の中にあることを要求します。memdisk は EFI アプリの中に埋め込まれます。grub-mkstandlone スクリプトを使うことで引数として memdisk イメージの中にファイルを渡すことができます (<any extra files you want to include>)。
grub.cfg が /home/user/Desktop/grub.cfg にある場合は、一時ディレクトリ /home/user/Desktop/boot/grub/ を作成して、/home/user/Desktop/grub.cfg を /home/user/Desktop/boot/grub/grub.cfg にコピーし、ディレクトリを /home/user/Desktop/boot/grub/ に移動して次を実行してください:
# 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"
/home/user/Desktop/boot/grub/ に cd してファイルパスを boot/grub/grub.cfg として指定するのは (スラッシュが欠けていることに気づいて下さい - boot/ vs. /boot/) grub-mkstandalone スクリプトによって dir1/dir2/file が (memdisk)/dir1/dir2/file として含まれるからです。
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 を自動で生成するか手動で編集するか選ぶことができます。
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 に手動で追加する必要があるかもしれません。
追加引数
カスタムの追加引数を Linux イメージに渡すために、/etc/default/grub で GRUB_CMDLINE_LINUX と GRUB_CMDLINE_LINUX_DEFAULT 変数を設定することができます。この2つは grub.cfg を生成するときに互いに標準のブートエントリに追加されます。recovery ブートエントリについては、GRUB_CMDLINE_LINUX だけが生成時に使われます。
両方を使う必要はありませんが、上手く使えば便利です。例えば、GRUB_CMDLINE_LINUX_DEFAULT="resume=/dev/sdaX quiet" (sdaX はスワップパーティション) を使ってハイバネーションの後の復帰を有効にすることができます。生成された recovery ブートエントリでは resume やメニューエントリからの起動中のカーネルメッセージを表示しない quiet は使われません。そして、他の (標準の) メニューエントリではオプションとして使われます。
GRUB のリカバリエントリを生成するには /etc/default/grub で #GRUB_DISABLE_RECOVERY=true をコメントアウトする必要があります。
また、GRUB_CMDLINE_LINUX="resume=/dev/disk/by-uuid/${swap_uuid}" を使うこともできます (${swap_uuid} は swap パーティションの UUID に置き換えて下さい)。
複数のエントリを使う時はダブルクォートの中でスペースで区切って下さい。resume と systemd の両方を使うなら次のようになります:
GRUB_CMDLINE_LINUX="resume=/dev/sdaX init=/usr/lib/systemd/systemd"
詳しくは Kernel parameters (日本語) を見て下さい。
grub.cfg を手動で編集する
基本的な 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
#}
デュアルブート
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 プロパティによってカーネルに解像度を維持させます。
この方法が使えない時は、昔の 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 --framebuffer と vbeinfo のどちらも希望する解像度を表示しないことがあります。この場合、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 30 を 1440x900 解像度で上書きします:
/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"
変更を適用して 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 で使われています。
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
デフォルトのメニューエントリを変更する
デフォルトで選択されるエントリを変更するには、/etc/default/grub を編集して GRUB_DEFAULT の値を変更してください:
数字を使う:
GRUB_DEFAULT=0
Grub は生成されたメニューを0からカウントします。つまり最初のエントリは0で (デフォルト値)、次のエントリは1と続きます。
メニューのタイトルを使う:
GRUB_DEFAULT='Arch Linux, with Linux core repo kernel'
セキュリティ
ブートパラメータを変えたりコマンドラインを使えないようにして 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/grub の GRUB_CMDLINE_LINUX に cryptdevice=/dev/yourdevice:label を加えて下さい。
/dev/mapper/root にマップされた root の例:
GRUB_CMDLINE_LINUX="cryptdevice=/dev/sda2:root"
また、rootfs で UUID の使用を無効化して下さい:
GRUB_DISABLE_LINUX_UUID=true
設定を再生成してください。
デフォルトでないエントリを一度だけ起動する
デフォルトエントリ以外のエントリを一度だけ起動するのに grub-reboot はとても便利です。次にシステムが再起動した時に、GRUB は最初のコマンドライン引数で指定されたエントリをロードします。そして、その後のブートでは GRUB はデフォルトエントリをロードするように戻ります。設定ファイルの変更や GRUB メニューでのエントリの選択は必要ありません。
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
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
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 にあります。
コマンドシェルを使う
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) のカスタマイズ
- grub2-editor — GRUB ブートローダー設定の KDE4 コントロールモジュール
- kcm-grub2 — この Kcm モジュールは GRUB の基本的な設定を管理します
- startupmanager — GRUB Legacy, GRUB, Usplash, Splashy の設定を変更できる GUI アプリ (abandonned)
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 があります。この例では set と insmod を使います。set は変数を修正し insmod は新しいモジュールを挿入して機能を追加します。
始める前に、ユーザーは自分の /boot パーティションの位置を知っていなければなりません (分割パーティションなのか、root 下のサブディレクトリなのか):
grub rescue> set prefix=(hdX,Y)/boot/grub
X は物理ドライブ番号、Y はパーティション番号に置き換えてください。
コンソールの機能を拡張するために、linux モジュールを挿入します:
grub rescue> insmod (hdX,Y)/boot/grub/linux.mod
これで linux と initrd コマンドが使えます、これらのコマンドは慣れているはずです (#設定 を見て下さい)。
例えば、Arch Linux を起動:
set root=(hd0,5) linux /boot/vmlinuz-linux root=/dev/sda5 initrd /boot/initramfs-linux.img boot
boot パーティションを分割しているなら、行を変更する必要があります:
set root=(hd0,5) linux /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 でパーティションされたブートセットアップが起動できなくなることがあります。
この問題は fdisk を使って GPT パーティションのひとつ (GRUB のために作成した 1007 KiB のパーティションが好ましい) を MBR でブータブルだと印をつけることで回避できます。fdisk を使って次のコマンドを実行してください: fdisk をインストールするディスクで起動し (例: fdisk /dev/sda)、a を押してから数字を入力してブータブルにしたいパーティション (おそらく #1) を選択してください。最後に w を押して変更を 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 がロードされない
動作する 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 セクタをバックアップしたコピーで置き換えて下さい:
# 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 パッケージから利用可能です。
資料
- 公式 GRUB マニュアル - https://www.gnu.org/software/grub/manual/grub.html
- Ubuntu wiki の GRUB ページ - https://help.ubuntu.com/community/Grub2
- GRUB wiki page describing steps to compile for UEFI systems - https://help.ubuntu.com/community/UEFIBooting
- Wikipedia の BIOS Boot partition ページ