우리는 할 수 있다

우리는 할 수 있다

저는 기본 데비안 버스터에 OpenZFS 2.0.0을 설치하고 부팅하는 데 4일을 보냈습니다. 간단히 말해서, OpenZFS 2.0.0이 실행되고 버스터 부팅되지만 약간의 수동 도움이 필요합니다.

재부팅할 때마다 grub이 명령줄에 표시됩니다. 분명히 grub.cfg를 실행하지 않았습니다. grub.cfg를 수동으로 실행하면 시스템이 부팅됩니다.

재부팅 후 명령줄에서 grub을 다루는 수많은 다른 스레드와 Q&A를 읽었습니다. 그러나 나는 나와 비슷한 문제를 발견하지 못했습니다. 지금까지 문제를 발견했다고 생각합니다. 내 질문은 매우 구체적입니다.

grub의 명령 프롬프트에서 명령을 실행 하면 set다음 줄이 나타납니다(물론 무엇보다도):

prefix=(hd0,gpt2)/EFI/debian

저는 Grub 전문가는 물론 Linux 전문가도 아닙니다. 그래서 제가 틀렸을 수도 있지만, 부트로더( grubx64.efi및 각각 shimx64.efi)와 구성 파일( grub.cfg)이 실제로 . 대신 에 위치하기 때문에( 값이 누락된 (hd0,gpt2)/EFI/debian-hdd1후행 에 주의 ) 이것이 범인이라고 생각합니다 .-hdd1prefix(hd0,gpt2)/EFI/debian

따라서 normal명령줄에서 이 명령을 실행하면 아무 일도 일어나지 않습니다(음, 화면이 새로 고쳐지는 것처럼 보이지만 아무 일도 일어나지 않습니다). 그런데 처음 타자를 쳤을 때

set prefix=(hd0,gpt2)/EFI/debian-hdd1

그런 다음 를 입력하면 normal일반적인 grub 부팅 메뉴가 나타납니다.

prefix이로 인해 이 특별한 경우에는 변수가 잘못되었다고 생각하게 됩니다 . 분명히 grub은 명령 프롬프트에 도달했을 때 아직 스크립트를 실행하지 않았습니다. 따라서 값은 prefix기본값이어야 합니다.

질문:

grub은 이 기본값을 어디서 얻나요? 컴파일 타임 옵션인가요, 아니면 어딘가에 설정할 수 있나요? 즉, grub 변수의 기본값 prefix(즉, 스크립트가 아직 실행되지 않았을 때의 이러한 변수의 값)을 어떻게 설정합니까?

참고 사항:

를 설치하는 grub.cfg대신 설치하면 문제를 해결할 수 있다는 것을 알고 있습니다 . 아직 시도하지 않았습니다. 두 가지 이유가 있습니다..../debian.../debian-hdd1

  1. 나는 grub의 기본값을 변경하는 방법을 정말로 배우고 싶습니다 prefix(호기심 또는 행상이라고 부릅니다).

  2. 나는 grub-installUEFI 부팅 항목 이름(옵션을 제공하여 설정 --bootloader-id=debian-hdd1)을 생성된 디렉터리 이름으로 사용하는 것으로 보이는 grub을 설치하고 있습니다.

    시스템이 부팅되는 rpool은 두 개의 디스크 미러로 구성되어 있고 디스크 중 하나에 오류가 발생하면 다른 디스크에서 부팅할 수 있기 때문에 이 형식의 시작 항목 이름이 필요합니다. 따라서 UEFI BIOS 설정에서 두 디스크를 구별할 수 있어야 합니다.

답변1

우리는 할 수 있다

접두사를 영구적으로 변경하는 방법을 찾았습니다. 그러나 다음과 같은 주의 사항이 있습니다. grubx64.efi 바이너리에서 직접 변경해야 하며 파일 길이를 동일하게 유지해야 합니다. 제공되는 공간의 양은 배포판에 따라 달라질 수 있습니다. 자세한 설명을 읽어보시기 바랍니다.

부인 성명

  • 이 작업을 수행하려면 다음을 수행해야 합니다.보안 부팅 끄기해시 값이 변경되고 바이너리가 거부되기 때문입니다. 자체 해시를 설치하여 이 문제를 해결할 수 있는지 확실하지 않습니다(MOK 검색).
  • 항상 백업해두세요변경하려는 파일 수. 나같으면 합격할듯부팅 가능한 USB 플래시 드라이브. 다른 시스템이 없으면 지금 부팅 가능한 USB를 만들고 부팅할 수 있는지 테스트하세요.

먼저 질문:

