GRUB2: 오류: '(hd0,)' 디스크를 찾을 수 없습니다.

GRUB2: 오류: '(hd0,)' 디스크를 찾을 수 없습니다.

그러나 새로운 LFS 시스템을 부팅하려고 하면 Linux From Scratch가 거의 완료되었습니다. GRUB이 시스템을 시작할 수 없습니다:

오류: 디스크 '(hd0,)'을 찾을 수 없습니다.

그런 다음 출력을 사용합니다 grub> ls
. (hd0) (hd0, gpt4) (hd0, gpt3) (hd0, gpt2) (hd0, gpt1)
호스트 시스템이 UEFI 및 GPT를 사용하고 있기 때문에 UEFI와 함께 GRUB를 사용한다는 점을 제외하고는 특별한 지침을 따랐습니다.
다음은 파티션 테이블입니다.

  • /dev/sda GPT
  • /dev/sda1: 크기는 512MB입니다. EFI 시스템 파티션. FAT32
  • /dev/sda2: 크기는 16GB입니다. 리눅스 스왑. [교환]
  • /dev/sda3: 크기는 64GB입니다. 리눅스 x86_64 루트. 확장 4. 호스트 시스템.
  • /dev/sda4: 크기는 32GB입니다. 리눅스 x86_64 루트. 확장 4. LFS 시스템. sda1에 grub을 설치했습니다. sda1의 파일 트리는 다음과 같습니다.
.
├── config-5.16.9
├── EFI
│   └── LFS
│       └── grubx64.efi
├── grub
│   ├── fonts
│   ├── grub.cfg
│   ├── grubenv
│   ├── i386-pc
│   ├── locale
│   │   ├── ast.mo
│   │   ├── ca.mo
│   │   ├── ...
│   │   └── zh_TW.mo
│   └── x86_64-efi
│       ├── acpi.mod
│       ├── ...
│       └── zstd.mod
├── System.map-5.16.9
└── vmlinuz-5.16.9-lfs-11.1-systemd

내용은 다음과 같습니다 grub.cfg.

set default=0
set timeout=5
insmod part_gpt
insmod vfat # I've tried fat here.  
set root=(hd0) #I've tried (hd0,gpt1), (hd0,gpt4), (hd0,1) .etc here.  

if loadfont /boot/grub/fonts/unicode.pf2; then
        set gfxmode=auto
        insmod all_video
        terminal_output gfxterm
fi

menuentry "GNU/Linux, Linux 5.16.9-lfs-11.1"{
        linux /boot/vmlinuz-5.16.9-lfs-11.1 root=/dev/sda4 ro
}

menuentry "Firmware Setup"{
        fwsetup
}

저는 주로 다음 참고자료를 참고했습니다.

또한 CSM 지원이나 레거시 없이 UEFI를 사용하도록 설정했습니다.
자세한 내용은:

  • GRUB 버전 2.06
  • LFS 버전 11.1-systemd
  • Linux 커널 버전 5.16.9
  • 보안 부팅 비활성화됨

답변1

처음에 GRUB는 UEFI 서비스를 사용하여 ESP에 액세스했으므로 펌웨어 지원이 없으면 ext4GRUB는 FAT32만 읽을 수 있습니다. ext4나중에 읽을 수 있지만 insmod ext2그러려면 ext2.mod먼저 읽어야 합니다.

더 많은 기능을 얻으려면 GRUB는 분명히 /grub/x86_64-efi에 있는 모듈을 로드할 수 있어야 합니다 /dev/sda1. 그러나 이를 위해서는 GRUB가 두 가지 중요한 변수인 root및 를 올바르게 설정해야 합니다 prefix.

귀하의 경우 set root=(hd0,gpt1)디스크가 하나만 있다고 가정하면 가 필요합니다. 디스크가 여러 개 있는 경우 올바른 hdN숫자를 예측하는 것이 까다로울 수 있으므로 최신 배포판에서는 search --fs-uuid --set=root <UUID-of-the-filesystem>direct 대신 구문을 사용하는 것을 선호하는 경우가 많습니다 set root=.

prefix로 설정 해야 합니다 . GRUB 변수의 현재 상태를 보려면 (hd0,gpt1)/grubGRUB 프롬프트에서 set매개변수 없이 명령을 사용하십시오.

GRUB은 한 번에 하나의 파일 시스템에만 집중할 수 있으므로 /dev/sda1로 마운트 /boot한 다음 GRUB를 root로 설정 하면 으로 (hd0,gpt1)나타납니다 . 따라서 인용된 모든 경로에서 이를 생략 해야 합니다 ./boot//bootsda1

ext4 파일 시스템에서 무언가를 로드해야 하는 경우 다음 /dev/sda4세 단계를 수행해야 합니다.

  1. insmod ext2while rootprefixstill 위와 같이 설정
  2. set root=(hd0,gpt4)GRUB 포커스를 LFS 루트 파일 시스템으로 전환
  3. 필요한 것을 로드하세요. 이는 /boot단지 마운트 지점일 뿐이라는 점을 기억하세요 sda4. Linux 커널은 나중에 이를 마운트 지점으로 사용 /dev/sda1하지만 GRUB에서는 아무 작업도 수행하지 않습니다.

따라서 수정해야 할 줄은 다음 grub.cfg과 같습니다.

...
#set root=(hd0)    # not just the disk, but the partition/filesystem GRUB will focus on
set root=(hd0,gpt1)
...
#if loadfont /boot/grub/fonts/unicode.pf2; then   # GRUB will see /boot as /
if loadfont /grub/fonts/unicode.pf2; then
...
#       linux /boot/vmlinuz-5.16.9-lfs-11.1 root=/dev/sda4 ro  # same here, also fix the kernel filename
        linux /vmlinuz-5.16.9-lfs-11.1-systemd root=/dev/sda4 ro
...

/boot/grub/i386-pc디렉토리는 UEFI 시스템에서는 쓸모가 없습니다. 자유롭게 삭제하십시오.

/boot/grub/fonts/unicode.pf2파일은 현재 sda1.

관련 정보