显示我的所有磁盘和分区。
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 ###
点击启动,遇到“invalid a.out header”。
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 并列出与 boot 相关的所有文件。
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
不是文件名,而是特定可执行文件格式的名称。该错误消息的基本意思是“这看起来不像是该命令的正确文件类型。”
我对 FreeBSD 不太熟悉,但根据快速谷歌搜索,在我看来,它/boot/loader
是用于基于 BIOS 的启动,并作为 BTX 客户端运行,处理器位于虚拟86模式,即使用 16 位或 32 位代码。
另一方面,现代基于 UEFI 的 x86_64 系统甚至可以在完整 64 位模式下运行固件,因此我认为kfreebsd /boot/loader
在 UEFI 系统上这样做是错误的。
你可以尝试这样的事情:
### 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
}
这会尝试从第二个磁盘的 EFI 系统分区链接加载 FreeBSD 加载程序的 UEFI 版本loader.efi
,就像基于固件的引导条目一样。
您还可以使用efibootmgr -v
查看 FreeBSD 的 UEFI NVRAM 引导条目并找到 的路径名loader.efi
而不是/EFI/BOOT/BOOTX64.EFI
:它可能类似于/EFI/FreeBSD/loader.efi
。
上面的条目应该更容易工作,因为它本质上只是重复了如果您在固件启动菜单中选择“FreeBSD”启动选项,固件将执行的操作。
如果您希望通过 GRUB 灵活地编辑 kFreeBSD 引导选项,您可以尝试以下第二个条目,但这只是一个有根据的猜测,因为我不熟悉 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 ###
效果很好。
第二个条目不能工作。