기본적으로 전체 질문은 다음과 같습니다.안전한 부팅 제한. 보안 부팅이 grubx64.efi 파일을 허용하려면서명이 필요합니다인정된 기관에 의해. 따라서 grub 실행 파일이 서명되고미리 구운. 이 접두사 설정에 대한 현재 표준은 입니다 /EFI/$(lsb_release -i -s). 물론 이는 efibootmgr--loader \\EFI\\other\\SSHIMX64.efi새 부팅 옵션을 생성할 때 어떤 로더 경로를 지정하더라도(예: ) grub 부트 로더의 접두사 변수에 영향을 미치지 않는다는 것을 의미합니다.

해결책:

배포판이 이고 ubuntu어떤 이유로 이름을 로 바꾸려고 한다고 가정해 보겠습니다 longubuntu. 다음 단계를 수행하면 됩니다.

# List contents of EFI directory
find /boot/efi/EFI;
# Rename the directory
mv /boot/efi/EFI/ubuntu /boot/efi/EFI/longubuntu;
# List contents of EFI/longubuntu for easy access
find /boot/efi/EFI/longubuntu;
# Always make a copy of the original
cp /boot/efi/EFI/longubuntu/BOOTX64.CSV /boot/efi/EFI/longubuntu/BOOTX64.CSV.bak
# Inside the .csv-file change 'ubuntu' to 'longubuntu'
nano /boot/efi/EFI/longubuntu/BOOTX64.CSV

계속하기 전에:

있는지 확인하세요.사용 가능한 null 문자가 충분합니다.바이너리 파일에서. 다음이 중요합니다.전체 길이는 동일하게 유지하세요.. 이렇게 하지 않으면 오류가 발생합니다. 이런 일이 발생하면원래 grubx64.efi로 다시 복사하세요.그런 다음 다시 시도해 보세요. 언제VS Code를 사용하여 grubx64.efi-binary를 확인하세요.접두사를 마음대로 변경할 수 있을 만큼 충분한 여유 공간이 있습니다.
/EFI/ubuntu 뒤에 널 문자가 많이 있습니다.

이제 흥미롭고 중요한 부분을 살펴보겠습니다.

이미 말했듯이 바이너리 파일의 길이가 동일하게 유지되어야 합니다. 새 접두사를 nul-chars( )로 채우 거나 텍스트를 nul-chars로 채워서 \0바꿀 수 있습니다.

따라서 내 경우처럼 더 긴 접두사를 지정하려면 다음과 같이 하면 됩니다.

# Parameter -pi.bak will create a backup for you
perl -pi.perlbak -e 's/EFI\/ubuntu\0\0\0\0/EFI\/longubuntu/g' /boot/efi/EFI/longubuntu/grubx64.efi

더 짧은 접두사(예 bent: )를 선택하면 새 값은 다음으로 채워집니다 \0.

# Parameter -pi.bak will create a backup for you
perl -pi.perlbak -e 's/EFI\/ubuntu/EFI\/bent\0\0/g' /boot/efi/EFI/longubuntu/grubx64.efi

작업 결과를 확인할 수 있으며 접두사가 포함된 줄이 인쇄됩니다.

$~: grep -a 'EFI\/longubuntu' /boot/efi/EFI/longubuntu/grubx64.efi

다음을 인쇄합니다.
Grep은 새 접두사를 인쇄합니다.

새로운 시작 옵션을 추가하는 것을 잊지 마세요!

나는 그것을 사용할 것이다 efibootmgr. efibootmgr이전 부팅 옵션을 제거하고 새 부팅 옵션을 추가할 수 있습니다 .

# Print current boot options
:~# efibootmgr -v
BootCurrent: 0000
Timeout: 1 seconds
BootOrder: 0000
Boot0000* ubuntu        HD(1,GPT,28bd5547-5802-4f9c-97da-22ddd968dea6,0x800,0x100000)/File(\EFI\UBUNTU\SHIMX64.EFI)
# Delete current
:~# efibootmgr -b 0 -B
# List disks
:~# lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
[...]
nvme0n1     259:0    0 238.5G  0 disk
├─nvme0n1p1 259:1    0   512M  0 part /boot/efi
└─nvme0n1p2 259:2    0   238G  0 part /
# Create new boot option
:~# efibootmgr --create --disk /dev/nvme0n1 --part 1 --label "Long Ubuntu Name" --loader \\EFI\\longubuntu\\shimx64.efi

즐기다:

지금 재부팅하면. 여전히 이전처럼 배포판으로 부팅해야 합니다.
그렇지 않은 경우 USB 스틱으로 부팅하고 EFI 파티션을 마운트하십시오. 그런 다음 변경 사항을 취소하거나 원본 파일로 다시 복사하세요. 내 장치에서 다음과 같이 EFI 파티션을 마운트했습니다.

:~# lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
[...]
nvme0n1     259:0    0 238.5G  0 disk
├─nvme0n1p1 259:1    0   512M  0 part /boot/efi
└─nvme0n1p2 259:2    0   238G  0 part /
:~# mkdir -p /media/efi; mount /dev/nvme0n1p1 /media/efi

