使用GPT分区在ZFS上构建FreeBSD Root(安装)

我在 在苹果Intel版Mac上安装FreeBSD 采用了默认的自动ZFS安装,发现整个磁盘被自动分配给ZFS,导致抹除了原本安装的Linux。我在后续的实践中,重新部署,计划构建一个FreeBSD/Linux( LFS(Linux from scratch) )双启动系统,以便能够验证不同平台的虚拟化和 Kubernetes 模拟。

由于我希望能够自如切换FreeBSD/Linux系统,并且构建跨两种OS公用的数据分区( ZFS 文件系统),所以就需要改进安装过程,控制FreeBSD安装在ZFS上的分区大小。所以就有本文的手工安装ZFS作为FreeBSD Root的实践,这种方式下能够控制ZFS分区大小,并且空出磁盘为后续构建 ZFS RaidZ 做准备。

备注

我按照 Installing FreeBSD Root on ZFS using GPT 完成,只有少数地方按需修改。该文档非常完备,操作非常顺利。

在ZFS上手工安装FreeBSD

关键步骤是安装过程到了 Partition 分区步骤时,不能选择Auto ZFS,而是要选择 shell 选项,此时进入控制台,按照以下步骤操作:

  • 检查系统中有哪些磁盘:

检查系统中磁盘
camcontrol devlist

这里可以看到2块 铠侠KIOXIA EXCERIA G2 NVMe SSD存储 ,我将在 nda0 上安装FreeBSD:

检查系统中磁盘,安装目标磁盘是 nda0
<AHCI SGPIO Enclosure 2.00 0001>   at scbus8 target 0 lun 0 (ses0,pass0)
<KIOXIA-EXCERIA G2 SSD ECFA17.1>   at scbus9 target 0 lun 1 (pass1,nda0)
<KIOXIA-EXCERIA G2 SSD ECFA17.3>   at scbus10 target 0 lun 1 (pass2,nda1)
<SanDisk' Cruzer Fit 1.00>         at scbus11 target 0 lun 0 (da0,pass3)
  • 创建一个全新的分区表( 警告,会摧毁磁盘上所有数据 ):

重建分区表
# 如果这里出现报错提示nda0 busy,则可能是磁盘中原本有数据,需要使用 -f 参数
gpart destroy nda0

# 创建gpt分区表
gpart create -s gpt nda0

  • 创建包含启动代码的分区(bootcade partition):

我的实践是创建UEFI Boot

创建UEFI启动分区,注意,该分区是 FAT32 分区
gpart add -a 4k -s 260M -t efi nda0
# Create a FAT32 partition
 newfs_msdos -F 32 -c 1 /dev/nda0p1
mount -t msdosfs -o longnames /dev/nda0p1 /mnt
mkdir -p /mnt/EFI/BOOT
cp /boot/loader.efi /mnt/EFI/BOOT/BOOTX64.efi
umount /mnt

如果是传统BIOS启动(我没有执行):

创建BIOS启动分区
gpart add -a 4k -s 512K -t freebsd-boot nda0
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 nda0
  • 创建分区:

    • -a <number> : 控制对齐

    • -s <size> : 设置分区大小,如果没有指定分区大小,就会将磁盘剩余空间全部用掉(我设置指定256GB,因为后面空闲分区我将用于构建独立的ZFS,以便构建 Ceph 模拟集群)

创建swap和zfs分区
gpart add -a 1m -s 2G -t freebsd-swap -l swap0 nda0
gpart add -a 1m -s 256G -t freebsd-zfs -l disk0 nda0
  • 创建ZFS Pool:

创建ZFS Pool
gpart show -p nda0

# 挂载tmpfs
mount -t tmpfs tmpfs /mnt

# 创建ZFS存储池
zpool create -o altroot=/mnt zroot nda0p3
  • 现在需要依次创建完整的ZFS文件系统,以便安装程序能够正确分布目录:

ZFS层次文件系统构建(小心谨慎)
# 设置默认的lz4压缩,默认配置通常适合
zfs set compress=on                                            zroot

# 创建Boot环境的层次结构
zfs create -o mountpoint=none                                  zroot/ROOT
zfs create -o mountpoint=none                                  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

完成安装

  • 创建 /tmp/bsdinstall_etc/fstab :

创建fstab
cat << EOF > /tmp/bsdinstall_etc/fstab
# Device                       Mountpoint              FStype  Options         Dump    Pass#
/dev/gpt/swap0                 none                    swap    sw              0       0
EOF
  • 现在退出Shell,此时 bsdinstall 就会继续完成安装(如果上述ZFS分区没有错误的话)

  • 注意 ,在最后安装步骤,当安装程序提示时候要补充命令,一定要回答 yes ,并完成以下命令(也就是设置系统默认启动时加载ZFS):

设置系统启动时加载ZFS
sysrc zfs_enable="YES"
echo 'zfs_load="YES"' >> /boot/loader.conf

最后检查

  • 安装完成后使用 df -h 检查可以看到初始安装占用空间很小,只需要大约 574MB :

初始安装占用空间极小,只需 574MB
Filesystem                   Size    Used   Avail Capacity  Mounted on
zroot/ROOT/default           246G    574M    246G     0%    /
devfs                        1.0K      0B    1.0K     0%    /dev
zroot/tmp                    246G     27K    246G     0%    /tmp
zroot/usr/ports              246G     25K    246G     0%    /usr/ports
zroot/usr/obj                246G     24K    246G     0%    /usr/obj
zroot/var/mail               246G     26K    246G     0%    /var/mail
zroot/var/log                246G     64K    246G     0%    /var/log
zroot/usr/home               246G     32K    246G     0%    /usr/home
zroot                        246G     24K    246G     0%    /zroot
zroot/usr/src                246G     24K    246G     0%    /usr/src
zroot/var/crash              246G     24K    246G     0%    /var/crash
zroot/var/tmp                246G     24K    246G     0%    /var/tmp
zroot/var/audit              246G     24K    246G     0%    /var/audit
zroot/usr/ports/distfiles    246G     24K    246G     0%    /usr/ports/distfiles
zroot/usr/ports/packages     246G     24K    246G     0%    /usr/ports/packages

参考