为什么 poudriere 创建一对有 IP 地址和没有 IP 地址的监狱

Why poudriere creates a pair of jails with and without IP addresses

在使用 poudriere 测试一个端口时,像这样:

poudriere testport -v -j 11amd64 -p custom www/go-www 

我收到这个错误:

!!! build failure encountered !!!               
[00:00:06] ====>> Error: Build failed in phase: fetch 

出于某种原因,该包不能 found/downloaded,因此在我尝试检查 jails 解析器是否存在问题时,我通过执行 jails 列出了现有的 jails =20=] - 这个输出引起了我的注意:

>  jls
   JID  IP Address      Hostname                      Path
   363  127.0.0.1       11amd64-custom                /usr/local/poudriere/data/.m/11amd64-custom/ref
   364                  11amd64-custom                /usr/local/poudriere/data/.m/11amd64-custom/ref
   365  127.0.0.1       11amd64-custom-job-02         /usr/local/poudriere/data/.m/11amd64-custom/02
   366                  11amd64-custom-job-02         /usr/local/poudriere/data/.m/11amd64-custom/02
   367  127.0.0.1       11amd64-custom-job-01         /usr/local/poudriere/data/.m/11amd64-custom/01
   368                  11amd64-custom-job-01         /usr/local/poudriere/data/.m/11amd64-custom/01
   369  127.0.0.1       11amd64-custom-job-03         /usr/local/poudriere/data/.m/11amd64-custom/03
   370                  11amd64-custom-job-03         /usr/local/poudriere/data/.m/11amd64-custom/03

我注意到的是,如果我进入一个没有分配 IP 地址的监狱 jexec 364 我可以 ping/fetch 任何主机,例如,但是如果我进入一个监狱IP 地址 jexec 363,在这种情况下 127.0.0.1 我不能 ping/resolve:

ping: sendto: Can't assign requested address

因此我想知道创建一对监狱的想法是什么,一个有 IP(不可路由),另一个没有 IP(可路由),背后的逻辑是什么?

以防万一这是我用于 poudriere 的配置 /usr/local/etc/poudriere.conf:

ZPOOL=tank
ZROOTFS=/poudriere
FREEBSD_HOST=https://download.FreeBSD.org
RESOLV_CONF=/etc/resolv.conf
BASEFS=/usr/local/poudriere
POUDRIERE_DATA=${BASEFS}/data
USE_PORTLINT=no
USE_TMPFS=yes
DISTFILES_CACHE=/usr/ports/distfiles
CHECK_CHANGED_OPTIONS=verbose
CHECK_CHANGED_DEPS=yes
PKG_REPO_SIGNING_KEY=/usr/local/etc/ssl/keys/pkg.key
CCACHE_DIR=/var/cache/ccache
NOLINUX=yes

更新

要解决我在交互模式下输入的问题 - 请注意 -i:

poudriere testport -v -i -j 11amd64 -p custom www/go-www 

然后:

cd /usr/ports/www/go-www/; make

获取包,我只是将它们复制到 /usr/ports/distfiles/

再说一遍:

poudriere testport -v -j 11amd64 -p custom www/go-www 

那是一个丑陋的 hack,但主要问题是 Makefile 中复制内容的错误行:

 GH_ACCOUNT=    nbari:DEFAULT,www

应该是:

 GH_ACCOUNT=    nbari:DEFAULT

但仍然想知道为什么要创建有 IP 和无 IP 的监狱对。

poudriere(8) preforms preforms 不需要联网的阶段是限制性更强的监狱,以增加安全性。 Previously jails 在有或没有网络功能的情况下重新启动,现在在整个过程中保留两个独立的 jails 以降低复杂性。

具有所列IP地址的jail被明确设置为环回地址,没有的则从主机继承网络:

: ${LOIP6:=::1}
: ${LOIP4:=127.0.0.1}
case $IPS in
01)
        localipargs="ip6.addr=${LOIP6}"
        ipargs="ip6=inherit"
        ;;
10)
        localipargs="ip4.addr=${LOIP4}"
        ipargs="ip4=inherit"
        ;;
11)
        localipargs="ip4.addr=${LOIP4} ip6.addr=${LOIP6}"
        ipargs="ip4=inherit ip6=inherit"
        ;;
esac

...

jstart() {
        local name network

        network="${localipargs}"

        [ "${RESTRICT_NETWORKING}" = "yes" ] || network="${ipargs}"

        _my_name name
        jail -c persist name=${name} \
                path=${MASTERMNT}${MY_JOBID+/../${MY_JOBID}} \
                host.hostname=${BUILDER_HOSTNAME-${name}} \
                ${network} ${JAIL_PARAMS} \
                allow.socket_af allow.raw_sockets allow.chflags allow.sysvipc
        jail -c persist name=${name}-n \
                path=${MASTERMNT}${MY_JOBID+/../${MY_JOBID}} \
                host.hostname=${BUILDER_HOSTNAME-${name}} \
                ${ipargs} ${JAIL_PARAMS} \
                allow.socket_af allow.raw_sockets allow.chflags allow.sysvipc
}

提取错误似乎是因为新 distfile 中的重复条目(nbari-www-1.1.1_GH0.tar.gz 有两个条目)。错误行 在您的日志文件中以 fetch: 4211 开头,4211 是重复条目的大小。

由于 GH_ACCOUNTDEFAUT 指定的组添加了 PORTNAME (www) 和 [=18=,因此该条目被添加了两次] 添加自己。