第21章 其他文件系统
附录 D. OpenPGP 密钥
4.6.使用 Poudriere 构建软件包
Poudriere 是一个采用 BSD 许可证的工具,用于创建和测试 FreeBSD 软件包。它使用 FreeBSD jails 来建立隔离的编译环境。这些 jail 可以用来为与已安装系统不同的 FreeBSD 版本构建软件包,如果主机是 amd64 系统,还可以为 i386 构建软件包。构建了这些包后,它们的布局就与官方镜像相同了。这些软件包可以被 pkg(8) 和其他软件包管理工具使用。
Poudriere 可通过ports-mgmt/poudriere包或 port 安装。该安装包括一个配置文件样本 /usr/local/etc/poudriere.conf.sample。将此文件复制到 /usr/local/etc/poudriere.conf。编辑复制的文件以适应本地的配置。
虽然在运行 poudriere 的系统上 ZFS 不是必需的,但它是有益的。当使用 ZFS 时,必须在/usr/local/etc/poudriere.conf中指定 ZPOOL ,并且FREEBSD_HOST应该被设置为附近的镜像。定义CCACHE_DIR可以使用devel/ccache来缓存编译,减少经常编译的代码的构建时间。将 poudriere 数据集放在一个安装在/poudriere的隔离树中可能会很方便。其他配置值的默认值是足够的。
检测到的处理器内核数量用于定义多少个构建将并行运行。提供足够的虚拟内存,可以用 RAM 或交换空间。如果虚拟内存用完了,编译 Jail 就会停止并被拆掉,引发奇怪的错误信息。

4.6.1.初始化 Jail 和 ports 树

配置完成后,初始化 poudriere,使其安装一个带有所需 FreeBSD 树和 ports 树的 jail。用-j指定 Jail 的名称,用-v指定 FreeBSD 版本。在运行 FreeBSD/amd64 的系统上,可以用-a设置架构为 i386 或 amd64。默认是uname显示的架构。
1
# poudriere jail -c -j 11amd64 -v 11.4-RELEASE
2
[00:00:00] Creating 11amd64 fs at /poudriere/jails/11amd64... done
3
[00:00:00] Using pre-distributed MANIFEST for FreeBSD 11.4-RELEASE amd64
4
[00:00:00] Fetching base for FreeBSD 11.4-RELEASE amd64
5
/poudriere/jails/11amd64/fromftp/base.txz 125 MB 4110 kBps 31s
6
[00:00:33] Extracting base... done
7
[00:00:54] Fetching src for FreeBSD 11.4-RELEASE amd64
8
/poudriere/jails/11amd64/fromftp/src.txz 154 MB 4178 kBps 38s
9
[00:01:33] Extracting src... done
10
[00:02:31] Fetching lib32 for FreeBSD 11.4-RELEASE amd64
11
/poudriere/jails/11amd64/fromftp/lib32.txz 24 MB 3969 kBps 06s
12
[00:02:38] Extracting lib32... done
13
[00:02:42] Cleaning up... done
14
[00:02:42] Recording filesystem state for clean... done
15
[00:02:42] Upgrading using ftp
16
/etc/resolv.conf -> /poudriere/jails/11amd64/etc/resolv.conf
17
Looking up update.FreeBSD.org mirrors... 3 mirrors found.
18
Fetching public key from update4.freebsd.org... done.
19
Fetching metadata signature for 11.4-RELEASE from update4.freebsd.org... done.
20
Fetching metadata index... done.
21
Fetching 2 metadata files... done.
22
Inspecting system... done.
23
Preparing to download files... done.
24
Fetching 124 patches.....10....20....30....40....50....60....70....80....90....100....110....120.. done.
25
Applying patches... done.
26
Fetching 6 files... done.
27
The following files will be added as part of updating to
28
11.4-RELEASE-p1:
29
/usr/src/contrib/unbound/.github
30
/usr/src/contrib/unbound/.github/FUNDING.yml
31
/usr/src/contrib/unbound/contrib/drop2rpz
32
/usr/src/contrib/unbound/contrib/unbound_portable.service.in
33
/usr/src/contrib/unbound/services/rpz.c
34
/usr/src/contrib/unbound/services/rpz.h
35
/usr/src/lib/libc/tests/gen/spawnp_enoexec.sh
36
The following files will be updated as part of updating to
37
11.4-RELEASE-p1:
38
[…]
39
Installing updates...Scanning //usr/share/certs/blacklisted for certificates...
40
Scanning //usr/share/certs/trusted for certificates...
41
done.
42
11.4-RELEASE-p1
43
[00:04:06] Recording filesystem state for clean... done
44
[00:04:07] Jail 11amd64 11.4-RELEASE-p1 amd64 is ready to be used
Copied!
1
# poudriere ports -c -p local -m git+https
2
[00:00:00] Creating local fs at /poudriere/ports/local... done
3
[00:00:00] Checking out the ports tree... done
Copied!
在一台电脑上,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
要构建的软件包被输入11amd64-local-workstation-pkglist中:
1
editors/emacs
2
devel/git
3
ports-mgmt/pkg
4
...
Copied!
配置了指定 ports 的选项和依赖关系:
1
# poudriere options -j 11amd64 -p local -z workstation -f 11amd64-local-workstation-pkglist
Copied!
最后,软件包被构建,并创建一个软件包库:
1
# poudriere bulk -j 11amd64 -p local -z workstation -f 11amd64-local-workstation-pkglist
Copied!
在运行过程中,按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,其中包含以下内容:
1
FreeBSD: {
2
enabled: no
3
}
Copied!
通常情况下,通过 HTTP 向客户机提供软件包库是最简单的。设置一个网络服务器来提供软件包目录,例如。/usr/local/poudriere/data/packages/11amd64,其中11amd64是构建的名称。
如果软件包仓库的URL是:http://pkg.example.com/11amd64 ,那么/usr/local/etc/pkg/repos/custom.conf中的仓库配置文件会是这样的:
1
custom: {
2
url: "http://pkg.example.com/11amd64",
3
enabled: yes,
4
}
Copied!