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
두 번째 부팅 옵션 또는 자세한 버전이 무엇을 의미하는지 궁금합니다.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의 시작 오프셋을 빼서 계산할 수 있습니다.