首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在EFI文件路径之后,“efibootmgr-v”的含义是什么?

在EFI文件路径之后,“efibootmgr-v”的含义是什么?
EN

Unix & Linux用户
提问于 2021-08-27 04:37:14
回答 1查看 860关注 0票数 1

当我运行efibootmgr列出所有引导选项时,输出如下:

代码语言:javascript
复制
$ 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)

当我想看到更详细的输出时,我会看到以下内容:

代码语言:javascript
复制
$ 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),输出的格式是:

代码语言:javascript
复制
BootNNNNA NAME WHATTOBOOT

其中:

代码语言:javascript
复制
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的意义,它显示为:

代码语言:javascript
复制
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.}.

我要问的是:这串是什么意思?如果我删除所有的点(.),它看起来就像是UUID。之间的字符(这将使其成为xBCOBJECT=9deaXXXX-5cXX-4eXX-acXX-f32bXXXXXXXX )。

我也很好奇第二个引导选项的含义是什么:Boot0001* file或详细版本Boot0001* file VenHw(99e2XXXX-75XX-4bXX-a2XX-c538XXXXXXXX)

  • 我怀疑这是几年前我忘记删除的闪存盘/拇指驱动器的引导,这是正确的吗?或者是别的什么东西?

其他信息:

版本:

代码语言:javascript
复制
$ efibootmgr --version
version 17

我的设置: Windows+linux双引导,在linux上我安装了以下引导管理器: grub和systemd-boot。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2021-09-23 14:58:13

TL;DR:

传递给加载映像的二进制数据缓冲区。

搜索过程的Longer描述

efibootmgr源包含一个函数,它输出EFI引导变量(文件efibootmgr.c):

代码语言:javascript
复制
  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);
          }
  }

感兴趣的是线

代码语言:javascript
复制
description = efi_loadopt_desc(load_option, boot->data_size);

因此,我们需要找到一个函数efi_loadopt_desc。它并不包含在efibootmgr本身中。对/usr/include中的包含文件的搜索提供:

代码语言:javascript
复制
$ 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声明:

代码语言:javascript
复制
/*
 * 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_sD11字段:

代码语言:javascript
复制
last_desc = ucs2_to_utf8(opt->description, limit);

该结构被定义为

代码语言:javascript
复制
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的起始偏移量来计算。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/666459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档