용어: ESP = 내 FAT32 EFI 파티션.
나는 원해요:
- ESP 링크에 독립형 GRUB를 설치하면 배포판의 루트 파일 시스템( )에
/
또 다른 GRUB 부트로더가 로드됩니다 . 현재 내 파티션에는 GRUB가 설치되지 않은 여러 배포판이 있습니다. 각각은 자체 ext4에 완전히 설치됩니다/
. 둘 다 자신만의 보조 부트로더가 있었으면 좋겠습니다. - OS에서 grub.cfg를 사용하여 기본 ESP GRUB를 재부팅/다시 로드하는 것도 허용됩니다. 효과적으로 체인 로딩됩니다.
내가 시도한 것:
- 내가 찾은 예에는 GRUB2에서 GRUB 레거시를 부팅하거나 그 반대로 부팅하는 것이 포함되지만 UEFI 및 .efi 파일은 사용하지 않습니다. GNU GRUB 문서에는 UEFI에 대한 언급조차 없으며 Arch/Ubuntu/Gentoo wiki는 기본(비체인로딩) 설치를 설정하는 데 필요한 가장 기본적인 정보를 제공합니다.
지금까지:
grub-install
grub-mkconfig
.Test boot를 사용하여 ESP에 GRUB를 설치했습니다 . 이는 내/boot/grub
폴더가 비어 있고 시작 중/시작 후에 ESP를 설치할 필요가 없음을 의미합니다.- 두 번째 그럽을 설치하려고 시도했지만 EFI 부분을 설치하지 못하고 대상이 EFI 파티션이 아니라고 불평했습니다
/boot/efi/
. 하지만 이미 기본 GRUB가 설치되어 있으므로 보조 GRUB가 ext4 rootfs에 있다는 것은 중요하지 않습니다. 그렇죠? Grub은 ext4를 읽을 수 있습니다. 나는 또한 이 옵션을 시도했습니다./boot/grub/
grub-install
--force
grubx64.efi
그래서 설치 프로그램이 다음에 설치될 수 있다고 설득할 수 있는 방법을 찾아야 할 것 같습니다 /boot/EFI
.
grub-install
기본 GRUB를 어떻게 설치했는지 궁금한 사람이 있다면 ESP와 관련된 올바른 옵션을 사용하는 것이 문제였습니다.
답변1
또 다른 방법이 있습니다. GRUB에게 다른 Linux 배포판과 같은 다른 보조 grub.cfg를 로드하도록 지시하는 메뉴 항목을 생성할 수 있습니다.
예를 들어, Gentoo Linux로 시작하여 GRUB2를 MBR에 설치했습니다(머신은 EFI에 비해 너무 오래되었습니다).
그런 다음 자체적으로 grub.cfg를 생성하도록 구성한 NixOS를 설치했습니다./시작하다(젠투와 별개/시작하다) 하지만아니요GRUB를 설치합니다.
명확히 하기 위해 grub-install
이는 NixOS가 아닌 Gentoo에서 실행됩니다.
다음으로 NixOS를 부팅할 수 있도록 다음 항목에 추가했습니다./etc/grub.d/40_custom젠투에서:
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
menuentry 'NixOS' --class gnu-linux --class gnu --class os $menuentry_id_option 'nixos-0aca58bc-8fdb-4a07-aa2f-56406bcf19b7' {
set root='hd0,msdos4'
configfile /nixos/root/boot/grub/grub.cfg
}
핵심은 configfile /nixos/root/boot/grub/grub.cfg
라인이다. GRUB에게 또 다른 grub.cfg를 로드하라고 지시합니다. 그런 다음 grub-mkconfig
Gentoo에서 실행하여 변경 사항을 적용했습니다.
이제 실행하고 선택하면닉 OS전체 GRUB 인터페이스는 운영 체제를 부팅할 수 있는 NixOS grub.cfg를 반영하도록 새로 고쳐집니다. 체인 로딩과 달리 이 구성은 GRUB의 단일 설치를 사용하며 단순히 두 번째 구성을 사용합니다.
답변2
.efi
각 장치에 수동으로 설치하는 방법을 알아냈습니다 /
. 기본 구성에서 보조 GRUB 체인로더를 참조하는 것은 간단합니다.
menuentry "GRUB chainloader" {
#Load grub on partition 7 of a gpt formatted drive.
#It will reference its own modules and config.
chainloader (hd0,gpt7)/path/to/bootloader/on/myOS/core.efi
}
이 보조 파일을 생성하기 위해 FAT가 아닌 파일 시스템에 쓸 수 없기 때문에 .efi
이를 사용했습니다 . 구문은 매우 까다로우며 잘못된 경로를 사용해도 오류가 발생하지 않으므로 매개변수를 다시 확인하세요.grub-mkimage
grub-install
grub-mkimage -o /path/to/mounted/targetOS/efidir/core.efi --format=x86_64-efi '--prefix=(hd0,gpt7)/boot/grub' ext2 part_gpt
GPT 또는 ext2 파일 시스템 모듈을 생략하려고 시도했지만 작동하지 않았습니다. 이 두 모듈은 내 시스템의 절대 최소 요구 사항입니다(ext2는 ext2/3/4에서 작동함).
접두사 디렉터리는 보조 부트로더가 모듈 폴더와 구성 파일을 찾는 곳입니다. 그래서 각 OS에 대한 폴더가 포함된 폴더를 /boot/grub/
수동으로 만들었습니다 (복사 하여 OS 검색을 비활성화한 상태에서 수정하거나 수동으로 편집 할 수 있음 ).x86_64-efi/
/usr/lib/grub)
grub.cfg
grub-mkconfig
처음에는 GRUB를 설치하지 않고 각 운영 체제를 설치합니다. 이 방법을 사용하면 첫 번째 운영 체제 또는 GRUB가 포함된 LiveCD를 사용하여 모든 운영 체제에 보조 GRUB 부트 로더를 설치할 수 있습니다. ESP가 설치되지 않았으므로 오염 위험 없이 각 운영 체제의 부팅 구성을 독립적으로 변경할 수 있습니다.
답변3
i386-pc grub과 비슷한 작업을 시도 중인데 core.img 파일의 체인로더가 작동하지 않고 "오류: 잘못된 서명"이 발생합니다.
하지만 grub core.img 파일이 멀티부트와 호환된다는 것을 알게 되었기 때문에 다음과 같이 core.img를 부팅할 수 있었습니다.
multiboot (hd0,7)/core.img
boot
새로운 grub, 해당 모듈 및 초기 구성을 성공적으로 얻었습니다.
체인로더 명령이 efi grub이 아닌 efi에서 실패한 것 같습니다. 따라서 이 오류는 부팅 명령 전에 감지되어 core.img에서 멀티부팅으로 대체될 수 있습니다.