# Linux下查看
sudo fdisk -l
或
lsblk -f
# 示例输出可能显示:
# /dev/sda1: Linux
# /dev/sda2: FreeBSD UFS
# /dev/sda3: FreeBSD ZFS (如果有)
2. 进入FreeBSD确认(可选)
# 如果已挂载FreeBSD分区
sudo mount /dev/sdaX /mnt
cat /mnt/etc/fstab # 查看FreeBSD的挂载点
sudo nano /etc/grub.d/40_custom
添加以下内容(根据实际情况修改):
情况A:FreeBSD安装在第1个硬盘的第3个分区(ada0s3)
menuentry "FreeBSD 13.0" {
insmod ufs2
insmod bsd
set root=(hd0,msdos3) # msdos表示MBR分区表,gpt表示GPT分区表
kfreebsd /boot/loader
}
情况B:GPT分区表
menuentry "FreeBSD" {
insmod part_gpt
insmod ufs2
insmod bsd
set root='(hd0,gpt3)' # gpt3表示GPT分区表的第3个分区
kfreebsd /boot/loader
}
情况C:ZFS文件系统
menuentry "FreeBSD ZFS" {
insmod zfs
insmod bsd
set root='(hd0,gpt2)'
kfreebsd /boot/kernel/kernel
kfreebsd_loadenv /boot/device.hints
set kFreeBSD.vfs.root.mountfrom="zfs:zroot/ROOT/default"
set kFreeBSD.vfs.root.mountfrom.options=rw
}
方法2:使用os-prober自动检测
# 1. 编辑/etc/default/grub
sudo nano /etc/default/grub
# 确保包含:
GRUB_DISABLE_OS_PROBER=false
# 2. 运行os-prober
sudo os-prober
# 3. 更新grub配置
sudo update-grub
menuentry "FreeBSD 14.0-RELEASE" {
insmod ufs2
insmod bsd
set root=(hd0,msdos2)
# 加载内核
kfreebsd /boot/kernel/kernel
# 加载内核模块
kfreebsd /boot/kernel/opensolaris.ko
kfreebsd /boot/kernel/zfs.ko
# 设置根文件系统
set kFreeBSD.vfs.root.mountfrom="ufs:/dev/ada0s2a"
set kFreeBSD.vfs.root.mountfrom.options=rw
# 启动参数
set kFreeBSD.bootfile="/boot/kernel/kernel"
set kFreeBSD.hw.psm.synaptics_support="1"
}
示例2:ZFS文件系统
menuentry "FreeBSD ZFS Root" {
insmod zfs
insmod bsd
set root=(hd0,gpt3)
kfreebsd /boot/kernel/kernel
kfreebsd_loadenv /boot/device.hints
kfreebsd_module_elf /boot/kernel/opensolaris.ko
kfreebsd_module_elf /boot/kernel/zfs.ko
set kFreeBSD.vfs.root.mountfrom="zfs:zroot/ROOT/default"
set kFreeBSD.vfs.root.mountfrom.options=rw
set kFreeBSD.bootfile="/boot/kernel/kernel"
}
# Debian/Ubuntu
sudo update-grub
# RHEL/CentOS/Fedora
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
# Arch Linux
sudo grub-mkconfig -o /boot/grub/grub.cfg
# 在grub命令行测试
grub> ls # 查看所有设备
grub> ls (hd0,gpt2)/ # 查看分区内容
grub> ls (hd0,gpt2)/boot/ # 检查boot目录
2. 内核加载失败
# 尝试直接指定内核路径
kfreebsd /boot/kernel/kernel
kfreebsd_module_elf /boot/kernel/geom_eli.ko # 加密分区需要
3. 设置正确的root设备
# 在FreeBSD中查看root设备
cat /etc/fstab
# 或
zpool status
4. 调试模式
menuentry "FreeBSD Debug" {
set debug=all
insmod ufs2
insmod bsd
set root=(hd0,msdos2)
kfreebsd /boot/loader -v
}
submenu "FreeBSD Systems" {
menuentry "FreeBSD 13.0" {
set root=(hd0,msdos2)
kfreebsd /boot/loader
}
menuentry "FreeBSD 14.0" {
set root=(hd0,msdos3)
kfreebsd /boot/loader
}
menuentry "FreeBSD Safe Mode" {
set root=(hd0,msdos2)
kfreebsd /boot/loader
set kFreeBSD.bootflags="-s" # 单用户模式
}
}
2. 使用链式加载(Chainloading)
menuentry "FreeBSD via Chainload" {
set root=(hd0,msdos2)
chainloader +1
}
# 检查生成的grub.cfg
sudo cat /boot/grub/grub.cfg | grep -A 10 "FreeBSD"
# 重启测试
sudo reboot
通过以上步骤,应该能成功配置Grub2引导FreeBSD。如果遇到问题,可以检查分区标识、文件系统类型和内核路径是否正确。