5.9 使用 ZFS 启动环境更新 FreeBSD 并实现多版本共存

创建启动环境 15.0-RELEASE

  • 使用工具 bectl 创建启动环境 15.0-RELEASE

注意

我们只是将其命名为 15.0,实际上系统仍然是 14.3。

# bectl create 15.0-RELEASE
  • 使用 bectl 检查:

$ bectl list # 显示所有启动环境
BE           Active Mountpoint Space Created
15.0-RELEASE -      -          176K  2025-12-05 22:27
default      NR     /          10.6G 2025-01-14 20:36

Active 字段解释(来自 bectl(8) 手册页):

  • “N”:表示该启动环境当前是否处于活动状态(现在是否正位于此环境中)

  • “R”:在重启时是否处于活动状态(下次是否选中,用于固定选项)

  • “T”:是否会在下次启动时生效(且仅下次,用于一次性选项)

  • “NRT”:这些标识(N / R / T)可以组合出现(实际上不会出现,该选项存在矛盾)

  • 使用 zfs 命令检查:

# zfs list
NAME                      USED  AVAIL  REFER  MOUNTPOINT

……其他省略……

zroot/ROOT/15.0-RELEASE     8K  83.8G  10.6G  /

……其他省略……

注意 zroot/ROOT/15.0-RELEASE 8K 83.8G 10.6G / 这行是刚刚创建的。

将启动环境中的系统版本更新到 15.0-RELEASE

挂载启动环境 15.0-RELEASE

  • 创建一个临时目录用于更新启动环境 15.0-RELEASE 中的 FreeBSD 系统

  • 将启动环境(实际上是个快照)15.0-RELEASE 挂载到上面的路径里

  • 检查:

注意到,已经成功地将启动环境 15.0-RELEASE 挂载到了我们设置的路径里。

验证当前 FreeBSD 版本

目前 15.0-RELEASE 实际上是 14.3-RELEASE。虽然是明知的,但还是让我们来用命令 freebsd-version 验证这一点:

freebsd-version 参数解释(摘自手册页 freebsd-version(1)):

  • -k:打印已安装内核的版本和补丁级别。与 uname(1) 不同的是,如果新的内核已经安装但系统尚未重启,freebsd-version 会打印新内核的版本和补丁级别。

  • -r:打印正在运行中的内核的版本和补丁级别。与 uname(1) 不同的是,freebsd-version 不受环境变量影响。

  • -u:打印已安装用户态的版本和补丁级别。这些信息在构建过程中会被写入程序 freebsd-version 中。

使用 pkgbase 将启动环境中的 14.3-RELEASE(系统版本)转换到 pkgbase

pkgbase 的设计初衷是为了让 stable、current 和 release(BETA、RC 等)都能使用一种二进制工具进行更新。当下,stable、current 只能通过完全编译源代码的方式来更新。

注意

仅 FreeBSD 14.0-RELEASE 及更高版本才能直接被转换为 pkgbase。旧版仍需要通过 freebsd-update 进行更新(运行时 pkgbasify 会提示 Unsupported FreeBSD version,即 FreeBSD 版本不受支持)。

警告

存在风险,可能会丢失所有数据!建议在操作之前做好备份。

  • 锁定 pkg 防止 pkg 故障

  • 下载 pkgbase 转换脚本

  • 使用 pkgbasify 进行转换

警告

在接受 Do you accept this risk and wish to continue? (y/n) 这个风险提示后就没有其他二次确认了!

  • 检查启动环境 15.0-RELEASE 中的系统版本

注意到 pkgbasify 把我们更新到了最新的点版本,并且已经把我们更新到了 pkgbase。

使用 pkgbase 将启动环境中的系统版本更新到 15.0-RELEASE

  • 创建 pkgbase 软件源目录

  • 编辑 /mnt/upgrade/usr/local/etc/pkg/repos/FreeBSD-base.conf,添加 pkgbase 源

警告

请检查 FreeBSD-base.conf 的内容,尤其是 不应该 在里面手动硬编码写入指定任何具体的版本(如 base_release_3)。

技巧

需要换源的用户可以将 url 这行改成 url = "https://mirrors.ustc.edu.cn/freebsd-pkg/${ABI}/base_release_${VERSION_MINOR}";。而对于那些优先考虑安全性的读者应该维持默认设置。

  • 刷新软件源

  • 使用 pkgbase 将 14.3-RELEASE 更新到 15.0-RELEASE(即指定 ABI 到 15)

