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* file
2番目の起動オプションまたは詳細バージョンが何を意味するのか疑問に思います。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 の開始オフセットを減算することで計算できます。