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/poudriereports-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,
}