4.6.使用 Poudriere 构建软件包¶
Poudriere 是一个采用 BSD 许可证的工具,用于创建和测试 FreeBSD 软件包。它使用 FreeBSD jail 来建立隔离的编译环境。这些 jail 可以用来为与已安装系统不同的 FreeBSD 版本构建软件包,如果主机是 amd64 系统,还可以为 i386 构建软件包。构建了这些包后,它们的目录就与官方镜像站相同了。这些软件包可以被 pkg(8) 和其他软件包管理工具使用。
Poudriere 可通过软件包或 port ports-mgmt/poudriere 安装。该安装包括一个配置文件样本 /usr/local/etc/poudriere.conf.sample。将此文件复制到 /usr/local/etc/poudriere.conf。编辑复制的文件以满足本地配置需求。
尽管在系统上运行 poudriere 不依赖于 ZFS ,但使用 ZFS 是有好处的。当使用 ZFS 时,必须在 /usr/local/etc/poudriere.conf 中指定 ZPOOL
,并将 FREEBSD_HOST
设置为地理位置上相近的镜像站。定义 CCACHE_DIR
可以启用 devel/ccache,以缓存缓存编译后的资源、减少频繁构建代码的编译时间。有一种方便快捷的做法,那就是将一个孤立树挂载在 /poudriere,并将 poudriere 数据集放在该孤立树中。其它参数使用默认值即可。
检测到的处理器内核数量用于定义将并行运行多少个编译项目。可以用内存或交换空间以提供足够的虚拟内存。如果虚拟内存用完了,jail 的编译就会停止并被清除,引发奇怪的错误信息。
4.6.1.初始化 Jail 和 Ports¶
配置完成后,初始化 poudriere,使其安装一个带有所需 FreeBSD 基本系统和 ports 的 jail。用 -j
指定 Jail 的名称,用 -v
指定 FreeBSD 版本。在运行 FreeBSD/amd64 的系统上,可以用 -a
设置架构为 i386 或 amd64。默认是 uname
显示的架构。
# poudriere jail -c -j 13amd64 -v 13.1-RELEASE
[00:00:00] Creating 13amd64 fs at /poudriere/jails/13amd64... done
[00:00:00] Using pre-distributed MANIFEST for FreeBSD 13.1-RELEASE amd64
[00:00:00] Fetching base for FreeBSD 13.1-RELEASE amd64
/poudriere/jails/13amd64/fromftp/base.txz 125 MB 4110 kBps 31s
[00:00:33] Extracting base... done
[00:00:54] Fetching src for FreeBSD 13.1-RELEASE amd64
/poudriere/jails/13amd64/fromftp/src.txz 154 MB 4178 kBps 38s
[00:01:33] Extracting src... done
[00:02:31] Fetching lib32 for FreeBSD 13.1-RELEASE amd64
/poudriere/jails/13amd64/fromftp/lib32.txz 24 MB 3969 kBps 06s
[00:02:38] Extracting lib32... done
[00:02:42] Cleaning up... done
[00:02:42] Recording filesystem state for clean... done
[00:02:42] Upgrading using ftp
/etc/resolv.conf -> /poudriere/jails/13amd64/etc/resolv.conf
Looking up update.FreeBSD.org mirrors... 3 mirrors found.
Fetching public key from update4.freebsd.org... done.
Fetching metadata signature for 13.1-RELEASE from update4.freebsd.org... done.
Fetching metadata index... done.
Fetching 2 metadata files... done.
Inspecting system... done.
Preparing to download files... done.
Fetching 124 patches.....10....20....30....40....50....60....70....80....90....100....110....120.. done.
Applying patches... done.
Fetching 6 files... done.
The following files will be added as part of updating to
13.1-RELEASE-p1:
/usr/src/contrib/unbound/.github
/usr/src/contrib/unbound/.github/FUNDING.yml
/usr/src/contrib/unbound/contrib/drop2rpz
/usr/src/contrib/unbound/contrib/unbound_portable.service.in
/usr/src/contrib/unbound/services/rpz.c
/usr/src/contrib/unbound/services/rpz.h
/usr/src/lib/libc/tests/gen/spawnp_enoexec.sh
The following files will be updated as part of updating to
13.1-RELEASE-p1:
[…]
Installing updates...Scanning //usr/share/certs/blacklisted for certificates...
Scanning //usr/share/certs/trusted for certificates...
done.
13.1-RELEASE-p1
[00:04:06] Recording filesystem state for clean... done
[00:04:07] Jail 13amd64 13.1-RELEASE-p1 amd64 is ready to be used
# poudriere ports -c -p local -m git+https
[00:00:00] Creating local fs at /poudriere/ports/local... done
[00:00:00] Checking out the ports tree... done
poudriere 可以在一台电脑上的多个 jail 中,从不同的 ports 上建立多个配置的 ports。这些组合的自定义配置被称为 集。在安装了 ports-mgmt/poudriere 或 ports-mgmt/poudriere-devel 之后,请参阅 poudriere(8) 的 CUSTOMIZATION 部分来了解详情。
这里的示例文件的基本配置是在 /usr/local/etc/poudriere.d 中放置一个特定于 jail、ports 和设置的 make.conf。在构建时系统的 make.conf 和这个新文件被合并起来,以创建构建 jail 所使用的 make.conf。
要构建的软件包被输入 13amd64-local-workstation-pkglist 中:
editors/emacs
devel/git
ports-mgmt/pkg
...
配置了指定 ports 的选项和依赖关系:
# poudriere options -j 13amd64 -p local -z workstation -f 13amd64-local-workstation-pkglist
最后,软件包被构建,并创建了一个软件包仓库:
# poudriere bulk -j 13amd64 -p local -z workstation -f 13amd64-local-workstation-pkglist
在运行过程中,按 Ctrl
+t
会显示当前的构建状态。Poudriere 还在 /poudriere/logs/bulk/jailname 中建立了一些文件,这些文件可以用网络服务器来显示构建信息。
完成后,现在可以从 poudriere 仓库中安装新的软件包。
关于使用 poudriere 的更多信息,见 poudriere(8) 和主站 https://github.com/freebsd/poudriere/wiki。
4.6.2.配置 pkg 客户端使用 Poudriere 仓库¶
虽然可以同时使用自定义版本库和官方版本库,但有时需要禁用官方版本库。这可以通过创建一个配置文件来实现,使用该文件覆盖并禁用官方配置文件。创建 /usr/local/etc/pkg/repos/FreeBSD.conf,其中包含以下内容:
FreeBSD: {
enabled: no
}
通常情况下,通过 HTTP 向客户机提供软件包库是最简单的。设置一个网络服务器来提供软件包目录,例如: /usr/local/poudriere/data/packages/13amd64,其中 13amd64 是编译的名称。
如果软件包仓库的 URL 是:http://pkg.example.com/13amd64,那么 /usr/local/etc/pkg/repos/custom.conf 中的仓库配置文件会是这样的:
custom: {
url: "http://pkg.example.com/13amd64",
enabled: yes,
}
如果不希望将包存储库暴露在互联网上,则可以使用 file://
协议直接指向存储库:
custom: {
url: "file:///usr/local/poudriere/data/packages/11amd64",
enabled: yes,
}