如何设置Poudriere构建系统来为您的FreeBSD服务器创建软件包

来自菜鸟教程
跳转至:导航、​搜索

介绍

对于希望灵活控制软件的用户来说,ports 系统是 FreeBSD 最重要的资产之一。 它允许管理员使用设计为强大且可预测的系统轻松创建和维护基于源的安装。

虽然此功能的优势很大,但针对基于端口的管理的一些最常见的抱怨是关于编译每个软件所需的时间和资源。 如果您管理大量服务器,每个服务器都编译自己的端口,这将成为一个更大的问题。 尽管 FreeBSD 软件包提供了一种加快安装速度的替代方案,但它牺牲了端口授予的控制权。

为了缓解这个问题,管理员可以使用一个名为 poudriere 的应用程序来构建和维护自定义包。 虽然在技术上是为各种架构构建软件包而创建的,但 poudriere 通常用作软件包构建环境,为 FreeBSD 服务器的整个基础架构创建和托管软件包。

通过poudriere,管理员可以根据需要使用ports系统定制软件并编译软件包,以便于安装和软件管理。 任何数量的 FreeBSD 服务器都可以使用安装了 poudriere 作为其包源的主机,从而允许它们快速轻松地下载和安装定制的、预编译的可执行文件。

在本指南中,我们将演示如何使用 poudriere 作为构建机器来设置服务器。 然后,我们可以将此服务器用作任何其他服务器的软件包的存储库。 虽然此设置可能对单个服务器有益,但当其他服务器开始使用相同的 poudriere 主机作为包源时,就会看到真正的效率提升。

由于港口建设是一个资源密集型过程,因此将其设置在比平时更强大的系统上可能是值得的。

安装必要的端口管理软件

首先,我们将安装我们需要的所有端口。

与往常一样,在开始任何与端口相关的任务之前,我们将更新端口树以确保文件系统上的引用是最新的:

sudo portsnap fetch update

端口树更新后,我们就可以开始安装软件了。 首先,我们需要自己安装poudriere。 这可以在端口树的 ports-mgmt 类别中找到。 要构建和安装,请转到该目录并使用 make 来编译和安装:

cd /usr/ports/ports-mgmt/poudriere
sudo make install clean

随意选择提供的任何选项。 对于标准构建,没有一个是必不可少的。

接下来,如果您还没有安装它,我们需要安装 portmaster 端口。 我们将使用它在我们的机器上轻松生成我们希望 poudriere 构建的软件列表。 这也属于 ports-mgmt 类别:

cd /usr/ports/ports-mgmt/portmaster
sudo make install clean

最后,我们还需要安装一个 Web 服务器。 这将有两个目的。 首先,这将是我们的机器能够下载我们将要编译的包的方法。 其次,poudriere 提供了一个 Web 界面,以便我们可以跟踪构建过程并监控日志。

对于本指南,我们将使用 nginx 作为我们的 Web 服务器。 这可以在端口树的 www 类别中找到:

cd /usr/ports/www/nginx
sudo make install clean

如果您有其他目的的特定需求,您可以接受默认值或自定义。

完成编译和安装软件后,如果您使用默认的 tcshcsh shell,请确保重新评估您的 PATH:

rehash

现在我们的软件已经安装好了,我们可以开始配置我们的每个组件了。

创建 SSL 证书和密钥

当我们使用 poudriere 构建包时,我们希望能够使用私钥对其进行签名。 这将确保我们所有的机器创建的包都是合法的,并且没有人会拦截到构建机器的连接来提供恶意包。

首先,我们将为我们的密钥和证书创建一个目录结构。 由于我们所有的可选软件配置都发生在 /usr/local/etc 目录中,并且由于其他软件使用 /usr/local/etc/ssl 位置,因此我们将在此处放置文件。

我们将确保我们有一个 ssl 目录,其中包含两个名为 keyscerts 的子目录。 我们可以通过键入以下命令在一个命令中执行此操作:

sudo mkdir -p /usr/local/etc/ssl/{keys,certs}

我们的私钥(必须保密)将放在 keys 目录中。 这将用于对我们将创建的包进行签名。 保持安全对于确保我们的包裹不被篡改至关重要。 我们可以锁定目录,这样没有 root 或 sudo 权限的用户将无法与目录或其内容进行交互:

