임의의 UEFI 부팅 스텁을 만드는 방법은 무엇입니까?

임의의 UEFI 부팅 스텁을 만드는 방법은 무엇입니까?

유지 관리 운영 체제로 TinyCore를 설치했습니다. 나는 GRUB2를 주었다. 그러나 TinyCore 설치 지침에서는 MBR 방법을 사용하여 GRUB2를 추가하도록 지시합니다. (작동하지만 EFI가 MBR과 역호환되기 때문입니다.) 이상적으로는 EFI 부팅 스텁 벡터가 TinyCore의 /boot/grub으로 이동하여 TinyCore의 GRUB2에서 무엇이든 부팅할 수 있도록 연결하고 싶습니다. 시스템은 생각합니다. 또는 두 번째 옵션은 EFI 부팅 스텁 벡터가 TinyCore의 vmlinuz로 이동하도록 연결하고 싶습니다.

TinyCore에는 efibootmgr이 없습니다. Ubuntu USB 스틱에서 부팅하면 efibootmgr에서 "시스템이 efivars를 지원하지 않습니다"라는 메시지가 표시됩니다.

TinyCore의 grub 디렉터리를 다른 Linux 상자로 가져와서 grub.efi를 생성한 다음 이 컴퓨터로 다시 가져와 이 컴퓨터의 ESP에 복사할 수 있는 방법이 있습니까?

답변1

Ubuntu USB 스틱에서 부팅하면 efibootmgr에서 "시스템이 efivars를 지원하지 않습니다"라는 메시지가 표시됩니다.

이는 레거시 BIOS 스타일을 사용하여 USB 스틱에서 부팅하기 때문에 발생하므로 UEFI 호환성 지원 모듈은 부팅 변수에 액세스하기 위해 UEFI 런타임 인터페이스를 비활성화합니다. 기본 UEFI 모드에서 USB 스틱을 부팅할 수 있으면 제대로 efibootmgr작동할 것입니다. 펌웨어 부팅 설정에 UEFI 또는 레거시 부팅 방법을 먼저 시도하는 선택 사항이 포함되어 있는 경우 USB 스틱에서 부팅할 때 "UEFI 우선" 모드로 전환해 보십시오.

레거시 MBR GRUB2를 사용하면 레거시 MBR 스타일을 사용하여 부팅할 수 있는 운영 체제만 부팅할 수 있습니다. 기본 UEFI를 사용하여 부팅하기 위해 설치된 운영 체제에 연결하려면 UEFI 버전의 GRUB2가 필요합니다.

UEFI GRUB를 한 배포판에서 다른 배포판으로 포팅할 때의 문제는 배포판마다 약간 다르게 설정되어 있다는 것입니다. 예를 들어 Debian은 grub.efi다른 배포판에서 더 많은 GRUB 모듈을 읽고 GRUB 설치 시 지정된 파일 시스템(일반적으로 /boot디렉터리가 포함된 파일 시스템)의 구성 파일입니다.

이 접근 방식의 문제점은 보안 부팅이 활성화된 경우 이것이 불가능하다는 것입니다. 로드된 모든 실행 코드는 서명되어야 하며 GRUB 모듈은 표준 UEFI 바이너리와 동일한 바이너리 파일 형식을 사용하지 않기 때문에 로그인된 상태로 사용할 수 없습니다. UEFI 펌웨어로 인식됩니다.

반면 RedHat에서 파생된 배포판은 필요한 모든 GRUB 모듈을 기본 grubx64.efi바이너리에 포함하는 경향이 있으며, 그런 다음 Secure Boot를 통해 단일 작업으로 성공적으로 로드할 수 있습니다 shim.efi. GRUB 구성 파일은 ESP 파일 시스템에도 배치되며 일반적으로 기본 UEFI GRUB 바이너리의 이름을 반영합니다. 즉, 바이너리의 이름이 바뀌면 foo.efi동일한 디렉터리에서 검색됩니다.foo.cfg

