EFIファイルパスの後の「efibootmgr -v」とはどういう意味ですか?

EFIファイルパスの後の「efibootmgr -v」とはどういう意味ですか?

list all boot options を実行すると、efibootmgr出力は次のようになります。

$ efibootmgr
BootCurrent: 0003
Timeout: 1 seconds
BootOrder: 0000,0002,0003,0001
Boot0000* (my linux distro grub boot)
Boot0001* file
Boot0002* Windows Boot Manager
Boot0003* (my linux distro systemd-boot)

より詳細な結果を見るには、次のようにします。

$ efibootmgr -v
BootCurrent: 0003
Timeout: 1 seconds
BootOrder: 0000,0002,0003,0001
Boot0000* (my linux distro grub boot)       HD(1,GPT,3e1eXXXX-f3XX-40XX-b1XX-569aXXXXXXXX,0x800,0x82000)/File(\EFI\DISTRONAME-GRUB\GRUBX64.EFI)
Boot0001* file  VenHw(99e2XXXX-75XX-4bXX-a2XX-c538XXXXXXXX)
Boot0002* Windows Boot Manager  HD(1,GPT,3e1eXXXX-f3XX-40XX-b1XX-569aXXXXXXXX,0x800,0x82000)/File(\EFI\MICROSOFT\BOOT\BOOTMGFW.EFI)WINDOWS.........x...B.C.D.O.B.J.E.C.T.=.{.9.d.e.a.X.X.X.X.-.5.c.X.X.-.4.e.X.X.-.a.c.X.X.-.f.3.2.b.X.X.X.X.X.X.X.X.}....................
Boot0003* (my linux distro systemd-boot)    HD(1,GPT,3e1eXXXX-f3XX-40XX-b1XX-569aXXXX,0x800,0x82000)/File(\EFI\DISTRONAME-SYSTEMDBOOT\systemd-bootx64.efi)

