UEFI多系统中的FreeBSD要使用ZFS并与同一块磁盘上的其他OS共存,安装时必须选择进入Shell手动分区。选择Auto(ZFS)就必须覆盖整个磁盘,无法与其他OS共存。FreeBSD在这一点上不如Linux灵活。
本文通过实例讲述如何在(VirtualBox虚拟机中的)FreeBSD 13.2安装时进入Shell手动分区实现UEFI多系统中的FreeBSD使用ZFS并与同一块磁盘上的其他OS共存。
硬件环境
Lenovo ThinkPad T14 Gen2 20W1S3H811: Intel i5-1145G7 + DDR4 16GB + NVMe 512GB
软件环境
Win11 x64 Build 22621.2134 英文专业版 + VirtualBox v7.0.8 r156879
VirtualBox环境
VM Type = BSD
Version = FreeBSD (64bit)
Base Memory = 4GB
Processor = 4 Cores
VirtualDisk:
Size = 128GB
Partition1 = EFI 300MB
Partition2 = NTFS 32GB, Win11 Installed
Partition3 = Ext4 32GB, Xubuntu 22.04 Installed
Free Sapce = 64GB
安装FreeBSD 13.2
前面步骤略,重点在手动分区。

用方向键选到Shell,回车进入Shell
(可选步骤)FreeBSD安装程序支持网络连接,如果连接着网络,可以配置SSH服务,方便后续输入大量命令。dhclient em0 # 启用DHCP客户端,尝试从DHCP服务器获取IP配置mkdir /tmp/etc /tmp/root # 允许FreeBSD安装进程临时root账户SSH远程登录
mount -t unionfs /tmp/etc /etc
mount -t unionfs /tmp/root /root
echo "PermitRootLogin yes" >> /etc/ssh/sshd_configpasswd # FreeBSD安装进程临时root账户需要密码才能远程登录,为其设置密码service sshd onestart # 临时一次性启动SSH服务
SSH服务启动后,用SSH客户端连接到FreeBSD安装进程的Shell
查看磁盘信息gpart show -p
=> 63 2072929 cd0 MBR (4.0G)
63 2072929 - free - (4.0G)
=> 63 2072929 iso9660/13_2_RELEASE_AMD64_DVD MBR (4.0G)
63 2072929 - free - (4.0G)
=> 34 268435389 ada0 GPT (128G)
34 2014 - free - (1.0M)
2048 614400 ada0p1 efi (300M)
616448 67108864 ada0p2 ms-basic-data (32G)
67725312 67106816 ada0p3 linux-data (32G)
134832128 133603295 - free - (64G)
=> 34 268435389 diskid/DISK-VB0b986931-09156175 GPT (128G)
34 2014 - free - (1.0M)
2048 614400 diskid/DISK-VB0b986931-09156175p1 efi (300M)
616448 67108864 diskid/DISK-VB0b986931-09156175p2 ms-basic-data (32G)
67725312 67106816 diskid/DISK-VB0b986931-09156175p3 linux-data (32G)
134832128 133603295 - free - (64G)
可以看到有个4GB的DVD安装光盘设备名cd0;还有个128GB的硬盘设备名ada0,已经分配了300MB的efi分区设备名ada0p1,32GB的ms-basic-data分区设备名ada0p2(Win11安装在此分区),32GB的linux-data分区设备名ada0p3(Xubuntu 22.40安装在此分区),还有64GB的空闲磁盘空间(可以划出一部分或全部,用于安装FreeBSD)。
手动分区kldload zfs // 交换分区大小通常设置为内存2倍
sysctl vfs.zfs.min_auto_ashift=12
vfs.zfs.min_auto_ashift: 9 -> 12
gpart add -a 1m -s 8G -t freebsd-swap -l swap0 ada0ada0p4 added // 划分28GB作为FreeBSD根分区
gpart add -a 1m -s 28G -t freebsd-zfs -l disk0 ada0
或不指定-s参数,gpart add -a 1m -t freebsd-zfs -l disk0 ada0 // 剩余所有磁盘空间都划分给FreeBSD根分区ada0p5 added
手动创建必要的zpool和各个挂载点mount -t tmpfs tmpfs /mnt // ada0p5就是前面创建的freebsd-zfs分区
zpool create -o altroot=/mnt zroot ada0p5zfs set compress=on zroot // (可选项)zroot启用压缩zfs create -o mountpoint=none zroot/ROOT
zfs create -o mountpoint=/ -o canmount=noauto zroot/ROOT/default
mount -t zfs zroot/ROOT/default /mnt
zfs create -o mountpoint=/tmp -o exec=on -o setuid=off zroot/tmp
zfs create -o canmount=off -o mountpoint=/usr zroot/usr
zfs create zroot/usr/home
zfs create -o exec=off -o setuid=off zroot/usr/src
zfs create zroot/usr/obj
zfs create -o mountpoint=/usr/ports -o setuid=off zroot/usr/ports
zfs create -o exec=off -o setuid=off zroot/usr/ports/distfiles
zfs create -o exec=off -o setuid=off zroot/usr/ports/packages
zfs create -o canmount=off -o mountpoint=/var zroot/var
zfs create -o exec=off -o setuid=off zroot/var/audit
zfs create -o exec=off -o setuid=off zroot/var/crash
zfs create -o exec=off -o setuid=off zroot/var/log
zfs create -o atime=on -o exec=off -o setuid=off zroot/var/mail
zfs create -o exec=on -o setuid=off zroot/var/tmp
ln -s /usr/home /mnt/home
chmod 1777 /mnt/var/tmp
chmod 1777 /mnt/tmp
zpool set bootfs=zroot/ROOT/default zroot
cat << EOF > /tmp/bsdinstall_etc/fstab
? # Device Mountpoint FStype Options Dump Pass#
? /dev/gpt/swap0 none swap sw 0 0
? EOF
创建FreeBSD的EFI引导项mount -t msdosfs /dev/ada0p1 /media // 挂载EFI分区/dev/ada0p1cp /boot/loader.efi /media/EFI/Boot/bootx64-freebsd.efi
efibootmgr --create --activate --label "FreeBSD" --loader "/media/EFI/Boot/bootx64-freebsd.efi"
Boot to FW : false
BootCurrent: 0001
Timeout : 0 seconds
BootOrder : 0007, 0006, 0004, 0000, 0001, 0002, 0003, 0005
Boot0007* FreeBSD
Boot0006* ubuntu
Boot0004* Windows Boot Manager
Boot0000* UiApp
+Boot0001* UEFI VBOX CD-ROM VB1-1a2b3c4d
Boot0002* UEFI VBOX HARDDISK VB0b986931-09156175
Boot0003 EFI Internal Shell
Boot0005* UEFI PXEv4 (MAC:XXXXXXXXXXXX)
不带参数的efibootmgr命令会列出EFI启动项
命令efibootmgr -b 0007 -B可以删除编号为0007的EFI启动项umount /media // 卸载EFI分区exit // 退出Shell
后续安装
退出Shell后,FreeBSD安装程序会自动继续:复制文件->设置Root密码->选择时区->设置时间->选择随系统开启的服务->安全选项->添加用户->最后的手动配置选择Yes进入Shell

sysrc zfs_enable="YES" // 设置ZFS随系统启动
zfs_enable: NO -> YES
查看/boot/loader.conf是否有zfs_load="YES",没有就添加进去cat /boot/loader.conf // 退出Shell
echo zfs_load="YES" >> /boot/loader.conf
exit
退出Shell后重启,完成安装。
Leave a Reply