当我运行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.}....................我要问的是:这串是什么意思?如果我删除所有的点(.),它看起来就像是UUID。之间的字符(这将使其成为xBCOBJECT=9deaXXXX-5cXX-4eXX-acXX-f32bXXXXXXXX )。
我也很好奇第二个引导选项的含义是什么:Boot0001* file或详细版本Boot0001* file VenHw(99e2XXXX-75XX-4bXX-a2XX-c538XXXXXXXX)
其他信息:
版本:
$ efibootmgr --version
version 17我的设置: Windows+linux双引导,在linux上我安装了以下引导管理器: grub和systemd-boot。
发布于 2021-09-23 14:58:13
TL;DR:
传递给加载映像的二进制数据缓冲区。
搜索过程的Longer描述
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-loaudt.h声明:
/*
* libefiboot - library for the manipulation of EFI boot variables
* Copyright 2012-2015 Red Hat, Inc.
* Copyright (C) 2001 Dell Computer Corporation
*
...
*/进一步的研究将导致efivar储存库,它在文件src/loaudt.c中包含函数efi_loadopt_desc。在那里,它只返回struct efi_load_option_s的D11字段:
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;因此,在load选项文件路径之后获得输出的部分称为“可选数据”。进一步研究了文件src/efivarfs.c和函数efivarfs_get_variable,表明它读取的efivarfs (efivarfs文件系统)通常位于/sys/固件/efi/efivarfs之下,并公开了许多虚拟“文件”。名以Boot000开头的文件包含有关启动选项的信息,以及其他数据,这些“可选数据”描述特定的启动项。似乎只有当来自引导名称、引导入口文件路径和“可选数据”的组合信息不超过opt_size时才加载“可选数据”。
更多信息:
https://en.wikipedia.org/wiki/Unified_可扩展_固件_Interface#Services
<#>Variable服务 UEFI变量提供了一种存储数据的方法,特别是非易失性数据。一些UEFI变量在平台固件和操作系统之间共享。变量名称空间由GUID标识,变量是键/值对。例如,UEFI变量可用于在崩溃后将崩溃消息保存在NVRAM中,供操作系统在重新启动后检索。
https://en.wikipedia.org/wiki/Unified_可扩展_固件_Interface#UEFI_开机
引导配置由存储在NVRAM中的变量定义,包括指示到OS加载程序或OS内核的文件系统路径的变量。
注意: UEFI规范有关于“可选数据”的说明:
https://uefi.org/specifications https://uefi.org/sites/default/files/resources/UEFI_等级库_2_8_final.pdf (第72页)
OptionalData load选项描述符中的剩余字节是传递给加载映像的二进制数据缓冲区。如果字段为零字节长,则向加载的图像传递空指针。OptionalData中的字节数可以通过从OptionalData的总大小减去EFI_LOAD_OPTION的起始偏移量来计算。
https://unix.stackexchange.com/questions/666459
复制相似问题