13.6 Grub、UEFI 和 efibootmgr
判断当前系统使用 UEFI 与否
如果是非 UEFI:
# efibootmgr # 默认自带、无需安装。
efibootmgr: efi variables not supported on this system. root? kldload efirt?如果当前系统是 UEFI,efibootmgr 则输出类似于:
# efibootmgr # 默认自带、无需安装。
Boot to FW : false
BootCurrent: 0004
BootOrder : 0004, 0000, 0001, 0002, 0003
+Boot0004* FreeBSD
Boot0000* EFI VMware Virtual SCSI Hard Drive (0.0)
Boot0001* EFI VMware Virtual IDE CDROM Drive (IDE 1:0)
Boot0002* EFI Network
Boot0003* EFI Internal Shell (Unsupported option)EFI 分区删除与重建(存在疑问)
FreeBSD 默认的 EFI 是 fat16 的,本次重建后为 fat32?
注意
若在安装系统的时候,未选定
gpt (UEFI),则gpart show会发现存在分区freebsd-boot (512K)。
查看当前挂载情况:
检查文件系统
调整大小看看:
格式化为 fat32(/dev/nvd0p1 必须保持卸载状态)。但是若指定扇区似乎会影响 4K 对齐?
挂载:
故障排除与未竟事宜
疑问:如何解决 newfs_msdos: 16630 clusters too few clusters for FAT32, need 65525 ?
UEFI 与 efibootmgr
查看当前启动项:
技巧
详细说明可以用
efibootmgr -v。
设置 refind 优先启动(这不意味着他是默认启动项,这是改变在 BIOS 中的排序罢了):
警告
不可
efibootmgr -o 0000如此指定。这样做,会删除其他启动项。
参考文献
efibootmgr 无法添加 UEFI 启动项,这个简明扼要
efibootmgr(8),FreeBSD man 手册,英文
深入掌握 efibootmgr 操作要领安全删除启动项方法解析,详细说明,但并非都适用于 BSD
UEFI 操作实例
现在假设有两块硬盘,两块硬盘上都分别有一个 EFI 分区,一个分区里是 FreeBSD,另一个是 Windows。
现在只想保留一个 EFI 分区,即想把 2 个 EFI 配置文件放到一块硬盘的 EFI 分区里统一管理。
设装有 Windows 的硬盘为 ada0,FreeBSD 的硬盘为 nvd0。本文是删掉了 nvd0,即 BSD 系统安装生成的 EFI 分区(不知道为什么 FreeBSD 的 EFI 文件系统是 Fat16)。将 FreeBSD 的引导文件放到了 ada0 硬盘下。
首先关闭 Windows 的快速启动启动:命令为 powercfg /h off。(如果你进的去 BIOS 设置界面就不用关)
然后关机重启进入 FreeBSD,创建挂载点:
检测 ada0p1(硬盘的第一个分区)是不是我们要挂载的 EFI 分区,输入命令:
我的输出是 NTFS,可见不是我们想要的 EFI 分区;
再看看第二块分区:
输出 msdosfs,是我们的 Windows 磁盘上的 EFI 分区。
接下来挂载 ada0 磁盘上的 EFI 分区到 FreeBSD 的 /mnt/efi:
为 FreeBSD 引导项创建 EFI 路径下的目录:
然后复制启动文件到该路径
最后生成启动项:
重启进入 Windows,使用 easyuefi 激活 FreeBSD 14.2 这个启动项即可。
若再次启动 FreeBSD 没有问题,方可使用 DiskGenius 或其他分区工具删除 nvd0 磁盘的 EFI 分区及文件。
Grub
目前测试 grub 无法直接引导 FreeBSD 的内核从而启动系统。只能采取 chainlain+1 的方式间接引导。
参考资料
目前配置的报错报错(grub2-efi FBSD 14.2):
加参数 -vvv,可以看到一长串报错。太长了,输出放在 https://gist.github.com/ykla/9b6de6c8d4eee524840acb9981bf850a
最后更新于
这有帮助吗?