任意のUEFIブートスタブを作成するには?

任意のUEFIブートスタブを作成するには?

メンテナンスオペレーティングシステムとしてTinyCoreをインストールしました。私はGRUB2を与えた。ただし、TinyCoreのインストール手順では、MBRメソッドを使用してGRUB2を追加するように指示します。 (動作しますが、EFIがMBRと互換性があるためです。)理想的には、EFIブートスタブベクトルをTinyCoreの/boot/grubに移動し、TinyCoreのGRUB2から何でも起動できるように接続したいと思います。システムは考えます。あるいは、2番目のオプションは、EFIブートスタブベクトルがTinyCoreのvmlinuzに移動するようにリンクしたいと思います。

TinyCoreにはefibootmgrはありません。 Ubuntu USBスティックから起動すると、efibootmgrに「システムはefivarsをサポートしていません」というメッセージが表示されます。

TinyCoreのgrubディレクトリを別のLinuxボックスにインポートしてgrub.efiを作成してから、このコンピュータに再インポートしてこのコンピュータのESPにコピーする方法はありますか?

答え1

Ubuntu USBスティックから起動すると、efibootmgrに「システムはefivarsをサポートしていません」というメッセージが表示されます。

これは、従来の BIOS スタイルを使用して USB スティックから起動するために発生するため、UEFI 互換性サポートモジュールは起動変数にアクセスするために UEFI ランタイムインターフェイスを無効にします。デフォルトのUEFIモードでUSBスティックを起動できる場合は、正常にefibootmgr動作します。ファームウェア起動設定にUEFIまたは従来の起動方法を最初に試す選択肢が含まれている場合は、USBスティックから起動するときに「UEFI優先」モードに切り替えてみてください。

レガシーMBR GRUB2では、レガシーMBRスタイルを使用して起動できるオペレーティングシステムのみを起動できます。デフォルトのUEFIを使用して起動するためにインストールされているオペレーティングシステムに接続するには、UEFIバージョンのGRUB2が必要です。

UEFI GRUBをあるディストリビューションから別のディストリビューションに移植する際の問題は、ディストリビューションごとにわずかに異なる設定になっていることです。たとえば、Debianはgrub.efi他のディストリビューションからより多くのGRUBモジュールを読み込み、GRUBのインストール時に指定されたファイルシステム(通常は/bootディレクトリを含むファイルシステム)の設定ファイルです。

このアプローチの問題は、セキュアブートが有効になっているとこれが不可能であることです。ロードされたすべての実行コードは署名する必要があり、GRUBモジュールは標準のUEFIバイナリと同じバイナリファイル形式を使用しないため、ログイン状態では使用できません。 UEFIファームウェアとして認識されます。

一方、RedHatから派生したディストリビューションは、必要なすべてのGRUBモジュールをデフォルトのgrubx64.efiバイナリに含める傾向があり、その後Secure Bootを介して単一の操作で正常にロードできますshim.efi。 GRUB設定ファイルはESPファイルシステムにも配置され、通常はデフォルトのUEFI GRUBバイナリの名前を反映します。つまり、バイナリの名前が変更されると、foo.efi同じディレクトリから検索されます。foo.cfg

これを知っている場合は、grub.efiセキュアブートが無効になっていることを確認し、RedHat / CentOS / Fedoraインストールメディアからバイナリをインポートして手動で最小設定ファイルを作成し、それをESPに入れます(おそらく\EFI\boot\bootx64.efiUEFIでは\EFI\boot\bootx64.cfg自動的に選択する必要があります)。変数が必要)一度起動します。その後、TinyCoreのデフォルトのGRUB設定ジェネレータで作成されたGRUB設定ファイルがそのGRUBバージョンと互換性があることを確認してから、簡略化された設定ファイルを実際のGRUBに置き換えるか、移植されたGRUBバージョンをTinyCoreのデフォルトUEFIバージョンに置き換えることができます。幼虫。

UEFIファームウェアからTinyCoreを直接起動するには、コンパイルされたvmlinuzカーネルを使用し、CONFIG_EFI_STUB=y起動パラメータとinitramfsファイルをどのように処理するかを把握する必要があります。 UEFIブート変数にブートオプションを設定して、これを一度行いました。ブートローダがないと、起動時に起動パラメータを変更できない可能性があるため、カーネルの更新に問題がある場合にアクセスできるように、事前に異なる起動パラメータを使用して複数のUEFI起動変数設定を作成することをお勧めします。例えば。

(これは、ファームウェアレベルのUEFI起動オプションにUEFIシェルから起動する方法が含まれている場合は、「ブートローダなし」のUEFI起動可能インストールを設定するのに役立ちます。)

UEFIブート変数で使用されているUUIDは、blkidコマンドを実行して取得できます。 GRUBはファイルシステムUUID(=このUUID=フィールド)を使用し、UEFIブート変数はパーティションの一意のUUID(=このフィールドPARTUUID=)を使用します。

答え2

私がしたことは次のとおりです。まず、PC EFIオプションをEFIブート専用に設定しました。その後、DVDからUbuntu 16.04.4を起動しました。 (明らかにUEFIブートです。)Ubuntu 16.04.4では、次のことを行いました。

  1. ESPパーティションをマウントしました。 (これはディスク1のパーティション1です)
  2. mkdir /path/to/mounted/esp/partition/EFI/prime_boot
  3. grub-efi-amd64 インストール: sudo apt-get install grub-efi-amd64
  4. grub-mkimage -o /path/to/mounted/esp/partition/EFI/prime_boot/bootx64.efi --format=x86_64-efi '--prefix=(hd0,gpt1)/EFI/prime_boot' ext2 part_gpt
  5. /path/to/mounted/esp/partition/EFI/prime_boot/ で次の grub.cfg ファイルを設定します。

    メニュー項目「GRUBチェーンローダ」{チェーンローダ(hd0、gpt2)/boot/efi/core.efi}

  6. /usr/lib/grub/x86_64-efi ディレクトリを /path/to/mounted/esp/partition/EFI/prime_boot/ にコピーします。

  7. efibootmgr -c -d /dev/sda -p 1 -l \EFI\prime_boot\bootx64.efi -L "デフォルトローダー"
  8. 「Primary Loader」を使用するには、EFIメニューで起動順序を設定してください。

はい、「efibootmgr」コマンドで「\」をエスケープする必要があります。これで、このマスターローダーのEFIを使用してTinyCoreパーティションから起動するブートローダーが作成されました。これでTinyCoreパーティションのブートローダを設定しました。

  1. TinyCoreパーティションをマウントします。 (私はディスク1パーティション2です)
  2. grub-mkimage -o /path/to/mounted/tinycore/partition/boot/efi/corex64.efi --format=x86_64-efi '--prefix=(hd0,gpt2)/boot/efi' ext2 part_gpt
  3. 次に、/path/to/mounted/tinycore/partition/boot/efi/ にマルチブート grub.cfg を作成します。

何人かの人々は私がなぜ基本的なブートローダーからマルチブートローダーにジャンプしたのか疑問に思うかもしれません。私はespパーティションでできるだけ少ないことをしたいと思います。 TinyCore(私のメンテナンスOS)がマルチブートブートマネージャの所有者になりたいです。

関連情報