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: サイズは 16 GB です。 Linuxスワップ。 【交換】
  • /dev/sda3: サイズは 64 GB です。 Linux x86_64ルート。拡張4.ホストシステム。
  • /dev/sda4: サイズは 32 GB です。 Linux 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が2つの重要な変数であることをroot正しく設定する必要がありますprefix

あなたの場合、set root=(hd0,gpt1)ディスクが1つしかないと仮定してください。ディスクが複数ある場合、正しいhdN数を予測するのは難しいかもしれませんので、最新のディストリビューションではsearch --fs-uuid --set=root <UUID-of-the-filesystem>directの代わりに構文を使用することを好むことがよくありますset root=

prefixに設定する必要があります。 GRUB変数の現在の状態を表示するには、(hd0,gpt1)/grubGRUBプロンプトでsetパラメータなしでコマンドを使用します。

GRUBは一度に1つのファイルシステムにのみ集中できるため、として/dev/sda1マウントし/bootてからGRUBをrootに設定すると(hd0,gpt1)表示されます。したがって、引用されたすべてのパスからこれを省略する必要があります。/boot//bootsda1

ext4ファイルシステムから何かをロードする必要がある場合は、次の3つの/dev/sda4手順を実行する必要があります。

  1. insmod ext2whilerootprefixstill上記のように設定
  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

関連情報