답변2

grub-install을 실행하면 /boot/grub/x86_64-efi/grubx64.efi이 참조가 생성됩니다./boot/grub/grub.cfg

그러면 문제는 에 복사하는 대신 또는 를 /EFI/$GRUB_DISTRIBUTOR/grubx64.efi복사한다는 것입니다 ./usr/lib/grub/x86_64-efi/monolithic/grubx64.efi/usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed

이는 deb 패키지 및 참조에 미리 빌드된 바이너리입니다 /EFI/ubuntu/grub.cfg.

서명을 원할 경우 이것이 필요하다는 것을 알고 있지만 grubx64.efi보안 부팅에 관심이 없다면 이를 올바르게 구현할 수 있어야 합니다.

grubx64.efi어떤 설정을 취해야 하는지 설명하는 설정을 찾을 수 있습니다 . 어쩌면 대안으로 처리될 수도 있으니 확인해 보겠습니다.

하지만 제가 찾은 가장 쉬운 해결책은 수동으로 복사 /boot/grub/x86_64-efi/grubx64.efi한 다음 /EFI/$GRUB_DISTRIBUTOR/grubx64.efi설치하는 것입니다. reFind그러면 자동으로 EFI 폴더를 스캔하고 그래픽 메뉴 항목이 생성됩니다.

/EFI/ubuntu/grub.cfg다음과 같은 메뉴 항목을 생성할 수도 있습니다 .

set timeout=5
set default=0

menuentry '@gorilla configfile' {
        search.fs_uuid c9708fd5-155c-4459-abbe-3a08930cfd05 root lvmid/GkCLQl-oP2y-Op1F-o5Tc-TT8P-0tjW-iV2yTe/SlCPLV-S3jd-
        set prefix=($root)'/@gorilla/boot/grub'
        configfile $prefix/grub.cfg
}

menuentry '@gorilla chainload' {
        search.fs_uuid c9708fd5-155c-4459-abbe-3a08930cfd05 root lvmid/GkCLQl-oP2y-Op1F-o5Tc-TT8P-0tjW-iV2yTe/SlCPLV-S3jd-
        set prefix=($root)'/@gorilla/boot/grub'
        chainloader $prefix/x86_64-efi/core.efi
}

이전 grub 바이너리가 업데이트된 구성을 로드할 수 없을 때 grub-bios에 문제가 발생한 적이 있으므로 구성 파일을 사용하는 것보다 해당 문제를 피하기 위해 /boot/grub/grub.cfg체인로드하는 것이 더 낫다고 생각했습니다 .core.efi

답변3

내 질문에 대한 답변이 아직 없습니다. 즉, prefixgrub-efi에서 기본값을 변경하는 방법을 아직 모른다는 것입니다. 그러나 나는 내 문제에 대한 해결책을 찾았습니다. efibootmgr구조하러 오세요. 지금까지는 잘 이해하지 못했습니다.

--bootloader-id=이 작업을 수행할 때 먼저 해당 옵션을 버렸고 grub-install결과는 동일했습니다 . 이제 --bootloader-id=debian부트로더 파일이 .EFI\debianEFI\debian-hdd1

물론 이제는 UEFI BIOS 설정의 부팅 메뉴 항목도 debian피해야 합니다. 다행히 매뉴얼 페이지를 읽은 후 efibootmgr이 이 상황을 해결하는 데 적합한 도구라는 것이 분명해졌습니다.

먼저 이름이 잘못된 UEFI BIOS 부팅 메뉴 항목을 제거했습니다.

efibootmgr -b 0001 -B

그런 다음 올바른 이름으로 새 UEFI BIOS 부팅 메뉴 항목을 만들었습니다.

efibootmgr -c -d /dev/sda -p 2 -w -L debian-hdd1 -l '\EFI\debian\shimx64.efi'

이 명령은 EFI 파티션의 부트로더인지 여부에 관계없이 실제 부트로더 설치에 영향을 미치지 않습니다 /boot/grub. 대신 실제로는 UEFI 펌웨어에 부팅 메뉴 항목을 생성합니다.

이것이 바로 나에게 필요한 것입니다. 사실 EFI 부트로더가 켜져 있든 EFI\debian꺼져 있든 상관은 없습니다 EFI\something-else.하다UEFI 설정의 부트로더 항목 이름이 걱정됩니다. 이전에는 이것이 UEFI 설정에서 부트로더 항목의 이름을 적절하게 지정하는 유일한 편안한 방법 --bootloader-id이라고 생각했기 때문에 질문이 생겼습니다.grub-install

grub.cfg이제 초기 값이 포함되어 있으므로 시스템이 아무런 문제 없이 부팅되므로 EFI\debiangrub에서 이를 찾을 수 있습니다.

관련 정보