GRUB/ヒントとテクニック

提供: ArchWiki
2022年2月15日 (火) 14:31時点におけるKgx (トーク | 投稿記録)による版 (→‎UEFI further reading: 翻訳)
ナビゲーションに移動 検索に移動

メインの記事は GRUB を見て下さい。

代替インストール方法

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

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

ノート: https://www.gnu.org/software/grub/manual/html_node/BIOS-installation.html に詳しいドキュメントがあります。
ディスクにインストールする
ノート: この方法は GRUB を (MBR か GPT で) パーティション済みのディスクにインストールして、GRUB ファイルを /boot/grub に第1ステージコードを440バイトの MBR ブートコード領域にインストールする方法です (MBR パーティションテーブルとは違います)。パーティションレスディスク (super-floppy) については #パーティションやパーティションレスディスクにインストールする を参照してください。新しいドライブに移行させるときなど、grub-install で別の場所にファイルをインストールしたいときは USB スティックにインストールに書かれているように --boot-directory フラグを使ってください。

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 /dev/sdx
# grub-mkconfig -o /boot/grub/grub.cfg
ノート: /dev/sdx はインストール先に置き換えて下さい。

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

USB スティックにインストール

USB スティックの一番目のパーティションが /dev/sdy1 で FAT32 である場合:

# mkdir -p /mnt/usb
# mount /dev/sdy1 /mnt/usb
# grub-install --target=i386-pc --debug --boot-directory=/mnt/usb/boot /dev/sdy
# grub-mkconfig -o /mnt/usb/boot/grub/grub.cfg

grub.cfg の設定のバックアップを作成 (任意):

# mkdir -p /mnt/usb/etc/default
# cp /etc/default/grub /mnt/usb/etc/default
# cp -a /etc/grub.d /mnt/usb/etc

アンマウント:

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

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

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

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

GUI 設定ツール

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

  • grub-customizer — ブートローダー (GRUB や BURG) のカスタマイズ
https://launchpad.net/grub-customizer || grub-customizer
  • grub2-editor — GRUB ブートローダー設定の KDE4 コントロールモジュール
http://kde-apps.org/content/show.php?content=139643 || grub2-editorAUR[リンク切れ: アーカイブ: aur-mirror]
  • grub2-editor-frameworks — grub2-editor の非公式 KF5 ポート
https://github.com/maz-1/grub2-editor || grub2-editor-frameworksAUR[リンク切れ: パッケージが存在しません]
  • startupmanager — GRUB Legacy, GRUB, Usplash, Splashy の設定を変更できる GUI アプリ (開発停止)
https://sourceforge.net/projects/startup-manager/ || startupmanagerAUR[リンク切れ: パッケージが存在しません]

外観の設定

GRUB には初めからメニューの見た目を変更する機能が備わっています。GRUB で GRUB graphical terminal, gfxterm を適切なビデオモードで初期化できているか確認してください。これについては GRUB#"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 プロパティによってカーネルに解像度を維持させます。

ノート:
  • 上記のサンプルで上手く行かないときは gfxmode="1024x768x32"vbemode="0x105" に置き換えてみて下さい。解像度も、あなたの画面に合った解像度に置き換えることを忘れないで下さい
  • # hwinfo --framebuffer を使って利用できる全てのモードを表示することができます (hwinfo は [community] から利用可能です)、GRUB のプロンプトでは videoinfo コマンドが使用できます
  • NVIDIA のプロプライエタリドライバーは <width>x<height>-<depth> という形式で GRUB_GFXMODE が使えます (例: 1920x1200-24)。GeForce GTX 970 と nvidia 370 ドライバーでテスト済み。

この方法が使えない時は、昔の 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 --framebuffervideoinfo のどちらも希望する解像度を表示しないことがあります。この場合、915resolution を使うことができます。この hack は一時的にビデオ BIOS を修正して必要な解像度を追加します。915resolution のホームページ を見て下さい。AUR には 915resolutionAUR パッケージが存在します。

まず後で修正されるビデオモードを見つける必要があります。そのために 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"
ノート: GRUB を分割して別のパーティションにインストールしている場合、grub.cfg/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-mkconfig スクリプトは grub.cfg の中のファイル名をクォートで囲まないためファイル名に空白は含めないこと

テーマ

以下は 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 で利用できる色は GRUB のマニュアルに書かれています。 以下サンプルです:

/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

GRUB で ISO9660 イメージファイルを直接起動

GRUB はループバックデバイスによる ISO イメージの直接起動をサポートしています。詳しくはマルチブート USB ドライブ#GRUB とループバックデバイスを使うを参照。

GRUB メニューのパスワード保護

警告: 誰かがあなたのマシンに物理的にアクセスしてライブ USB やライブディスクを起動できる場合 (BIOS が外部ディスクからの起動を許可している場合)、/boot が存在するパーティションが暗号化されてなければ GRUB の設定ファイルを編集してパスワード認証を迂回するのは至極簡単なことです。GRUB#暗号化セキュリティ#ディスク暗号化を見てください。

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

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

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

