GRUB2 부팅 메뉴에 체인로드 바이너리 항목을 어떻게 추가합니까?

GRUB2 부팅 메뉴에 체인로드 바이너리 항목을 어떻게 추가합니까?

UEFI를 지원하지 않는 Ubuntu 22.04 LTS를 사용하고 있습니다 memtest86+ v5.

Ubuntu 22.04 LTS에 설치하려고 하는데 memtest86+ v6해당 바이너리를 다운로드했습니다.여기.

memtest64.efiEFI 파티션으로 이동 하고 다음을 추가했습니다./etc/grub.d/40_custom

menuentry 'Memtest86+ v6' {
  insmod part_gpt
  insmod fat
  set root='hd0,gpt1'
  chainloader (\$root)/EFI/memtest64.efi
}

그리고 그는 도망쳤다 update-grub. 항목은 부팅 메뉴에 표시되지만 입력하면 다음과 같습니다.

Error: No Server is Specified

GRUB 콘솔에서 hd0,gpt1EFI 파티션임을 확인했습니다.

또는 GRUB이 /boot 폴더에서 Memtest86+를 부팅하도록 하고 싶지만 GRUB를 통해 이를 찾는 방법을 모르겠습니다 /boot.

******@Ubuntu-Portable:~$ sudo lsblk -o +fstype
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS            FSTYPE
sda           8:0    0 953.9G  0 disk                        
├─sda1        8:1    0   476M  0 part /boot/efi              vfat
├─sda2        8:2    0   250G  0 part /                      ext4
└─sda3        8:3    0 703.4G  0 part /media/****/****       exfat
sr0          11:0    1  1024M  0 rom                         
nvme0n1     259:0    0   128G  0 disk                        
├─nvme0n1p1 259:1    0   200M  0 part                        vfat
├─nvme0n1p2 259:2    0   128M  0 part                        
└─nvme0n1p3 259:3    0 127.7G  0 part                        ntfs

고쳐 쓰다:이것은 작동하지만 여전히 efi 파티션 대신 /boot에서 부팅하는 방법을 모릅니다.

menuentry 'Memtest86+ v6' {
  insmod part_gpt
  insmod fat
  insmod chain
  set root=(hd0,gpt1)
  chainloader /EFI/memtest64.efi
}

일을 깔끔하게 유지하기 위해 모든 일은 실내에서 처리하고 싶습니다./etc/grub.d/40_custom

답변1

memtest64.efiEFI /boot시스템 파티션 대신 EFI 시스템 파티션을 배치하려는 경우 다음과 같은 방법을 사용할 수 있습니다.

menuentry 'Memtest86+ v6' {
  insmod part_gpt
  insmod ext2
  insmod chain
  set root=(hd0,gpt2)
  chainloader /boot/memtest64.efi
}

그러나 귀하의 의견에서 지적했듯이 이는 가정되는 저장 장치에 따라 다릅니다 (hd0).

i386-pcGRUB의 BIOS() 아키텍처 버전에서는 저장 장치 식별자가 일반적으로 (hd0)BIOS INT 13h 디스크 번호에 직접 매핑되기 때문에 이는 BIOS 스타일을 부팅할 때 좋은 가정이었습니다 . 즉, (hd0)디스크 0x80을 의미합니다.

BIOS에서 부팅 디스크를 지정하는 안정적이고 호환 가능한 유일한 방법은 필요한 부팅 디스크가 디스크 0x80( (hd0)GRUB에도 동일)이 되도록 BIOS 디스크 목록을 다시 정렬하는 것입니다. 따라서 부팅 디스크를 선택할 때 대부분의 BIOS는 이 방법. 부팅 디스크입니다. BIOS 시스템에서는 GRUB가 어떤 디스크에서 부팅되었는지 100% 확신할 수 있는 보편적인 방법은 없지만 (hd0)거의 항상 맞는 매우 좋은 추측입니다.

UEFI를 사용하면 더 이상 신뢰할 수 없습니다.일부 UEFI 구현은가능한제가 개인적으로 소유한 UEFI 시스템도 같은 일을 합니다.아니요, 그리고 내가 시스템 관리자로 보는 시스템은 일반적으로 이 작업을 수행하지 않는 것 같습니다.

따라서 대신 GRUB 명령을 set root=(hd0,<partition ID>)사용해야 합니다 .search

알려진 경로(경로 이름부터 시작)에서만 파일을 검색할 수 있습니다.파일이 위치한 파일 시스템의 루트 디렉터리, Linux 루트 파일 시스템일 수도 있고 아닐 수도 있음):

search --no-floppy --file --set root /boot/memtest64.efi

grub[2]-mkconfig또는 현재 대부분의 최신 버전이 기본적으로 수행하는 것처럼 문제의 파일 시스템의 UUID를 찾아서 검색할 수 있습니다 .

search --no-floppy --fs-uuid --set root 12345678-9abc-def0-1234-56789abcdef0

이 명령은 --no-floppyGRUB에게 플로피 드라이브 검색 시도를 건너뛰도록 지시하고 명령이 검색 기준을 충족하는 파일 시스템을 가리키도록 변수를 설정하도록 --set root합니다 .searchroot

간단히 말해서, lsblk -o +uuid해당 디렉토리가 포함된 파일 시스템의 UUID를 찾은 후 다음과 같은 코드 조각을 memtest64.efi작성하세요 .40_custom

menuentry 'Memtest86+ v6' {
  insmod part_gpt
  insmod ext2
  insmod chain
  search --no-floppy --fs-uuid --set root <insert filesystem UUID here>
  chainloader /boot/memtest64.efi
}

답변2

이는 EFI/GPT 시스템의 기본 GRUB 파일입니다.

if loadfont unicode ; then
    set gfxmode=1024x768,800x600,auto
    set gfxpayload=800x600,1024x768
    terminal_output gfxterm
fi

set default=0
set timeout=-1

insmod linux
insmod part_gpt
insmod fat
search --no-floppy --set=root --label "ESP"

menuentry "Start Memtest86+, use built-in support for USB keyboards" {
    linux /EFI/memtest86+/memtest keyboard=both
}
menuentry "Start Memtest86+, use BIOS legacy emulation for USB keyboards" {
    linux /EFI/memtest86+/memtest keyboard=legacy
}
menuentry "Start Memtest86+, disable SMP and memory identification" {
    linux /EFI/memtest86+/memtest nosmp nosm nobench
}

관련 정보