이를 알고 있으면 보안 부팅이 비활성화되어 있는지 확인하고 grub.efiRedHat/CentOS/Fedora 설치 미디어에서 바이너리를 가져와서 수동으로 최소 구성 파일을 작성하고 이를 ESP에 넣으면 됩니다(아마 \EFI\boot\bootx64.efiUEFI에서는 \EFI\boot\bootx64.cfg자동으로 선택해야 합니다(아니요). UEFI 변수 필요) 한 번 부팅합니다. 그런 다음 TinyCore의 기본 GRUB 구성 생성기로 생성된 GRUB 구성 파일이 해당 GRUB 버전과 호환되는지 확인한 다음 단순화된 구성 파일을 실제 GRUB로 바꾸거나 이식된 GRUB 버전을 TinyCore 기본 UEFI 버전으로 바꿀 수 있습니다. 애벌레.

UEFI 펌웨어에서 TinyCore를 직접 부팅하려면 vmlinuz컴파일된 커널을 사용해야 하며 CONFIG_EFI_STUB=y그런 다음 부팅 매개변수와 initramfs 파일을 어떻게 처리할지 파악해야 합니다. UEFI 부팅 변수에 부팅 옵션을 구성하여 이 작업을 한 번 수행했습니다. 부트로더가 없으면 부팅 시 부팅 매개변수를 변경하지 못할 수 있으므로 커널 업데이트에 문제가 있을 경우 액세스할 수 있도록 미리 다른 부팅 매개변수를 사용하여 여러 UEFI 부팅 변수 설정을 생성하는 것이 좋습니다. 예를 들어.

(이는 펌웨어 수준 UEFI 부팅 옵션에 UEFI Shell로 부팅하는 방법이 포함된 경우 "부트로더 없는" UEFI 부팅 가능 설치를 설정할 때 유용합니다.)

UEFI 부팅 변수에 사용된 UUID는 blkid명령을 실행하여 검색할 수 있습니다. GRUB는 파일 시스템 UUID(= 이 UUID=필드)를 사용하는 반면 UEFI 부팅 변수는 파티션의 고유 UUID(= 이 PARTUUID=필드)를 사용합니다.

답변2

내가 한 일은 다음과 같습니다. 먼저 PC EFI 옵션을 EFI 부팅 전용으로 설정했습니다. 그런 다음 DVD에서 Ubuntu 16.04.4를 부팅했습니다. (분명히 UEFI 부팅입니다.) Ubuntu 16.04.4에서는 다음을 수행했습니다.

  1. ESP 파티션을 마운트했습니다. (이것은 디스크 1의 파티션 1입니다)
  2. mkdir /path/to/mounted/esp/partition/EFI/prime_boot
  3. grub-efi-amd64 설치: sudo apt-get install grub-efi-amd64
  4. grub-mkimage -o /path/to/mounted/esp/partition/EFI/prime_boot/bootx64.efi --format=x86_64-efi '--prefix=(hd0,gpt1)/EFI/prime_boot' ext2 part_gpt
  5. /path/to/mounted/esp/partition/EFI/prime_boot/에서 다음 grub.cfg 파일을 설정합니다.

    메뉴 항목 "GRUB 체인로더" { 체인로더 (hd0,gpt2)/boot/efi/core.efi }

  6. /usr/lib/grub/x86_64-efi 디렉터리를 /path/to/mounted/esp/partition/EFI/prime_boot/에 복사합니다.

  7. efibootmgr -c -d /dev/sda -p 1 -l \EFI\prime_boot\bootx64.efi -L "기본 로더"
  8. "Primary Loader"를 사용하려면 EFI 메뉴에서 부팅 순서를 설정하세요.

예, "efibootmgr" 명령에서 "\"를 이스케이프해야 합니다. 이제 이 마스터 로더의 EFI를 사용하여 TinyCore 파티션으로 부팅하는 부트 로더가 생겼습니다. 이제 TinyCore 파티션에 대한 부트로더를 설정했습니다.

  1. TinyCore 파티션을 마운트합니다. (내 것은 디스크 1 파티션 2입니다)
  2. grub-mkimage -o /path/to/mounted/tinycore/partition/boot/efi/corex64.efi --format=x86_64-efi '--prefix=(hd0,gpt2)/boot/efi' ext2 part_gpt
  3. 이제 /path/to/mounted/tinycore/partition/boot/efi/에 다중 부팅 grub.cfg를 생성하십시오.

일부 사람들은 제가 왜 기본 부트로더에서 멀티 부트로더로 점프했는지 궁금해할 것입니다. 나는 내 esp 파티션에서 가능한 한 적은 작업을 수행하고 싶습니다. TinyCore(내 유지 관리 OS)가 멀티부팅 부팅 관리자의 소유자가 되기를 원합니다.

관련 정보