/etc/grub.d/40_custom
set superusers="username"
password_pbkdf2 username <password>

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

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

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

GRUB の編集とコンソールオプションだけをパスワードで保護

--unrestricted をメニューエントリに追加することでエントリの編集や GRUB のコマンドコンソールへのアクセスを制限しつつ誰でも OS を起動できるようになります。スーパーユーザーや --user スイッチで指定したユーザーだけがメニューエントリを編集することが可能です。

/boot/grub/grub.cfg
menuentry 'Arch Linux' --unrestricted --class arch --class gnu-linux --class os ...

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

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

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

 GRUB_FORCE_HIDDEN_MENU="true"

そして [1] のファイルを作成して、実行可能属性を付与して grub の設定を再生成してください:

# chmod a+x /etc/grub.d/31_hold_shift
# grub-mkconfig -o /boot/grub/grub.cfg
ノート: keystatus を使ってキーの押下を検出するのでマシンによっては動作しないことがあります。

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
}

エントリ

サブメニューの無効化

複数のカーネルをインストールしている場合 (例えば linux と linux-lts)、デフォルトで grub-mkconfig はカーネルをサブメニューにグループ化します。サブメニューにまとめて欲しくない場合、以下の行を /etc/default/grub に追加することでシングルメニューに戻すことができます:

GRUB_DISABLE_SUBMENU=y

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

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

GRUB_DEFAULT=saved

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

GRUB_SAVEDEFAULT=true

grub は btrfs に書き込めないため、これは/ boot が btrfs でない場合にのみ機能します。ただし、"sparse file not allowed. Press any key to continue." という誤解を招くエラーメッセージが生成されます。

