判断当前系统使用 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)
。
root@ykla:~ # mount
zroot/ROOT/default on / (zfs, local, noatime, nfsv4acls)
devfs on /dev (devfs)
/dev/gpt/efiboot0 on /boot/efi (msdosfs, local)
zroot/home on /home (zfs, local, noatime, nfsv4acls)
zroot/var/log on /var/log (zfs, local, noatime, noexec, nosuid, nfsv4acls)
zroot/tmp on /tmp (zfs, local, noatime, nosuid, nfsv4acls)
zroot/usr/ports on /usr/ports (zfs, local, noatime, nosuid, nfsv4acls)
zroot on /zroot (zfs, local, noatime, nfsv4acls)
zroot/var/mail on /var/mail (zfs, local, nfsv4acls)
zroot/var/audit on /var/audit (zfs, local, noatime, noexec, nosuid, nfsv4acls)
zroot/var/crash on /var/crash (zfs, local, noatime, noexec, nosuid, nfsv4acls)
zroot/usr/src on /usr/src (zfs, local, noatime, nfsv4acls)
zroot/home/ykla on /home/ykla (zfs, local, noatime, nfsv4acls)
zroot/var/tmp on /var/tmp (zfs, local, noatime, nosuid, nfsv4acls)
root@ykla:/ # fstyp /dev/nvd0p1
msdosfs
root@ykla:~ # gpart show
=> 40 125829040 nda0 GPT (60G)
40 532480 1 efi (260M)
532520 2008 - free - (1.0M)
534528 4194304 2 freebsd-swap (2.0G)
4728832 121098240 3 freebsd-zfs (58G)
125827072 2008 - free - (1.0M)
root@ykla:~ # umount /boot/efi # 必须先卸载才能删除!
root@ykla:/ # gpart delete -i 1 nda0
nda0p1 deleted
root@ykla:~ # gpart show
=> 40 125829040 nda0 GPT (60G)
40 534488 - free - (261M)
534528 4194304 2 freebsd-swap (2.0G)
4728832 121098240 3 freebsd-zfs (58G)
125827072 2008 - free - (1.0M)
root@ykla:/ # gpart add -b 40 -s 260M -t ms-basic-data -i 1 nda0
nda0p1 added
root@ykla:~ # gpart show
=> 40 125829040 nda0 GPT (60G)
40 532480 1 ms-basic-data (260M)
532520 2008 - free - (1.0M)
534528 4194304 2 freebsd-swap (2.0G)
4728832 121098240 3 freebsd-zfs (58G)
125827072 2008 - free - (1.0M)
格式化为 fat32(/dev/nvd0p1
必须保持卸载状态)。但是若指定扇区似乎会影响 4K 对齐?
root@ykla:~ # newfs_msdos -F 32 /dev/nvd0p1
newfs_msdos: 16630 clusters too few clusters for FAT32, need 65525
挂载:
root@ykla:~ # mount -t msdosfs /dev/nda0p1 /boot/efi
root@ykla:~ # cd /boot/efi/
root@ykla:/boot/efi # mkdir efi # 创建 fat32 分区中的 efi 文件夹
故障排除与未竟事宜
疑问:如何解决 newfs_msdos: 16630 clusters too few clusters for FAT32, need 65525
?
UEFI 与 efibootmgr
root@ykla:/home/ykla # efibootmgr
Boot to FW : false
BootCurrent: 0001
Timeout : 1 seconds
BootOrder : 0002, 0003, 0000, 0001
Boot0002* Windows Boot Manager
Boot0003* UEFI OS
Boot0000* refind
+Boot0001* freebsd # + 为默认启动项
技巧
详细说明可以用 efibootmgr -v
。
设置 refind 优先启动(这不意味着他是默认启动项,这是改变在 BIOS 中的排序罢了):
警告
不可 efibootmgr -o 0000
如此指定。这样做,会删除其他启动项。
root@ykla:/home/ykla # efibootmgr -o 0000,0001,0002,0003
Boot to FW : false
BootCurrent: 0001
Timeout : 1 seconds
BootOrder : 0000, 0001, 0002, 0003
Boot0000* refind
+Boot0001* freebsd
Boot0002* Windows Boot Manager
Boot0003* UEFI OS
参考文献
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
:
# mount -t msdosfs /dev/ada0p2 /mnt/efi
为 FreeBSD 引导项创建 EFI 路径下的目录:
# mkdir /mnt/efi/EFI/freebsd
然后复制启动文件到该路径
# cp /boot/boot1.efi /mnt/efi/EFI/freebsd/bootx64.efi
最后生成启动项:
# efibootmgr -c -l /mnt/efi/EFI/freebsd/bootx64.efi -L "FreeBSD 14.2"
重启进入 Windows,使用 easyuefi 激活 FreeBSD 14.2
这个启动项即可。
Grub
目前测试 grub
无法直接引导 FreeBSD 的内核从而启动系统。只能采取 chainlain+1
的方式间接引导。
menuentry "FreeBSD-13.0 Release" {
set root='(hd0,gpt1)' # 请自己检查
chainloader /boot/boot1.efi
}
参考资料
目前配置的报错报错(grub2-efi
FBSD 14.2):
# grub-install --target=x86_64-efi --efi-directory=/boot/efi/efi/ --bootloader-id=grub --boot-directory=/boot/ --modules="part_gpt part_msdos bsd zfs"
grub-install: error: relocation 0x4 is not implemented yet.
root@ykla:~ # grub-install --target=x86_64-efi --efi-directory=/boot/efi/efi/ --bootloader-id=grub --boot-directory=/boot/ --modules="part_gpt part_msdos bsd zfs"
Installing for x86_64-efi platform.
grub-install: error: unknown filesystem.