私の推論とマニュアルページ(https://linux.die.net/man/8/efibootmgr)、出力形式は次のとおりです。

BootNNNNA NAME WHATTOBOOT

どこ:

NNNN = boot number (0000 until maybe 9999)
A = * if active, no asterisk if not active
NAME = string label that will be shown on vendor/motherboard BIOS (UEFI)
WHATTOBOOT = can be
  - HD({NUMBER},{GPT/MBR},{UUID-from-blkid-PARTUUID})/File({\PATH\TO\EFI})
  - PXE ((I have no such boot option in this PC))

efibootmgr -v今私が気になったのは、出力が何を意味するのかですWindows boot manager

Boot0002* Windows Boot Manager  HD(1,GPT,3e1eXXXX-f3XX-40XX-b1XX-569aXXXXXXXX,0x800,0x82000)/File(\EFI\MICROSOFT\BOOT\BOOTMGFW.EFI)WINDOWS.........x...B.C.D.O.B.J.E.C.T.=.{.9.d.e.a.X.X.X.X.-.5.c.X.X.-.4.e.X.X.-.a.c.X.X.-.f.3.2.b.X.X.X.X.X.X.X.X.}....................
  • PARTUUIDに基づいて私のEFIパーティションにあります(他の起動オプションと同じ)。
  • その後、対応するEFIファイルは\ EFI \ MICROSOFT \ BOOT \ BOOTMGFW.EFIにあります。
  • 最後に、文字列(またはバイナリ)は次のようになります。
    WINDOWS.........x...B.C.D.O.B.J.E.C.T.=.{.9.d.e.a.X.X.X.X.-.5.c.X.X.-.4.e.X.X.-.a.c.X.X.-.f.3.2.b.X.X.X.X.X.X.X.X.}....................
    

私が尋ねたいのは、この文字列が何を意味するのかです。 (これは次のようになります。)の間にあるすべての点(.)文字を削除するとxBCOBJECT=9deaXXXX-5cXX-4eXX-acXX-f32bXXXXXXXX

Boot0001* file2番目の起動オプションまたは詳細バージョンが何を意味するのか疑問に思います。Boot0001* file VenHw(99e2XXXX-75XX-4bXX-a2XX-c538XXXXXXXX)

  • これは、数年前に起動するために削除するのを忘れたフラッシュドライブ/サムドライブのようです。これは正しいですか?または他のもの?

追加情報:

バージョン:

$ efibootmgr --version
version 17

私の設定:Windows + linuxデュアルブート、Linuxではgrubとsystemd-bootブートマネージャをインストールしました。

答え1

簡単に言うと:

ロードされたイメージに渡されるバイナリデータバッファ。

検索プロセスの詳細な説明

efibootmgrソースEFIブート変数を出力する関数が含まれています(efibootmgr.cファイル):

  static void
  show_vars(const char *prefix)
  {
          list_t *pos;
          var_entry_t *boot;
          const unsigned char *description;
          efi_load_option *load_option;

          list_for_each(pos, &entry_list) {
                  boot = list_entry(pos, var_entry_t, list);
                  load_option = (efi_load_option *)boot->data;
                  description = efi_loadopt_desc(load_option, boot->data_size);
                  if (boot->name)
                          printf("%s", boot->name);
                  else
                          printf("%s%04X", prefix, boot->num);

                  printf("%c ", (efi_loadopt_attrs(load_option)
                          ⁞      & LOAD_OPTION_ACTIVE) ? '*' : ' ');
                  printf("%s", description);

                  show_var_path(load_option, boot->data_size);

                  fflush(stdout);
          }
  }

このラインが面白い

description = efi_loadopt_desc(load_option, boot->data_size);

だから私たちは関数を見つけなければなりませんefi_loadopt_desc。 efibootmgr自体には含まれていません。 /usr/includeでインクルードファイルを検索すると、次のようになります。

$ grep -ri efi_loadopt_desc /usr/include
/usr/include/efivar/efiboot-loadopt.h:extern const unsigned char * efi_loadopt_desc(efi_load_option *opt,

/usr/include/efivar/efiboot-loadopt.h ファイルの内部状態を調べると、次のようになります。

/*
 * libefiboot - library for the manipulation of EFI boot variables
 * Copyright 2012-2015 Red Hat, Inc.
 * Copyright (C) 2001 Dell Computer Corporation <[email protected]>
 *
 ...
 */

さらなる調査結果efivarリポジトリefi_loadopt_desc、src / loadopt.cファイルに関数が含まれています。ただopt->description次のフィールドを返しますstruct efi_load_option_s

last_desc = ucs2_to_utf8(opt->description, limit);

構造は次のように定義されます。

typedef struct efi_load_option_s {
        uint32_t attributes;
        uint16_t file_path_list_length;
        uint16_t description[];
        // uint8_t file_path_list[];
        // uint8_t optional_data[];
} PACKED efi_load_option;

したがって、オプションファイルパスをロードした後に出力される部分を「オプションデータ」といいます。ファイルsrc/efivarfs.cと機能のさらなる調査efivarfs_get_variableにより、通常は/sys/firmware/efi/efivarfsの下にあるefivarfs(EFI varファイルシステム)を読み取り、複数の仮想「ファイル」を公開することがわかりました。名前が「Boot000オプションデータ」で始まるファイルには、ブートオプションおよびその他のデータに関する情報が含まれています。この「オプションデータ」は、特定のブートエントリを記述します。 「オプションデータ」は、開始名、開始エントリファイルパス、および「オプションデータ」を合わせた情報がを超えない場合にのみロードされるようですopt_size

追加情報:

https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface#Services

変更可能なサービス
UEFI変数はデータ、特に不揮発性データを保存する方法を提供します。一部のUEFI変数は、プラットフォームファームウェアとオペレーティングシステム間で共有されます。変数名前空間はGUIDによって識別され、変数はキー/値のペアです。たとえば、UEFI変数を使用すると、競合後に競合メッセージをNVRAMに保持して、オペレーティングシステムが再起動後にそのメッセージを取得できます。 [45]

https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface#UEFI_booting

ブート構成は、オペレーティングシステムローダまたはオペレーティングシステムカーネルへのファイルシステムパスを表す変数を含む、NVRAMに格納された変数によって定義されます。

メモ:UEFI 仕様には、「オプションデータ」に関する規定があります。

https://uefi.org/仕様
https://uefi.org/sites/default/files/resources/UEFI_Spec_2_8_final.pdf (72ページ)

オプションのデータ
ロードオプション記述子の残りのバイトは、ロードされたイメージに渡されるバイナリデータバッファです。フィールド長が0バイトの場合、ロードイメージにNULLポインタが渡されます。 OptionalData のバイト数は、EFI_LOAD_OPTION の合計バイトサイズから OptionalData の開始オフセットを減算することで計算できます。

関連情報