使用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
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启动(我没有执行):
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 模拟集群)
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:
gpart show -p nda0
# 挂载tmpfs
mount -t tmpfs tmpfs /mnt
# 创建ZFS存储池
zpool create -o altroot=/mnt zroot nda0p3
现在需要依次创建完整的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
:
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):
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
接下来可以完成 FreeBSD初始化