web-dev-qa-db-ja.com

(UEFI)チェーンロードGRUB from GRUB

用語:ESP = FAT32 EFIパーティション。

したい:

  • 自己完結型があるGRUB install on my ESP that chainloads another GRUB bootloader on my distro root filesystem(/) 。現在、パーティションにGRUB=がインストールされていないディストリビューションがいくつかあります。それぞれが独自のext4 /に完全にインストールされています。すべてのディストリビューションに独自のセカンダリブートローダーが必要です。
  • プライマリも受け入れられますESP GRUB OSからgrub.cfgを使用して再起動/再ロードします。効果的にそれ自体をチェーンロードします。

私が試したこと:

  • 私が見つけた例には、ブートGRUB GRUB2からのレガシー、およびその逆のものが含まれますが、UEFIおよび.efiファイルを使用しません。GNU GRUBのドキュメントではUEFIについても触れられていません。Arch/ Ubuntu/Gentooウィキでは、基本的な(チェーンローディングではない)インストールをセットアップするための最小限の情報を提供しています。

これまでのところ:

  • GRUB上にESP grub-installおよびgrub-mkconfigを使用してインストールしました。テストブートは機能します。これは、/boot/grubフォルダが空で、ESPは、起動中/起動後にマウントする必要はありません。
  • /boot/efi//boot/grub/に2つ目のgrubをインストールしようとしましたが、EFI部分がインストールされず、grub-installはターゲットがEFIパーティションではないと不平を言っています。しかし、私はすでにプライマリGRUB=がインストールされているので、セカンダリGRUBがext4 rootfsにあるかどうかは問題ではありませんか?Grubはext4を読み取ることができます。 --forceオプションも試してみました。

したがって、grubx64.efiの下に/boot/EFIをインストールしてもよいことをインストーラに納得させるいくつかの方法を見つける必要があるようです...

私がプライマリGRUBをどのようにインストールしたかについて誰かが興味があるなら、それは私のESPに関してgrub-installで正しいオプションを使用することの問題でした。

4
jiggunjer

.efiに手動で/を手動でインストールする方法を見つけました。プライマリ設定からセカンダリGRUBチェーンローダーを参照するのは簡単です:

menuentry "GRUB chainloader" {
 #Load grub on partition 7 of a gpt formatted drive. 
 #It will reference its own modules and config.
 chainloader (hd0,gpt7)/path/to/bootloader/on/myOS/core.efi
}

このセカンダリ.efiを作成するためにgrub-mkimageを使用したのは、grub-installが非FATファイルシステムへの書き込みを許可しなかったためです。構文は非常にうるさく、間違ったパスを使用してもエラーが発生しないため、引数を注意深く確認してください。

grub-mkimage -o /path/to/mounted/targetOS/efidir/core.efi --format=x86_64-efi '--prefix=(hd0,gpt7)/boot/grub' ext2 part_gpt

GPTまたはext2ファイルシステムモジュールを省いてみましたが、うまくいきませんでした。これらの2つのモジュールは、私のシステムの絶対最小要件でした(ext2はext2/3/4で動作します)。

プレフィックスディレクトリは、セカンダリブートローダーがモジュールフォルダと設定ファイルを探す場所です。そのため、/boot/grub/フォルダを含む各OSのx86_64-efi/を手動で作成しました(/usr/lib/grub)およびgrub.cfgからコピーしました。OS-でgrub-mkconfigを使用して変更できますプローブを無効にします(または手動で編集します)。

私は最初に各OSをGRUBなしでインストールしました。この方法では、最初のOSまたはGRUBを使用したLiveCDを使用して、すべてのオペレーティングシステムにセカンダリGRUBブートローダーをインストールできました。各OSのブート構成を個別に変更できます。ESPはマウントされないため、汚染のリスクはありません。

4
jiggunjer

別の方法もあります。GRUBに、別のLinuxディストリビューションなどの別のgrub.cfgをロードするように指示するメニューエントリを作成できます。

たとえば、Gentoo Linuxから始めて、GRUB2をMBRにインストールしました(マシンはEFIには古すぎます)。

次に、独自のgrub.cfgを生成するように構成したNixOSをインストールしました/ boot(Gentooの/とは別) bootなし GRUBをインストールします。

明確にするために、 grub-installはGentooから実行されましたが、NixOSからは実行されませんでした。

次に、NixOSを起動できるように、Gentooの/ etc/grub.d/40_customにこれを追加しました:

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.

menuentry 'NixOS' --class gnu-linux --class gnu --class os $menuentry_id_option 'nixos-0aca58bc-8fdb-4a07-aa2f-56406bcf19b7' {
        set root='hd0,msdos4'
        configfile /nixos/root/boot/grub/grub.cfg
}

キーはconfigfile /nixos/root/boot/grub/grub.cfg行。 GRUBに別のgrub.cfgをロードするように指示します。次にgrub-mkconfig Gentooから変更を適用します。

ここで、起動してNixOSを選択すると、GRUBインターフェース全体が更新され、NixOS grub.cfgが反映されます。 OSを起動できます。チェーンロードとは異なり、この構成ではGRUBの単一のインストールを利用し、2番目の構成を使用します。

8
Emmanuel Rosa

私はi386-pc grubに対して同様のことを行おうとしていますが、core.imgファイルのチェーンローダーが機能せず、「エラー:無効な署名」が表示されます

しかし、grub core.imgファイルがマルチブートに準拠していることを知っていたので、次のようにcore.imgを起動できました。

multiboot (hd0,7)/core.img
boot

そして、新しいGRUBを正常に取得します。それは、モジュールと初期構成です。

私はあなたのチェーンローダーコマンドが非efi grubのefiで失敗するので、この失敗を検出して、bootコマンドの前にcore.imgでマルチブートにフォールバックできると思います。

0
Sam Liddicott