技巧

如果检查不到任何更新,请检查你当前是否已成功转换为 pkgbase,并确认软件源配置是否正确

  • 检查启动环境 15.0-RELEASE 中的系统版本

这里 r 显示 14.3-RELEASE 并无不妥,说明目前运行的是 14.3。结合其他参数,可知重启后才会变成 15.0-RELEASE。

  • 解锁 pkg

  • 将所有第三方软件包的 ABI 更新到 FreeBSD 15.0

需要反复确认多次才能完成更新。

启动到启动环境 15.0-RELEASE

  • 在下次启动时进入启动环境 15.0-RELEASE

  • 验证设置是否成功:

注意,这是一次性的(T),我们只是为了看看它是否正常。我们还需要回到目前的主系统 14.3-RELEASE 来更新 ZFS。

  • 重启以进入启动环境 15.0-RELEASE

  • 验证版本:

可以看到,我们已经成功地把启动环境 15.0-RELEASE 中的 FreeBSD 版本升级到了 15.0-RELEASE,现在名副其实了。

并且 R 意味着我们再次重启就会回到启动环境 default(14.3-RELEASE)。

附录:永久性使用 15.0-RELEASE

如果读者不需要多版本共存,并且验证过目前的环境满足需要,也可以将启动环境 15.0-RELEASE 设置为永久的:

然后读者也可以销毁不再需要的启动环境:

将参数 启动环境 替换为命令 bectl listBE 列中的对应启动环境即可将其销毁之。

将基本系统中的 ZFS 替换为 Ports 版本

通常,在 FreeBSD 大版本间的 ZFS(池)版本/特性都会变动,如从 13 到 14 的 zpool 就有所变动。

可通过 Ports 中的 OpenZFS 实现 13、14、15 等多版本/多系统共存。

警告

如不按照下方进行设置就强行升级 ZFS 池/特性,将无法访问旧版系统。

那些有意愿实现多版本共存的读者可以直接重启,进入启动环境 default(14.3-RELEASE)。

验证当前系统版本

我们需要确定我们的确在启动环境 default(14.3-RELEASE)中。

可以看到,我们已经回来了。

查看内置的 OpenZFS 版本

目前 FreeBSD 基本系统内置的是 OpenZFS 2.2.7(即来自 https://github.com/openzfs/zfs/commit/e269af1b3

安装 filesystems/openzfs

  • 使用 pkg 安装

  • 使用 ports 安装:

编辑 /boot/loader.conf

为了让系统不要加载基本系统内的 zfs 版本。需要在 zfs_load=YES 前加上注释 #,取消其开机自动加载。

形如:

再新增下列数行:

即可。然后重启。

检查 ZFS 版本

在重启后,检查 ZFS 版本:

接下来再更新其他存储池或特性即可。

警告

考虑到基本系统中的 OpenZFS 版本不一定是最新的,所以你最好对所有版本都使用 Ports 中的版本以期达到统一。换言之,建议读者将 15.0-RELEASE 中的 ZFS 也参照此方法进行替换。

附录:给 pkgbasify 脚本换源

修改示例(使用 USTC)

找到 Lua 脚本中的 create_base_repo_conf 函数:

将这个函数修改如下,其中在 return 部分指定了镜像站:

警告

请删除 return "pkg+https://" 这行里面的 pkg+,否则会报错。

再找到下面的函数 create_base_repo_conf

修改如下(删除了 srv 相关数行):

注意

对于那些优先考虑安全性的读者应该保持默认设置。

南京大学开源镜像站 NJU

网易开源镜像站 163

附录:配置软件源

FreeBSD 官方源的 pkgbase 信息如下:

分支

更新频率

URL 地址

main(16.0-CURRENT)

每天两次:08:00、20:00

main(16.0-CURRENT)

每周一次:星期日 20:00

stable/14

每天两次:08:00、20:00

stable/14

每周一次:星期日 20:00

releng/14.0(RELEASE)

每天两次:08:00、20:00

releng/14.1(RELEASE)

每天两次:08:00、20:00

releng/14.2(RELEASE)

每天两次:08:00、20:00

releng/14.3(RELEASE)

每天两次:08:00、20:00

以上表格的时间已转换为北京时间,即东八区时间,均为 FreeBSD 官方镜像站的时间。

若官方源下载速度慢,可以考虑换成国内镜像。只需要替换 https://pkg.freebsd.org 这部分。

参考文献

最后更新于

这有帮助吗?