grub.cfgにfreebsdを正しく追加するには?

grub.cfgにfreebsdを正しく追加するには?

私のすべてのディスクとパーティションを表示します。

sudo fdisk -l
Disk /dev/sda: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: ST1000VX000     
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: BF20422A-7E3A-4CA2-B249-61BB4A5D42B7

Device         Start        End    Sectors   Size Type
/dev/sda1       2048     923647     921600   450M Windows recovery environment
/dev/sda2     923648    1128447     204800   100M EFI System
/dev/sda3    1128448    1161215      32768    16M Microsoft reserved
/dev/sda4    1161216  314069245  312908030 149.2G Microsoft basic data
/dev/sda5  314071040  315117567    1046528   511M Windows recovery environment
/dev/sda6  315119616  346370047   31250432  14.9G Linux swap
/dev/sda7  346370048 1953523711 1607153664 766.4G Linux filesystem


Disk /dev/sdb: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Disk model: ST500DM002-1SB10
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 4635826C-E544-11EB-AD01-48F31700362D

Device         Start       End   Sectors   Size Type
/dev/sdb1         40    532519    532480   260M EFI System
/dev/sdb2     532520 968884255 968351736 461.8G FreeBSD UFS
/dev/sdb3  968884256 976773127   7888872   3.8G FreeBSD swap

FreeBSD は /dev/sdb2 にインストールされており、BIOS で選択した後に入ることができます。 ここに画像の説明を入力してください。

grubメニューに追加したい。

sudo vim  /boot/grub/grub.cfg
### BEGIN /etc/grub.d/40_custom ###
menuentry "FreeBSD" {
    insmod ufs2
    insmod bsd
    set root=(hd1,gpt2)
    kfreebsd /boot/loader
    kfreebsd /boot/kernel
    set kFreeBSD.vfs.root.mountfrom=ufs:/dev/ada1p2
    set kFreeBSD.vfs.root.mountfrom.options=rw
    set kFreeBSD.hw.psm.synaptics_support=1
}
### END /etc/grub.d/40_custom ### 

再起動してください。FreeBSDgrubメニューが追加されました。 ここに画像の説明を入力してください。

クリックして起動すると、「無効なa.outヘッダー」が表示されます。

ここに画像の説明を入力してください。
単に grub.cfg を次のように設定すると:

sudo vim  /boot/grub/grub.cfg
### BEGIN /etc/grub.d/40_custom ###
menuentry "FreeBSD" {
    insmod ufs2
    insmod bsd
    set root=(hd1,gpt2)
    kfreebsd /boot/loader
}
### END /etc/grub.d/40_custom ### 

出力がなく、ブートロードがそこにかかったようです。

debian に /dev/sdb2 をマウントし、起動に関連するすべてのファイルを一覧表示します。

debian@debian:~$ sudo mkdir  /mnt/freebsd
debian@debian:~$ sudo mount -r -t ufs -o ufstype=ufs2 /dev/sdb2  /mnt/freebsd
debian@debian:~$ ls  /mnt/freebsd
bin   COPYRIGHT  entropy  home  libexec  mnt  proc    root  sys  usr
boot  dev        etc      lib   media    net  rescue  sbin  tmp  var
debian@debian:~$ ls  /mnt/freebsd/boot
beastie.4th         efi.4th         loader.efi          modules
boot                entropy         loader_lua          pmbr
boot0               firmware        loader_lua.efi      pxeboot
boot0sio            fonts           loader.rc           screen.4th
boot1               frames.4th      loader_simp         shortcuts.4th
boot1.efi           gptboot         loader_simp.efi     support.4th
boot2               gptboot.efi     logo-beastie.4th    uboot
brand.4th           gptzfsboot      logo-beastiebw.4th  userboot_4th.so
brand-fbsd.4th      images          logo-fbsdbw.4th     userboot_lua.so
cdboot              isoboot         logo-orb.4th        userboot.so
check-password.4th  kernel          logo-orbbw.4th      version.4th
color.4th           loader          lua                 zfs
defaults            loader.4th      mbr                 zfsboot
delay.4th           loader_4th      menu.4th            zfsloader
device.hints        loader_4th.efi  menu-commands.4th
dtb                 loader.conf     menu.rc
efi                 loader.conf.d   menusets.4th

次のコマンドを使用して a.out ファイルを検索します。

tree  /mnt/freebsd/boot/ | grep  a.out

/dev/sdb2にはa.outというファイルはありません!
それでは、grub.cfgファイルを復元する方法は?
grub-mkconfigを使って書いてみてはいかがでしょうか?

