25.4 ZFS 启动环境
概述
什么是启动环境(ZFS Boot Environments )?
其实很好理解,启动环境和 Android 系统的 A/B 分区有异曲同工之妙。启动环境本质上是原子更新,双系统,快照与回滚的功能集合。
如果单纯地从 FreeBSD 系统备份还原角度的理解。我们将正在使用的系统设置理解为正常世界。有一种物理学观点认为世界每时每刻都在以不同的事件选择进行分支,将那些我们没有做出选择的事件而产生的分支世界其视为可能世界。那么正常世界始终是最新,最完整的;而可能世界只能是用来测试的,有缺陷的(实际上只是我们只这么使用而已)。哪怕将其还原到正常世界,也只是回到了正常世界的时间线上,而不是使用可能世界代替了正常世界(但是实际上启动管理是有这种可能性的)。可能世界完全可以是人们以为的正常世界,只是我们拣选了 FreeBSD 某个特定版本或部署将其视为正常世界。
思考题
你相信我们所在的世界相比其他世界具有唯一性而不是其他正常世界的 副本 吗?如果是,你可以简单证明一下吗:我们的这个世界是所有可能世界中 最完美 的那个。如果不是,那么必然存在一个正常世界,你认为它可能 正常 在哪里?
使用 ZFS 快照等技术能在一个文件系统(ZFS)中实现多款完全独立的操作系统,比如 FreeBSD 14.3-RELEASE、FreeBSD 15.0-RELEASE、Gentoo Linux 等,并且他们互相独立。
甚至启动环境也可以实现所谓的“不可变系统”,并且比其更符合不可变这个概念,也更彻底。通过该功能也可以简单地直接将操作系统完全替换掉。
思考题
我们可以看到,某些看似时髦的概念往往是旧瓶装 旧酒,而 FreeBSD 缺乏的恰恰正是这种包装。你怎么看?
可以看到启动环境的作用不仅仅局限于系统更新前的备份快照。
测试启动环境
在默认安装中 zroot/ROOT/default 是默认的启动环境。
创建一个 zfs 快照:
# zfs snap zroot/ROOT/default@new用刚建的快照复制一个镜像:
# zfs clone zroot/ROOT/default@new zroot/ROOT/new复制的镜像可以作为一个启动环境,可以用工具 bectl 查看可用的启动环境
# bectl list
BE Active Mountpoint Space Created
0915 - - 4.00M 2023-09-19 19:44
13.2-RELEASE-p2_2023-09-13_141111 - - 29.0M 2023-09-13 14:11
new - - 432K 2023-09-20 15:17
default NR / 40.8G 2023-04-10 10:06其中 Active 这一列中 N 表示当前使用环境,R 表示下次启动时使用的环境。bectl 工具可以改变下次使用的启动环境(在启动 FreeBSD 时,启动菜单里选 8,也可以改变启动环境)
# bectl activate new
Successfully activated boot environment new再次用 bectl list 查看,观察 Active 列的变化
# bectl list
BE Active Mountpoint Space Created
0915 - - 4.00M 2023-09-19 19:44
13.2-RELEASE-p2_2023-09-13_141111 - - 29.0M 2023-09-13 14:11
new R / 2.84M 2023-09-20 15:17
default N - 40.8G 2023-04-10 10:06重启 FreeBSD(启动菜单里选择 new 启动环境,或如上用 bectl activate new 切换到 new 启动环境),用 df 观察,挂载的根目录的文件系统已经是 zroot/ROOT/new
# df
Filesystem 1K-blocks Used Avail Capacity Mounted on
zroot/ROOT/new 110611616 42612156 67999460 39% /
devfs 1 1 0 100% /dev
/dev/gpt/efiboot0 266176 1872 264304 1% /boot/efi
fdescfs 1 1 0 100% /dev/fd切换回 zroot/ROOT/default 启动环境,在启动菜单里选择 default 启动环境,或如上用 bectl activate default 切换到 default 启动环境
用法扩展:可以把一个启动环境升级为 FreeBSD 14,实现 13、14 多版本共存。
警告
“用法扩展”实现的代价是 zfs 不能升级:一升级就挂了,因为旧版 ZFS 程序无法向后兼容。实践的意义不大,可以仅做备份还原使用。
参考文献
最后更新于
这有帮助吗?