UEFI에서 grub2 메뉴 항목을 나열하는 방법

UEFI에서 grub2 메뉴 항목을 나열하는 방법

Linux의 grub2 메뉴 항목 목록을 가져오고 싶습니다(centos 8 / fedora 32)UEFI를 켜고 사용하세요 grub2-set-default.

UEFI가 아닌 환경에서 이 명령을 사용하여 메뉴 목록을 가져올 수 있습니다.

awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg

grub.cfg가 uefi와 다른 경로에 있다는 것을 알고 있습니다.

#non uefi cfg
/etc/grub2.cfg -> /boot/grub2/grub.cfg
#uefi cfg
/etc/grub2-efi.cfg  -> ../boot/efi/EFI/centos/grub.cfg

/etc/grub2-efi.cfg 하지만 UEFI가 아닌 환경에서는 모든 메뉴 항목을 가져올 수 없는 경우 .

[root@vm-centos centos]# grep ^menuentry /etc/grub2-efi.cfg
menuentry 'System setup' $menuentry_id_option 'uefi-firmware' {

나는 무엇을 해야 합니까?

답변1

RHEL/CentOS 8에서 GRUB는 blscfg로 시작하는 새 모듈 을 사용합니다 /boot/loader/entries/. .conf항목당 하나의 파일이 있어야 합니다.

자세한 내용은 다음을 참조하세요. https://fedoraproject.org/wiki/Changes/BootLoaderSpecByDefault

이는 UEFI와는 아무런 관련이 없지만 MBR 기반의 클래식 GRUB에서도 사용됩니다. 실제로 이 /boot/loader/entries/디렉터리와 해당 파일은 s390x 또는 aarch64와 같이 GRUB를 전혀 사용하지 않는 아키텍처에도 존재합니다.

/boot/loader/entries/*.conf부팅 항목은 숫자가 아닌 이름으로 식별됩니다. 이름은 기본적으로 경로와 접미사가 없는 개별 파일의 이름입니다 .conf.

awk다음은 RHEL/Centos 8의 줄과 매우 유사할 수 있습니다.

for i in /boot/loader/entries/*.conf
do 
    entryname=$(basename $i .conf)
    entrytitle=$(grep title $i | cut -f 2-)
    echo "$entryname : $entrytitle"
done

기본 항목은 (레거시 BIOS/MBR 시스템의 경우) 또는 (UEFI 시스템의 경우) 설정으로 식별됩니다 saved_entry=. 기본 설치에서는 두 파일 모두 BIOS/MBR 및 UEFI 부팅 가능 시스템에 동일한 내용으로 존재하지만 부팅 시 기본이 아닌 항목을 선택한 경우 GRUB에서는 파일 중 하나만 수정합니다./boot/grub2/grubenv/boot/efi/EFI/redhat/grubenv

이 코드 조각은 현재 선택된 부팅 항목을 식별하는 데 사용할 수 있습니다.

if [ -d /sys/firmware/efi ]
then
    envfile=/boot/efi/EFI/redhat/grubenv
else
    envfile=/boot/grub2/grubenv
fi
bootdefault=$(awk -F '=' '/^saved_entry/{print $2;}' $envfile)
echo "Default boot entry name: $bootdefault"

관련 정보