26.7.使用软件包更新 FreeBSD
从 14.0-RELEASE 开始,FreeBSD 项目已经使用 pkg(8) 发布了一套基本系统的软件包。pkg 的便利性已不再局限于 FreeBSD ports。现在,FreeBSD 本身也可以使用 pkg(8)。基本系统的软件包及其使用方式传统上被称为 pkgbase。
官方 packages 的发布始于 2023 年 10 月。在 FreeBSD 14 中使用它们目前仍属于实验性。
从 15.0-RELEASE 开始,freebsd-base(7) 将以技术预览(tech preview)的形式支持:
安装
小版本升级
大版本升级
freebsd-base 最终将取代:
诸如
base.txz、kernel.txz这样的 tar 压缩包分发文件,它们在过去用于通过 bsdinstall(8) 安装操作系统freebsd-update(8) 用于系统更新
当前的计划是让 freebsd-update 与 pkg 协同工作。
警告
分发集的替换仍需要一些时间,直到 freebsd-base 完全稳定!
基本系统的软件包补充了从源代码构建和安装的方式(文档链接),对于希望构建自定义内核或用户空间的用户,这条路径依然可用。用户也可以从本地源代码构建自定义的基本系统软件包,或完全依赖官方提供的软件包。
26.7.1 将主机转换为使用 freebsd-base
FreeBSD 14.0-RELEASE 或之后的版本可以转换为使用基本系统的软件包。更早的版本必须先使用 freebsd-update 升级,然后才能进行转换。
在转换过程中,推荐使用 FreeBSD 基金会赞助的 pkgbasify 工具。请按照其中给出的说明进行操作。
freebsd-update(8) 将会被增强,使其能与 pkg 和 pkgbasify 协同工作。
警告
请注意,此迁移过程需要额外最多 5 GiB 的可用空间,用于下载、解包并重新放置所有冲突的文件。pkgbasify 工具不会对磁盘空间进行检查,因此在运行迁移前,确保有足够空间是用户自己的责任。
pkgbasify(8)(或 D51594 及其对应的 Ports 请求的最终产物)执行六项主要任务:
使用 bectl(8) 创建一个备份引导环境(仅适用于 ZFS)
创建新的 package 仓库配置文件
升级现有系统组件,如 base、kernel、lib32、debug
合并现有与新的配置文件
更新 passwd 和 capabilities 数据库
立即重启 sshd
26.7.2 使用 freebsd-base 升级主机
警告
这部分仍在开发中,因此请务必小心,尤其是在将现有系统转换为使用 freebsd-base 时。
如果还没有自定义 pkg 仓库配置文件的文件夹,请创建一下:
# mkdir -p /usr/local/etc/pkg/repos/为了使用 freebsd-base 仓库,创建一个名为 FreeBSD-base.conf 的 pkg 仓库配置文件:
FreeBSD-base {
url = "pkg+https://pkg.freebsd.org/${ABI}/base_release_${VERSION_MINOR}";
mirror_type = "srv";
signature_type = "fingerprints";
fingerprints = "/usr/share/keys/pkg";
enabled = yes;
}关于具体配置选项的更多信息,请参见 pkg.conf(5)。
可以选择不同的分支(通过相应修改 url):
表 2. freebsd-base 分支
main
每天两次 —— 12:00 与 00:00 UTC
pkg+https://pkg.freebsd.org/${ABI}/base_latest
main
每周一次 —— 周日 12:00 UTC
pkg+https://pkg.freebsd.org/${ABI}/base_weekly
stable/14
每天两次 —— 12:00 与 00:00 UTC
pkg+https://pkg.freebsd.org/${ABI}/base_latest
stable/14
每周一次 —— 周日 12:00 UTC
pkg+https://pkg.freebsd.org/${ABI}/base_weekly
releng/14.3
每天两次 —— 12:00 与 00:00 UTC
pkg+https://pkg.freebsd.org/${ABI}/base_release_3
releng/15.0
每天两次 —— 12:00 与 00:00 UTC
pkg+https://pkg.freebsd.org/${ABI}/base_release_0
stable/15
每天两次 —— 12:00 与 00:00 UTC
pkg+https://pkg.freebsd.org/${ABI}/base_latest
stable/15
每周一次 —— 周日 12:00 UTC
pkg+https://pkg.freebsd.org/${ABI}/base_weekly
要升级系统,根据所需的发行版本修改配置文件,然后运行:
# pkg update -r FreeBSD-base
# pkg upgrade -r FreeBSD-base检查这些软件包是否正确,并接受更改。
使用以下命令重启系统:
# shutdown -r now26.7.2.1 主版本升级
如果使用 ZFS,启动环境能让升级在不打断运行中软件的情况下完成。如果系统的根分区并不使用 ZFS:升级前请做好备份。
26.7.2.1.1 准备工作
将 /usr/local/etc/pkg/repos/FreeBSD-base.conf 修改为目标主版本,例如对 15.0-RELEASE 使用 base_release_0,使其如下所示:
警告
这个文件后续可能会在 RELEASE 中以不同路径出现。
FreeBSD-base {
url = "pkg+https://pkg.freebsd.org/${ABI}/base_release_0";
mirror_type = "srv";
signature_type = "fingerprints";
fingerprints = "/usr/share/keys/pkg";
enabled = yes;
}警告
由于 FreeBSD 14 的 pkgbase 仍处于实验阶段,从 14 到 15 的更新,即 pkgbase 主版本更新同样是实验性的。撰写本手册时,在一些极端情况下主版本升级会移除 pkg,从而导致 pkg 段错误。这是 15.0-RELEASE 的 已知问题。解决方法:在升级前锁定 pkg:
# pkg -c /mnt/upgrade lock pkg从 FreeBSD 14 实验性升级到 15(或 16.0-CURRENT)之后,应安装元包
FreeBSD-set-minimal。
保存非基本系统软件包的列表,以便之后可能需要:
pkg prime-origins | sort -u > /var/tmp/pkg-prime-origins.txt26.7.2.1.2 主版本升级(根分区使用 ZFS)
使用 bectl(8) 创建启动环境,并按目标版本命名:
# bectl create 15.0-RELEASE创建目录,再将新的启动环境挂载到该目录,以便通过 chroot(8) 与 pkg 配合使用:
# mkdir /mnt/upgrade
# bectl mount 15.0-RELEASE /mnt/upgrade接下来的步骤会将启动环境升级到指定版本。
警告
此步骤可能会移除非基本系统的软件包,其中也可能包括正在运行的桌面环境。
设置环境变量 ABI 来执行主版本升级(将 amd64 替换为对应架构,将 15 替换为目标版本)。将 pkg-static 的 chroot 目录指定为启动环境的挂载点:
# env ABI=FreeBSD:15:amd64 pkg-static -c /mnt/upgrade upgrade -r FreeBSD-base将会出现提示,询问是否忽略版本不匹配,如下所示:
Newer FreeBSD version for package FreeBSD-zoneinfo:
To ignore this error set IGNORE_OSVERSION=yes
- package: 1500058
- running userland: 1500000
Ignore the mismatch and continue? [y/N]:检查并确认。
要检查升级是否成功,chroot 到该启动环境的挂载点并运行 freebsd-version -kru:
# chroot /mnt/upgrade
# freebsd-version -ku
# exit临时激活该启动环境,然后重新启动系统:
# bectl activate -t 15.0-RELEASE
# shutdown -r now如果系统运行不正常:重新启动系统即可停止使用临时激活的启动环境,下一次开机将回到升级前的环境。
如果系统在重启后稳定运行,请不要忘记永久激活此启动环境,以避免意外启动到旧系统:
# bectl activate 15.0-RELEASE26.7.2.1.3. 主版本升级(根分区未使用 ZFS)
设置环境变量 ABI 来升级主版本(将 amd64 替换成架构,将 15 替换成目标版本)。
# env ABI=FreeBSD:15:amd64 pkg-static upgrade -r FreeBSD-base会出现询问是否忽略版本不匹配的提示,看起来如下:
Newer FreeBSD version for package FreeBSD-zoneinfo:
To ignore this error set IGNORE_OSVERSION=yes
- package: 1500058
- running userland: 1500000
Ignore the mismatch and continue? [y/N]:检查并确认。
要检查升级是否成功,运行 freebsd-version -ku。
然后重启。
26.7.2.1.4. 升级后的任务
如果在更新过程中将 pkg 锁定作为权宜之计,那么像这样移除锁:
# pkg unlock pkg在升级到新的 major 版本之后,可能需要更新并升级已安装的软件包,使之与 ABI 版本匹配。
# pkg upgrade如遇到问题,可以考虑向 FreeBSD 支持 寻求帮助。
26.7.3. 手动构建 pkgbase 并发布到本地网络
在构建自定义 pkgbase 软件包时,先克隆 FreeBSD 源码树:
# cd /usr/src
# git clone https://github.com/freebsd/freebsd-src.git /usr/src检出要构建软件包所对应发行版的分支:
# git checkout releng/14.3开始构建过程,根据可用资源,这可能需要一些时间。根据 CPU 核心数量设置并行进程数。
此示例面向 8 核 CPU:
# make -j8 buildworld && make -j8 buildkernel && make -j8 packages如果构建频繁,可以考虑使用 devel/ccache 利用缓存加快后续构建。
构建完成后,软件包会被保存到 /usr/obj/usr/src/repo/FreeBSD:14:amd64/14.3p2 或类似目录,具体取决于构建的版本。
要将这些软件包发布到网络,设置 nginx 服务,并在 http server 配置中使用如下位置:
location /FreeBSD:14:amd64 {
alias /usr/obj/usr/src/repo/FreeBSD:14:amd64/;
autoindex on;
}然后重新加载 nginx 服务。
在未使用 https 的情况下,在客户端使用一个简短的配置文件来指定刚构建的 pkgbase 版本,编辑 /usr/local/etc/pkg/repos/upgrade.conf:
upgrade: {
url = http://ip.of.the.server/FreeBSD:14:amd64/14.3p2
enabled = yes
}并按照上文所述使用它(但使用 -r upgrade 而不是 FreeBSD-base)。
最后更新于