ノート: 手動で追加したメニューアイテム (例: /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='Advanced options for Arch Linux>Arch Linux, with Linux linux'
ノート: 設定ファイルを再生成するのを忘れないで下さい。

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

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

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

曲の再生

GRUB_INIT_TUNE 変数を変更することで起動時に PC スピーカーを使って曲を流すことができます。例えば、ベルリオーズの幻想交響曲 (ファゴットパート) を演奏するには以下のように設定します:

GRUB_INIT_TUNE="312 262 3 247 3 262 3 220 3 247 3 196 3 220 3 220 3 262 3 262 3 294 3 262 3 247 3 220 3 196 3 247 3 262 3 247 5 220 1 220 5"

詳しくは info grub -n play を見てください。

初期ブートにおけるコアイメージの手動設定

GRUB 環境から /boot にアクセスできるようにするために GRUB で自動的に設定することができない特殊なキーマップなどの複雑な設定が必要な場合、コアイメージを自分で生成することができます。UEFI 環境では、コアイメージはファームウェアによって起動時にロードされる grubx64.efi ファイルです。自分でコアイメージを作成することで起動に必要なあらゆるモジュールや GRUB をブートストラップする設定スクリプトを埋め込むことができます。

例として UEFI 環境で暗号化された /boot のパスワードを入力するために初期ブート空間で dvorak キーマップを埋め込む必要があるとします:

生成された /boot/grub/grub.cfg ファイルから暗号化された /boot をマウントするのに必要なモジュールを確認します。例えば menuentry の下に以下のような行が存在するはずです:

insmod diskfilter cryptodisk luks gcry_rijndael gcry_rijndael gcry_sha256
insmod ext2
cryptomount -u 1234abcdef1234abcdef1234abcdef
set root='cryptouuid/1234abcdef1234abcdef1234abcdef'

上記のモジュールを全てメモしてください。コアイメージに含める必要があります。それから、キーマップを含んだ tarball を作成してください。memdisk としてコアイメージに同梱させます:

# ckbcomp dvorak | grub-mklayout > dvorak.gkb
# tar cf memdisk.tar dvorak.gkb

そして GRUB コアイメージで使用する設定ファイルを作成してください。通常の GRUB の設定と同じフォーマットですが、/boot パーティションのメインの設定ファイルを探してロードすることだけ記述します:

early-grub.cfg
root=(memdisk)
prefix=($root)/

terminal_input at_keyboard
keymap /dvorak.gkb

cryptomount -u 1234abcdef1234abcdef1234abcdef
set root='cryptouuid/1234abcdef1234abcdef1234abcdef'
set prefix=($root)/grub

configfile grub.cfg

最後に、コアイメージを生成します。生成された grub.cfg からメモしたモジュールと、early-grub.cfg スクリプトで使用するモジュールを全て列記してください。上記の例では memdisk, tar, at_keyboard, keylayouts, configfile が必要となります:

# grub-mkimage -c early-grub.cfg -o grubx64.efi -O x86_64-efi -m memdisk.tar diskfilter cryptodisk luks gcry_rijndael gcry_sha256 ext2 memdisk tar at_keyboard keylayouts configfile

生成した EFI コアイメージは grub-install で自動的に生成されるイメージと同じように使うことができます。EFI パーティションに配置して efibootmgr で有効化するか、システムファームウェアで適切に設定してください。

UEFI の詳細情報

この記事あるいはセクションで使われている用語や表現には問題が存在します。
議論: This could be made more concise, better organized. (議論: トーク:GRUB/ヒントとテクニック#)

以下は、UEFI を使って Arch をインストールすることに関する他の関連情報です。

代替インストール方法

この記事またはセクションは加筆を必要としています。
理由: What would be the reason to place all of GRUB's files in the ESP? (議論: トーク:GRUB/ヒントとテクニック#UEFI further reading/Alternative install method)

通常、GRUB は EFI システムパーティションがどこにマウントされていても、設定ファイルを含むすべてのファイルを /boot に保持します。

これらのファイルを EFI System Partition 自体の中に保持したい場合は、grub-install コマンドに --boot-directory=esp を追加してください。

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

これにより、すべての GRUB ファイルが esp/grub に置かれ、代わりに /boot/grub に置かれることになります。この方法を使うときは、grub-mkconfigが同じ場所に設定ファイルを置くことを確認してください。

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

それ以外の構成は同じです。

UEFIファームウェアのワークアラウンド

こちらを参照 GRUB#Default/fallback boot path

GRUBスタンドアロン

このセクションでは、x86_64 システム用のスタンドアロン GRUB(x86_64-efi)を作成することを想定しています。32 ビット (IA32) EFI システムでは、必要に応じて x86_64-efii386-efi に置き換えてください。

UEFI アプリケーションの中に全てのモジュールを tar アーカイブで埋め込んだ grubx64_standalone.efi アプリケーションを作ることができます、これにより GRUB UEFI モジュールやその他の関連ファイルを集めた別のディレクトリを用意する必要はありません。これは grub-mkstandalone コマンド (grub に含まれています) を使って以下のように行います。

# echo 'configfile ${cmdpath}/grub.cfg' > /tmp/grub.cfg
# grub-mkstandalone -d /usr/lib/grub/x86_64-efi/ -O x86_64-efi --modules="part_gpt part_msdos" --locales="en@quot" --themes="" -o "esp/EFI/grub/grubx64_standalone.efi" "boot/grub/grub.cfg=/tmp/grub.cfg" -v

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

ノート: オプション --modules="part_gpt part_msdos" は必須です。(は、${cmdpathを使用するために必要です(引用符で囲んでください)

機能が正常に動作するようになります。}}

警告: ${cmdpath} にスラッシュがないため、grub.cfg ファイルがロードされない場合があります(つまり、(hd1,msdos2)/EFI/Boot ではなく (hd1,msdos2)EFI/Boot) を実行すると、GRUB シェルにドロップされます。これが発生した場合は、${cmdpath} が設定されているもの(echo ${cmdpath})を特定し、構成ファイルを手動でロードします(例:configfile (hd1,msdos2)/EFI/Boot/grub.cfg)

技術情報

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 の設定ファイルを読み込むことができません。

したがって、スタンドアロンの GRUB EFI ファイルが EFI ファイルと同じディレクトリにある外部 grub.cfg を確実に読み取るように (GRUB 環境内では、${cmdpath} で示されます。) 単純な /tmp/grub.cfg を作成して、その config として ${cmdpath}/grub.cfg を使用するように GRUB に指示します (configfile ${cmdpath}/grub.cfg コマンド そして、この /tmp/grub.cfg ファイルを ${prefix}/grub.cfg にコピーするように grub-mkstandalone に指示を出します。(実際には (memdisk)/boot/grub/grub.cfg である) オプション "boot/grub/grub.cfg=/tmp/grub.cfg" を使用しています。

こうすることで、スタンドアロンの GRUB EFI ファイルと実際の grub.cfg は EFI システムパーティション内の任意のディレクトリに格納でき(同じディレクトリであれば)、移植が可能になります。

Speeding up LUKS decryption in GRUB

警告: Before following this section, make sure you understand the importance of high entropy passwords. Information on how to generate secure passwords can be found at Wikipedia:Password strength.

Upon boot GRUB may in some cases take a long time to verify the password. This can be due to a high PBKDF iteration count, which you can check as follows:

# cryptsetup luksDump /dev/sda3

The problem is that the iteration count for a given keyslot is generated when the key is added to ensure a balance between being high enough to protect against brute force attacks and low enough to allow for fast key derivation by estimating the capabilities of your computer. However, when GRUB is started, it might not have the same computational resources at hand, thus being vastly slower.

If your password provides enough entropy to counter common attacks by itself, you can lower this number:

# cryptsetup luksChangeKey --pbkdf-force-iterations 1000 /dev/sda3

A minimum of 1000 iterations is recommended as per RFC 2898, but you should aim for higher values if you can (The cost for an attacker as well as the time for key derivation scale linearly).

ヒント: GRUB tries enabled key slots sequentially. When adding keys, the --key-slot option can be used to specify a key slot explicitly.

See also