sudo chmod 0600 /usr/local/etc/ssl/keys

certs 目录将包含我们使用密钥创建的公开可用的证书。 因此,我们可以保留该目录的默认权限。

接下来,我们将生成一个名为 poudriere.key 的 4096 位密钥,并将其放在我们的 keys 目录中,键入:

sudo openssl genrsa -out /usr/local/etc/ssl/keys/poudriere.key 4096

生成密钥后,我们可以通过键入以下内容从中创建公共证书:

sudo openssl rsa -in /usr/local/etc/ssl/keys/poudriere.key -pubout -out /usr/local/etc/ssl/certs/poudriere.cert

我们现在有了对包进行签名和验证签名所需的 SSL 组件。 稍后,我们将配置我们的客户端使用生成的证书进行包验证。

配置 Poudriere

现在我们有了 SSL 证书和密钥,我们可以开始配置 poudriere 本身。

主配置文件位于/usr/local/etc/poudriere.conf。 在文本编辑器中使用 sudo 权限打开此文件:

sudo vi /usr/local/etc/poudriere.conf

poudriere 配置文件有很好的注释并且有我们需要预定义的大部分设置。 我们将进行一些特定的更改,但保留大部分内容。

如果您的 FreeBSD 服务器在 DigitalOcean 上运行,则文件系统将是 UFS。 poudriere 中有一些我们不应该设置的 ZFS 特定的选项。 为了表明我们正在使用 UFS,我们必须将 NO_ZFS 标志设置为“yes”。 在文件中查找并取消注释此选项:

NO_ZFS=yes

另一方面,如果您的服务器使用 ZFS,您可以通过设置 ZPOOL 选项将 poudriere 配置为使用特定池。 在此池中,您可以指定 poudriere 将用于包、日志等的根目录。 使用 ZROOTFS 选项。 请注意,如果您将 NO_ZFS 选项设置为“是”,则不应设置 这两个选项

# NO_ZFS=yes
ZPOOL=tank
ZROOTFS=/poudriere

在构建软件时,poudriere 使用一种监狱来将构建系统与主操作系统分开。 接下来,我们必须填写一个有效的主机,构建机器可以在其中下载监狱所需的软件。 这是通过 FREEBSD_HOST 选项配置的。

此选项应该已经存在,尽管它当前未设置为有效的主机。 您可以将其更改为默认的 ftp://ftp.freebsd.org 位置或使用更近的镜像(如果您知道的话):

FREEBSD_HOST=ftp://ftp.freebsd.org

接下来,我们要确保 poudriere 根目录中的数据目录设置正确。 这是由 POUDRIERE_DATA 选项控制的,应该是默认的,但我们将取消注释该选项以确保:

POUDRIERE_DATA=${BASEFS}/data

我们应该取消注释的下一个选项是 CHECK_CHANGED_OPTIONSCHECK_CHANGED_DEPS 选项。 第一个选项告诉 poudriere 在其选项发生更改时重建包。 第二个选项告诉 poudriere 在上次编译后依赖关系发生变化时重建包。

这两个选项都以我们希望它们在配置文件中的形式存在。 我们只需要取消注释它们:

CHECK_CHANGED_OPTIONS=verbose
CHECK_CHANGED_DEPS=yes

接下来,我们将 poudriere 指向我们创建的 SSL 密钥,以便它可以在构建时对包进行签名。 用于指定这一点的选项称为 PKG_REPO_SIGNING_KEY。 取消注释此选项并更改路径以反映您之前创建的 SSL 密钥的位置:

PKG_REPO_SIGNING_KEY=/usr/local/etc/ssl/keys/poudriere.key

最后,我们可以将 URL_BASE 字符串设置为您的服务器可以访问的域名或 IP 地址。 poudriere 将使用它在其输出中构建可以单击的链接。 您应该包含协议并以斜杠结束值:

URL_BASE=http://server_domain_or_IP/

完成更改后,保存并关闭文件。

创建构建环境

接下来,我们需要实际构建我们的构建环境。 如前所述,poudriere 将使用监狱在隔离环境中构建端口。

我们必须创建我们的监狱并让 poudriere 在里面安装 FreeBSD。 可能有多个监狱,每个监狱都有不同版本的 FreeBSD。 被监禁的 FreeBSD 版本必须与服务器本身正在运行的版本相同或更早。 在本指南中,我们将重点关注反映主机系统架构和 FreeBSD 版本的单一监狱。