debian@debian:~$ sudo grub-mkconfig -o /boot/grub/grub.cfg
Generating grub configuration file ...
Found background image: /usr/share/images/desktop-base/desktop-grub.png
Found linux image: /boot/vmlinuz-4.19.0-17-amd64
Found initrd image: /boot/initrd.img-4.19.0-17-amd64
Found linux image: /boot/vmlinuz-4.19.0-16-amd64
Found initrd image: /boot/initrd.img-4.19.0-16-amd64
Found Windows Boot Manager on /dev/sda2@/efi/Microsoft/Boot/bootmgfw.efi
Found FreeBSD 13.0-RELEASE on /dev/sdb2
Adding boot menu entry for EFI firmware configuration
done

windows認識され、 grub.cfg に記録されます。

debian@debian:~$ cat  /boot/grub/grub.cfg  | grep  -i  window
menuentry 'Windows Boot Manager (on /dev/sda2)' --class windows --class os $menuentry_id_option 'osprober-efi-4A44-FBE5' {

FreeBSDまた認識され、 grub.cfg には記録されません。

debian@debian:~$ cat  /boot/grub/grub.cfg  | grep  -i  freebsd
debian@debian:~$ cat  /boot/grub/grub.cfg  | grep  BSD

では、どうすれば解決できますか?

答え1

a.outファイル名ではなく、特定の実行可能ファイル形式の名前です。エラーメッセージは、デフォルトでは「このコマンドの正しいファイル形式ではないようです」を意味します。

/boot/loader私はFreeBSDについてはよくわかりませんが、高速Google検索によると、BIOSベースのブート用に構築されており、プロセッサを搭載したBTXクライアントとして実行されているようです。仮想86モードつまり、16ビットまたは32ビットコードを使用します。

一方、最新のUEFIベースのx86_64システムは、フル64ビットモードでもファームウェアを実行できるため、kfreebsd /boot/loaderUEFIシステムでこれを行うのは間違いだと思います。

次のように試すことができます。

### BEGIN /etc/grub.d/40_custom ###
menuentry "FreeBSD (chainloaded loader.efi)" {
    set root=(hd1,gpt1)
    chainloader /EFI/BOOT/BOOTX64.EFI
    # /EFI/BOOT/BOOTX64.EFI could be replaced with /EFI/FreeBSD/loader.efi
    # either way, the chainloaded file should be a copy of FreeBSD /boot/loader.efi
}

loader.efiこれは、ファームウェアベースの起動エントリと同様に、2番目のディスクのEFIシステムパーティションリンクからFreeBSDローダのUEFIバージョンをロードしようとします。

FreeBSDのUEFI NVRAMブートエントリを表示する代わりに、efibootmgr -vパス名を見つけることもできます。次のように見えることもあります。loader.efi/EFI/BOOT/BOOTX64.EFI/EFI/FreeBSD/loader.efi

上記の項目は、デフォルトでファームウェアブートメニューから「FreeBSD」ブートオプションを選択した場合にファームウェアが実行する操作を繰り返すので、作業が簡単です。

GRUBを介してkFreeBSD起動オプションを柔軟に編集するには、以下の2番目の項目を試してみることができますが、私はFreeBSDに慣れていないので、これは経験に基づいた推測です。

menuentry "FreeBSD (native from GRUB)" {
    insmod ufs2
    insmod bsd
    set root=(hd1,gpt2)
    # /boot/loader is not applicable on UEFI, maybe GRUB can do its job directly?
    kfreebsd /boot/kernel
    set kFreeBSD.vfs.root.mountfrom=ufs:/dev/ada1p2
    set kFreeBSD.vfs.root.mountfrom.options=rw
    set kFreeBSD.hw.psm.synaptics_support=1
}
### END /etc/grub.d/40_custom ### 

答え2

debianにfreebsdパーティションをインストールした後、/bootに情報を公開しました。これは示す:

sudo mount -r -t ufs -o ufstype=ufs2 /dev/sdb2  /mnt/freebsd
ls  /mnt/freebsd/boot | grep boot
boot
boot0
boot0sio
boot1
boot1.efi
boot2
cdboot
gptboot
gptboot.efi
gptzfsboot
isoboot
pxeboot
uboot
userboot_4th.so
userboot_lua.so
userboot.so
zfsboot

したがって、/boot/grub/grub.cfg に次の行を追加します。

### BEGIN /etc/grub.d/40_custom ###
menuentry "FreeBSD" {
       insmod ufs2
       chainloader (hd1,gpt2)/boot/boot1.efi
}
### END /etc/grub.d/40_custom ###

良い結果。
2番目の項目は機能しません。

関連情報