判断当前系统使用 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 # + 为默认启动项
详细说明:
root@ykla:/home/ykla # efibootmgr -v
Boot to FW : false
BootCurrent: 0001
Timeout : 1 seconds
BootOrder : 0002, 0003, 0000, 0001
Boot0002* Windows Boot Manager HD(1,GPT,dd850df0-4bc5-11eb-9e72-1002b5860b22,0x28,0x8a7d8)/File(\EFI\Microsoft\Boot\bootmgfw.efi)
nda0p1:/EFI/Microsoft/Boot/bootmgfw.efi (null)
Boot0003* UEFI OS HD(1,GPT,ea7e17b0-f265-11ef-a633-1002b5860ef9,0x28,0x82000)/File(\EFI\BOOT\BOOTX64.EFI)
gpt/efiboot0:/EFI/BOOT/BOOTX64.EFI /boot/efi//EFI/BOOT/BOOTX64.EFI
Boot0000* refind HD(1,GPT,dd850df0-4bc5-11eb-9e72-1002b5860b22,0x28,0x8a7d8)/File(\EFI\refind\refind_x64.efi)
nda0p1:/EFI/refind/refind_x64.efi (null)
+Boot0001* freebsd HD(1,GPT,ea7e17b0-f265-11ef-a633-1002b5860ef9,0x28,0x82000)/File(\efi\freebsd\loader.efi)
gpt/efiboot0:/efi/freebsd/loader.efi /boot/efi//efi/freebsd/loader.efi
Unreferenced Variables:
Boot0005* UEFI OS HD(1,GPT,ea7e17b0-f265-11ef-a633-1002b5860ef9,0x28,0x82000)/File(\EFI\BOOT\BOOTX64.EFI)
gpt/efiboot0:/EFI/BOOT/BOOTX64.EFI /boot/efi//EFI/BOOT/BOOTX64.EFI
Boot0004* UEFI: KingstonDataTraveler 3.00000, Partition 1 PciRoot(0x0)/Pci(0x14,0x0)/USB(0x2,0x0)/HD(1,MBR,0x90909090,0x1,0x10418)
VenHw(2d6447ef-3bc9-41a0-ac19-4d51d01b4ce6,4500300044003500350045004100350033003500390043003100370035003000390038003900420030003700460036000000)
设置 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 分区,即想把 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
这个启动项即可。
若再次启动 FreeBSD 没有问题,方可使用 DiskGenius 或其他分区工具删除 nvd0 磁盘的 EFI 分区及文件。
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.
加参数 -vvv
,可以看到一长串报错。太长了,输出放在 https://gist.github.com/ykla/9b6de6c8d4eee524840acb9981bf850a