我们应该为我们正在创建的监狱选择一个描述性的名称。 这很重要,因为它将在客户端的存储库配置中使用,这在为不同版本的 FreeBSD 构建时非常重要。 man 页面还指示您避免在名称中使用圆点,因为与其他工具的一些交互。 例如,在本指南中,我们在 64 位架构上运行 FreeBSD 10.1,因此我们将其称为“freebsd_10-1x64”。

我们使用 -j 指定我们的监狱名称,并使用 -v 选项指示要安装的 FreeBSD 版本。 您可以在 this 页面的表格的“版本”列中找到支持的版本的格式。 如果您关注的是 -CURRENT-STABLE 而不是发布,您可以使用在 this 页面上找到的格式(例如 11-CURRENT)。

出于我们的目的,我们的监狱构建命令将如下所示:

sudo poudriere jail -c -j freebsd_10-1x64 -v 10.1-RELEASE

这需要一段时间才能完成,所以请耐心等待。 完成后,您可以通过键入以下命令查看已安装的监狱:

poudriere jail -l
JAILNAME        VERSION         ARCH  METHOD TIMESTAMP           PATH
freebsd_10-1x64 10.1-RELEASE-p3 amd64 ftp    2015-01-06 20:43:48 /usr/local/poudriere/jails/freebsd_10-1x64

创建监狱后,我们将必须安装端口树。 可以维护多个端口树以满足不同的开发需求。 我们将安装一个我们的监狱可以使用的端口树。

我们可以使用 -p 标志来命名我们的端口树。 我们将我们的树称为“HEAD”,因为它准确地总结了这棵树的使用(“头”或树的最新点)。 我们将定期更新它以匹配可用的最新版本的端口树:

sudo poudriere ports -c -p HEAD

同样,此过程将花费一些时间,因为必须获取和提取整个端口树。 完成后,我们可以通过键入以下命令查看我们的端口树:

poudriere ports -l

这一步完成后,我们现在有了编译端口和构建包的结构。 接下来,我们可以开始组装我们的端口列表,为每个软件构建和配置我们想要的选项。

创建端口构建列表并设置端口选项

当使用 poudriere 编译时,我们会在调用 build 命令时指明我们希望构建的端口。 可以单独指定端口,但这不是长期管理的好解决方案。 相反,我们将创建一个可以直接传递给命令的端口列表。

文件 create 应列出端口类别,后跟斜杠和端口名称,以反映其在端口树中的位置,如下所示:

port_category/first_port
port_category/second_port
port_category/third_port

. . .

任何需要的依赖项也将自动构建,因此不必担心跟踪要安装的端口的整个依赖项树。 您可以手动构建此文件,但如果您的基础系统已经有大部分要构建的软件,您可以使用 portmaster 为您创建此列表。

在执行此操作之前,通常最好从系统中删除任何不需要的依赖项,以保持端口列表尽可能干净。 您可以通过键入以下内容来执行此操作:

sudo pkg autoremove

之后,我们可以使用 portmaster 获得我们在构建系统上明确安装的软件列表。 portmaster 命令可以使用 --list-origins 选项以正确的格式输出显式安装的端口列表(不是依赖项)。

我们可以将此输出通过管道传输到 sort 以按字母顺序排列列表,以便更容易找到项目。 我们可以将结果输出到/usr/local/etc/poudriere.d目录下的一个文件中。 我们将此文件称为 port-list

portmaster --list-origins | sort -d | sudo tee /usr/local/etc/poudriere.d/port-list 

查看列表。 如果您不想包含任何端口,请删除它们的关联行。 这也是添加您可能需要的其他端口的机会。

如果您使用特定的 make.conf 选项来构建您的端口,您可以为 /usr/local/etc/poudriere.d 目录中的每个监狱创建一个 make.conf 文件。 例如,对于我们的监狱,我们可以使用以下名称创建一个 make.conf 文件:

sudo vi /usr/local/etc/poudriere.d/freebsd_10-1x64-make.conf

在内部,您可以放置在构建端口时想要使用的任何选项。 例如,如果您不想构建任何文档、示例、本地语言支持或 X11 支持,您可以设置:

OPTIONS_UNSET+= DOCS NLS X11 EXAMPLES

之后,我们可以配置每个端口,这将使用我们选择的选项创建文件。

如果您在主机系统上自定义了端口,则可以将配置复制到 poudriere 以使用这些设置。 为此,请在以您的 jail 命名的 /usr/local/etc/poudriere.d 目录中创建一个新目录,并在末尾附加 -options。 对于我们的指南,我们可以通过键入以下内容来完成此操作:

sudo mkdir /usr/local/etc/poudriere.d/freebsd_10-1x64-options

现在,您可以通过键入以下内容来复制已在主机系统上使用的选项:

sudo cp -r /var/db/ports/* /usr/local/etc/poudriere.d/freebsd_10-1x64-options

如果您完成了上述步骤,您将获得我们将要配置的选项的基线,但您的许多依赖项仍需要配置。

您可以使用 options 命令配置尚未配置的任何内容。 我们应该传入我们创建的端口树(使用 -p 选项)和我们设置这些选项的监狱(使用 -j 选项)。 我们还必须使用 -f 选项指定要配置的端口列表。

我们的命令将如下所示:

sudo poudriere options -j freebsd_10-1x64 -p HEAD -f /usr/local/etc/poudriere.d/port-list

您将看到列表中每个端口的对话框以及在 -options 目录中没有设置相应选项的任何依赖项。 make.conf 文件中的规格将在选择屏幕中预先选择。 选择您要使用的所有选项。

如果您希望将来重新配置端口的选项,您可以使用 -c 选项重新运行上面的命令。 这将向您显示所有可用的配置选项,无论您过去是否进行过选择:

sudo poudriere options -c -j freebsd_10-1x64 -p HEAD -f /usr/local/etc/poudriere.d/port-list

建设港口

现在,我们终于准备好开始建设港口了。

我们需要做的最后一件事是确保我们的监狱和端口树都是最新的。 这可能不会在您第一次构建端口时成为问题,因为我们刚刚创建了端口树和监狱,但最好养成每次运行构建时都这样做的习惯。

要更新您的监狱,请键入:

sudo poudriere jail -u -j freebsd_10-1x64

要更新您的端口树,请键入:

sudo poudriere ports -u -p HEAD

一旦完成,我们就可以开始批量构建过程。

注意:这可能是一个很长的运行过程。 如果您通过 SSH 连接到服务器,我们建议您安装 screen 并启动会话:

cd /usr/ports/sysutils/screen
sudo make install clean

rehash
screen

要开始构建,我们只需要使用 bulk 命令并指向我们一直在配置的所有单独的部分。 如果您一直在使用本指南中的值,该命令将如下所示:

sudo poudriere bulk -j freebsd_10-1x64 -p HEAD -f /usr/local/etc/poudriere.d/port-list

这将启动一些工作人员(取决于您的 poudriere.conf 文件或可用的 CPU 数量)并开始构建端口。

在构建过程中的任何时候,您都可以通过按住 CTRL 键并点击 t 来获取有关进度的信息:

CTRL-t

该过程的某些部分将产生比其他部分更多的输出。

如果您需要离开,您可以通过按 CTRLa 将控制移动到 screen 来分离屏幕会话,然后按 d 键分离会话:

CTRL-a d

当您希望返回会话时,您可以键入:

screen -x

设置 Nginx 以服务于前端和存储库

在构建您的软件包时,我们可以借此机会配置 Nginx。 打开另一个终端,如上所示分离 screen 会话,或通过键入 CTRL-a c 启动新的 screen 窗口(您可以通过键入 CTRL-a n 在窗口之间切换)和 CTRL-a p)。

Web 服务器将用于两个不同的目的:

  • 它将为其他主机可以用来下载您自定义编译的包的实际包存储库提供服务
  • 它将服务于 poudriere Web 前端,可用于监控构建过程

我们在本指南的开头安装了 Nginx,但尚未对其进行配置。

首先,通过将 nginx_enable="YES" 行添加到 /etc/rc.conf 文件来启用该服务。 这将在启动时启动服务器,并允许我们使用常规的 service 命令来管理进程:

sudo sh -c "echo 'nginx_enable="YES"' >> /etc/rc.conf"

现在,我们可以调整默认配置文件。 在文本编辑器中使用 sudo 权限打开它:

sudo vi /usr/local/etc/nginx/nginx.conf

在此文件中,我们将从 server {} 块中删除所有内容,并将其替换为我们自己的配置。 确保保留匹配的大括号(“{”和“}”)以确保您的文件有效。

server 上下文中,我们可以设置一些基本指令以允许我们的 Web 服务器响应端口 80 上的常规 HTTP 流量并响应我们服务器的域名或 IP 地址。 我们还将服务器的文档根目录设置为位于 /usr/local/share/poudriere/htmlpoudriere Web 目录。 更改以下 server_name 指令的值以匹配您服务器的域名或 IP 地址:

# http context

. . .

    server {
        listen 80 default;
        server_name server_domain_or_IP;
        root /usr/local/share/poudriere/html;
    }

}

接下来,我们将添加两个 location 块。

虽然我们上面定义的基本 root 指令将处理大部分 Web 界面,但我们需要告诉 Nginx 我们存储日志和实际数据的目录。 Poudriere 将为此使用 /data 端点。 我们的日志都写入了一个特定的目录,所以我们可以为这个位置打开 autoindex 指令,以便我们可以查看日志列表。

最后,我们的第一个 location 块将如下所示:

# http context

. . .

    server {
        listen 80 default;
        server_name server_domain_or_IP;
        root /usr/local/share/poudriere/html;

        location /data {
            alias /usr/local/poudriere/data/logs/bulk;
            autoindex on;
        }
    }
}

这应该使我们的 Web 界面正常运行(在对 mime.types 文件进行额外修改后,我们稍后会进行)。 接下来,我们需要添加第二个位置块,它将用于为我们正在构建的实际包提供服务。

包将再次存储在 /usr/local/poudriere 下的目录中,这次是在 data/packages 下。 我们可以在 /packages 位置提供它。 同样,我们可以打开 autoindex 来查看目录的内容,让我们也可以在 Web 浏览器中查看文件。

完成此最终修改后,server 块应如下所示:

#http context

. . .

    server {
        listen 80 default;
        server_name server_domain_or_IP;
        root /usr/local/share/poudriere/html;

        location /data {
            alias /usr/local/poudriere/data/logs/bulk;
            autoindex on;
        }

        location /packages {
            root /usr/local/poudriere/data;
            autoindex on;
        }
    }
}

完成后保存并关闭文件。

接下来,我们将对我们的 mime.types 文件做一个小的修改。 在当前设置下,如果您在 Web 浏览器中单击日志,它将下载文件,而不是将其显示为纯文本。 我们可以通过将 .log 结尾的文件标记为纯文本文件来改变这种行为。

在文本编辑器中使用 sudo 权限打开 Nginx mime.types 文件:

sudo vi /usr/local/etc/nginx/mime.types

找到指定 text/plain 内容类型的条目,并将 log 附加到当前文件类型列表的末尾,用空格分隔:

. . .

text/mathml                         mml;
text/plain                          txt log;
text/vnd.sun.j2me.app-descriptor    jad;

. . .

完成后保存并关闭文件。

现在,通过键入以下命令检查配置文件的语法:

sudo service nginx configtest

如果您有任何错误,请在继续之前修复它们。 如果您的配置测试报告没有语法错误,请键入以下命令启动 Nginx:

sudo service nginx start

如果您启用了防火墙,请记住配置您的规则以允许流量到端口 80 并重新启动服务。

现在,您可以在 Web 浏览器中转到服务器的域名或 IP 地址来查看 poudriere Web 界面:

http://server_domain_or_IP

您应该看到主 poudriere 页面:

如果您单击通过,您应该能够查看您的港口建设的过程或结果。 您还应该能够点击进入任何已完成构建的日志。

如果您想在浏览器中查看已编译的包,这些包应该可以通过从 /packages 开始的层次结构获得:

您可能必须等到整个构建完成才能查看包。 单击链接将显示您使用 poudriere 批量构建命令生成的已编译包。

配置包客户端

现在您已经构建了包并配置了一个存储库来为您的包提供服务,您可以将您的客户端配置为使用您的服务器作为其包的源。

配置构建服务器以使用它自己的包存储库

我们可以首先配置构建服务器以使用它已经构建的包。

首先,我们需要创建一个目录来保存我们的存储库配置文件:

sudo mkdir -p /usr/local/etc/pkg/repos

在这个目录中,我们可以创建我们的存储库配置文件。 它必须以 .conf 结尾,所以我们称它为 poudriere.conf 以反映其用途:

sudo vi /usr/local/etc/pkg/repos/poudriere.conf

我们将再次将存储库名称定义为 poudriere。 在定义中,我们将指向磁盘上存储包的位置。 这应该是一个将您的监狱名称和端口树名称与破折号组合在一起的目录。 检查您的文件系统以确定。 我们还将通过指向我们创建的证书来设置我们的包的签名验证。

最后,您的文件应如下所示:

poudriere: {
    url: "file:///usr/local/poudriere/data/packages/freebsd_10-1x64-HEAD",
    mirror_type: "srv",
    signature_type: "pubkey",
    pubkey: "/usr/local/etc/ssl/certs/poudriere.cert",
    enabled: yes
}

此时,您需要做出决定。 如果您想 prefer 已编译的软件包并依赖主要 FreeBSD 存储库提供的软件包,您可以在此处设置优先级,告诉它优先选择此存储库中的软件包。 这将导致我们的本地存储库优先于官方存储库。

请记住,以这种方式混合包可能会产生一些复杂的后果。 如果官方仓库的包版本高于你的本地仓库版本,你编译的包可能会被官方仓库中的通用包替换(直到你用 poudriere 重建并用 pkg 重新安装])。 此外,官方包可能会假设依赖包是以某种方式构建的,并且在与您的自定义包混合时可能无法运行。

如果您选择混合使用这两个包源,请准备好仔细审核每个安装,以确保您不会意外导致不良行为。

要混合包,请将 priority 设置添加到存储库定义中,指定本地存储库具有更高的优先级:

poudriere: {
    url: "file:///usr/local/poudriere/data/packages/freebsd_10-1x64-HEAD",
    mirror_type: "srv",
    signature_type: "pubkey",
    pubkey: "/usr/local/etc/ssl/certs/poudriere.cert",
    enabled: yes,
    priority: 100
}

完成后保存并关闭文件。

如果您选择 only 来安装您自己定制的软件包(更安全的路线),您可以省略优先级设置,但您需要禁用默认存储库。 您可以通过创建一个不同的 repo 文件来覆盖默认存储库文件并禁用它来做到这一点:

sudo vi /usr/local/etc/pkg/repos/freebsd.conf

在内部,使用名称 FreeBSD 以匹配默认存储库定义。 通过像这样定义它来禁用存储库:

FreeBSD: {
    enabled: no
}

完成后保存并关闭文件。

无论您选择何种配置,您现在都应该可以使用您的存储库了。 通过键入以下内容更新您的包列表:

sudo pkg update

现在,您的服务器可以使用 pkg 命令从本地存储库安装软件包。

配置远程客户端以使用构建机器的存储库

在构建机器上设置 poudriere 最令人信服的原因之一是将该主机用作许多其他机器的存储库。 我们需要做的就是从我们的构建机器下载公共 SSL 证书并设置一个类似的存储库定义。

为了从我们的客户端机器连接到我们的构建主机,您应该在您的 本地计算机 上启动一个 SSH 代理来存储您的 SSH 密钥凭据。

OpenSSL 带有一个 SSH 代理,可以通过在您的家用计算机上键入以下命令来启动它:

eval $(ssh-agent)

接下来,您需要通过键入以下内容将您的 SSH 密钥添加到其中:

ssh-add

之后,您可以在连接时使用 -A 标志将本地 SSH 凭据转发到客户端计算机。 这将允许您从客户端计算机访问任何计算机,就像您从家庭计算机访问它一样:

ssh -A freebsd@client_domain_or_IP

一旦您在远程客户端计算机上,第一步是创建目录结构(如果它不存在)以供您存储证书。 我们将继续为密钥创建一个目录,以便我们可以将其用于未来的任务:

sudo mkdir -p /usr/local/etc/ssl/{keys,certs}

现在我们可以使用 SSH 连接到我们的构建机器并将证书文件传送回我们的客户端机器。 由于我们转发了 SSH 凭据,我们应该能够在不提示输入密码的情况下执行此操作:

ssh freebsd@server_domain_or_IP 'cat /usr/local/etc/ssl/certs/poudriere.cert' | sudo tee /usr/local/etc/ssl/certs/poudriere.cert

此命令将使用您的本地 SSH 凭据从您的客户端计算机连接到构建计算机。 连接后,它将显示您的证书文件的内容,并通过 SSH 隧道将其传送回您的远程客户端计算机。 从那里,我们使用 sudo tee 组合将证书写入我们的目录。

一旦完成,我们就可以像在构建机器本身上一样制作我们的存储库目录结构:

sudo mkdir -p /usr/local/etc/pkg/repos

现在,我们可以创建一个与我们在构建机器上使用的非常相似的存储库文件:

sudo vi /usr/local/etc/pkg/repos/poudriere.conf

区别在于 URL 位置和镜像类型。 同样,我们可以选择混合包或使用 only 我们自定义编译的包。 同样的警告也适用于混合包源。

如果您想将自定义包与官方存储库的包混合,您的文件应如下所示:

poudriere: {
    url: "http://server_domain_or_IP/packages/freebsd_10-1x64-HEAD/",
    mirror_type: "http",
    signature_type: "pubkey",
    pubkey: "/usr/local/etc/ssl/certs/poudriere.cert",
    enabled: yes,
    priority: 100
}

如果您只想使用已编译的包,您的文件应如下所示:

poudriere: {
    url: "http://server_domain_or_IP/packages/freebsd_10-1x64-HEAD/",
    mirror_type: "http",
    signature_type: "pubkey",
    pubkey: "/usr/local/etc/ssl/certs/poudriere.cert",
    enabled: yes

此外,如果您只使用自己的软件包,请记住创建另一个存储库配置文件来覆盖默认的 FreeBSD 存储库配置:

sudo vi /usr/local/etc/pkg/repos/freebsd.conf

将以下内容放入文件中以禁用官方存储库:

FreeBSD: {
    enabled: no
}

完成后,更新您的 pkg 数据库以开始使用您的自定义编译包:

sudo pkg update

您可以在任意多的 FreeBSD 客户端机器上重复此过程。

当更新可用时重建你的包

您现在应该运行整个 poudriere 设置。 但是,当有新的更新可用时,您需要不时重建您的包,尤其是当它们与安全相关时。

幸运的是,重建包的过程相当简单。 首先,您应该更新您的 FreeBSD jail,以便您的软件包是针对最新的操作系统构建的。 您可以通过键入:

sudo poudriere jail -u -j freebsd_10-1x64

接下来,您应该更新您的端口树,以便您的监狱可以使用每个端口的最新版本。 您可以通过键入:

sudo poudriere ports -u -p HEAD

更新 jail 和端口树后,如果要进行任何更改,您可以修改端口列表:

sudo vi /usr/local/etc/poudriere.d/port-list

如果您需要调整任何 make.conf 选项,您可以通过编辑与您的构建关联的文件来实现:

sudo vi /usr/local/etc/poudriere.d/freebsd_10-1x64-make.conf

您可以通过键入以下内容来检查端口的任何新选项:

sudo poudriere options -j freebsd_10-1x64 -p HEAD -f /usr/local/etc/poudriere.d/port-list

如果您想查看端口选项的 all,可以添加 -c 标志。 这在解决构建或运行时问题时会很有帮助:

sudo poudriere options -c -j freebsd_10-1x64 -p HEAD -f /usr/local/etc/poudriere.d/port-list

完成上述准备步骤后,您可以通过键入以下内容重新编译任何已更改或已更新的端口:

sudo poudriere bulk -j freebsd_10-1x64 -p HEAD -f /usr/local/etc/poudriere.d/port-list

随时监控 Web 界面中的进度。 编译新包后,您可以通过键入以下内容更新每台机器上的包:

sudo pkg upgrade

这将允许您非常轻松地更新整个 FreeBSD 基础架构上的自定义包。

结论

在本指南中,我们介绍了如何配置 poudriere 来为我们的构建机器和外部客户端编译和打包一组自定义端口。 乍一看,这个过程可能看起来很长,但是一旦启动并运行它就很容易管理。

通过利用 poudriere,您可以利用 FreeBSD 的两个可选软件管理系统。 对于许多用户来说,这构成了两全其美。 poudriere 构建系统允许您在单台机器上自定义软件,同时利用快速 pkg 系统进行实际安装和管理。