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 rootsearchroot

簡単に言えば、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
}

関連情報