Poudriere: 12-安定した、刑務所内で実行

作成日 2018年12月10日  ·  17コメント  ·  ソース: freebsd/poudriere

数日前に12-stableにアップグレードして以来、刑務所内でpoudriereを実行するのに問題があります。 構成を変更せずに、ビルド中にpoudriere Builder jailが開始されている間、 jail: IPv4 addresses clashを取得します。

# poudriere bulk -j 12amd64 -p local -z zs64 -f /root/11amd64-local-zs64-pkglist
[00:00:00] Creating the reference jail... done
[00:00:01] Mounting system devices for 12amd64-local-zs64
[00:00:01] Mounting ports/packages/distfiles
[00:00:01] Using packages from previously failed build
[00:00:01] Mounting ccache from: /var/cache/ccache
[00:00:01] Mounting packages from: /p/data/packages/12amd64-local-zs64
[00:00:02] Appending to make.conf: /usr/local/etc/poudriere.d/make.conf
[00:00:02] Appending to make.conf: /usr/local/etc/poudriere.d/zs64-make.conf
/etc/resolv.conf -> /p/data/.m/12amd64-local-zs64/ref/etc/resolv.conf
[00:00:02] Starting jail 12amd64-local-zs64
jail: IPv4 addresses clash
[00:00:02] Cleaning up
[00:00:02] Unmounting file systems

私はLOIP4とLOIP6、および外部の刑務所のIP構成をいじくりまわしました。

common.shのコードを調べると、poudriereは、刑務所の開始呼び出しに渡すIP、つまりip4.addrip6.addrを決定しようとしているようです。 localipargsを空の文字列にハードリセットしました(行7734付近のcase $IPSブロックの直後)。これにより、ビルドが再び正しく機能するようになります。

これは12-stableとの潜在的な非互換性ですか?

Base Issue

最も参考になるコメント

VIMAGEとvnetjailを使用して、正常に動作するセットアップを再び取得することができました。 「クラシック」な共有IPセットアップを機能させることができれば、その方法を聞きたいと思います。

全てのコメント17件

ダン、そのパッチがあっても、PythonとRubyはビルドに失敗します。

Python:

checking getaddrinfo bug... yes
Fatal: You must get working getaddrinfo() function.
       or you can specify "--disable-ipv6".
===>  Script "configure" failed unexpectedly.

ルビー:

compiling raddrinfo.c
raddrinfo.c:214:17: warning: implicit declaration of function 'parse_numeric_port' is invalid in C99 [-Wimplicit-function-declaration]
    if (node && parse_numeric_port(service, &port)) {
                ^
1 warning generated.
compiling ifaddr.c
compiling getaddrinfo.c
In file included from getaddrinfo.c:86:
./addrinfo.h:165:12: error: conflicting types for 'getnameinfo'
extern int getnameinfo __P((
           ^
/usr/include/netdb.h:251:6: note: previous declaration is here
int             getnameinfo(const struct sockaddr *, socklen_t, char *,
                ^
getaddrinfo.c:408:7: warning: add explicit braces to avoid dangling else [-Wdangling-else]
                                } else if (strcmp(sp->s_proto, "tcp") == 0) {
                                  ^
1 warning and 1 error generated.
*** Error code 1

VIMAGEとvnetjailを使用して、正常に動作するセットアップを再び取得することができました。 「クラシック」な共有IPセットアップを機能させることができれば、その方法を聞きたいと思います。

12.0-RELEASE-p2刑務所内でのルビーの構築はまだ失敗しています。
11.2-RELEASE-p8刑務所内にルビーを建てるのはうまくいきます。
何か洞察はありますか?

添付されているのはビルドログです。
ruby-2.5.3_1,1.log

@stblassitudeそれを機能させるために何を変更する必要がありましたか? 具体的には、 vnetオプションはどこに必要ですか? 刑務所の中でPoudriereはPoudriereが作成した刑務所の中または中にいますか?

回避策は、一意のループバックアドレスを設定することだと思います。

LOIP4=127.0.0.2
LOIP6=::2

@bdrewery 、提案した設定を使用すると、同じ警告とエラーが生成されます。
(LOIP4 = "127.0.0.2/32"も試しました)。 LOIP4が無視されているようです。 他の場所に設定する必要がありますか?
poudrierejailのループバックを外部から設定することも失敗します。

grep '^ [AZ]' /usr/local/etc/poudriere.conf

LOIP4 = 127.0.0.2
LOIP6 = :: 2
NO_ZFS = yes
FREEBSD_HOST = ftp://ftp.freebsd.org
RESOLV_CONF = / etc / resolv.conf
BASEFS = / p
USE_PORTLINT = no
USE_TMPFS = no
DISTFILES_CACHE = / usr / Ports / distfiles
NOLINUX =はい
ALLOW_MAKE_JOBS = yes

[00:00:00] Warning: No loopback address defined, consider setting LOIP6/LOIP4 or assigning a loopback address to the jail.
[00:00:00] Updating portstree "default" with portsnap...Looking up portsnap.FreeBSD.org mirrors... 6 mirrors found.
In file included from getaddrinfo.c:86:
./addrinfo.h:165:12: error: conflicting types for 'getnameinfo'
extern int getnameinfo __P((
           ^
/usr/include/netdb.h:251:6: note: previous declaration is here
int             getnameinfo(const struct sockaddr *, socklen_t, char *,
                ^
--- ext/cgi/escape/all ---
--- escape.o ---
compiling escape.c
--- ext/ripper/all ---
--- pre-install-rb-default ---
installing default ripper libraries
--- ../../.ext/common/ripper.rb ---
--- ext/json/all ---
--- ../../.ext/common/json/add/rational.rb ---
--- ext/fiddle/all ---
--- fiddle.o ---
--- ext/openssl/all ---
--- ossl.o ---
--- ext/fiddle/all ---
compiling fiddle.c
--- ext/openssl/all ---
compiling ossl.c
--- ext/rbconfig/sizeof/all ---
--- limits.o ---
compiling limits.c
--- ext/socket/all ---
getaddrinfo.c:408:7: warning: add explicit braces to avoid dangling else [-Wdangling-else]
                                } else if (strcmp(sp->s_proto, "tcp") == 0) {
                                  ^
--- ext/bigdecimal/all ---
--- ../../.ext/common/bigdecimal/math.rb ---
--- ext/socket/all ---
1 warning and 1 error generated.
*** [getaddrinfo.o] Error code 1

@bdrewery 、提案した設定を使用すると、同じ警告とエラーが生成されます。
(LOIP4 = "127.0.0.2/32"も試しました)。 LOIP4が無視されているようです。 他の場所に設定する必要がありますか?

これは、common.shのこのコードが原因です。

# If in a nested jail we may not even have a loopback to use.            
if [ ${JAILED} -eq 1 ]; then                                             
        # !! Note these exit statuses are inverted                       
        ifconfig | \                                                     
            awk -vip="${LOIP6}" '$1 == "inet6" && $2 == ip {exit 1}' && \
            LOIP6=                                                       
        ifconfig | \                                                     
            awk -vip="${LOIP4}" '$1 == "inet" && $2 == ip {exit 1}' && \ 
            LOIP4=                                                       
fi                                                                       

今はそれを削除してみてください。 現在の刑務所に、ネストされた刑務所に割り当てようとしているIPが含まれていることを確認しようとしています。 (問題の回帰。)

コメントアウトすると、次のように表示され、ビルドは続行されません。

jail: jail_set: Operation not permitted

確認のために、FreeBSD 12.0-RELEASE-p3GENERICを実行しているホストのiocagejail内でPoudriereを実行しています。

# iocage list -l
+------+------------+------+-------+------+-----------------+--------------------+-----+----------+----------+
| JID  |    NAME    | BOOT | STATE | TYPE |     RELEASE     |        IP4         | IP6 | TEMPLATE | BASEJAIL |
+======+============+======+=======+======+=================+====================+=====+==========+==========+
| 2963 | poudriere  | on   | up    | jail | 12.0-RELEASE-p3 | lo1|192.168.250.10 | -   | -        | no       |

以下にリストされている刑務所では、rubyのコンパイルが失敗します。

root<strong i="12">@poudriere</strong>:~ # poudriere jail -l
[00:00:00] Warning: No loopback address defined, consider setting LOIP6/LOIP4 or assigning a loopback address to the jail.
JAILNAME    VERSION         ARCH  METHOD TIMESTAMP           PATH
11_2        11.2-RELEASE-p9 amd64 ftp    2019-03-05 13:49:56 /p/jails/11_2
12_0        12.0-RELEASE-p3 amd64 ftp    2019-03-05 13:52:05 /p/jails/12_0

@stblassitudeそれを機能させるために何を変更する必要がありましたか? 具体的には、 vnetオプションはどこに必要ですか? 刑務所の中でPoudriereはPoudriereが作成した刑務所の中または中にいますか?

これが私のjail.confです:

mount.devfs;
devfs_ruleset = 4;

exec.clean;
exec.jail_user = "root";
exec.system_user = "root";
exec.consolelog = "/var/log/jail_${name}.log";
exec.prestart = "/root/bin/jail-helper prestart ${name} ${host.hostname} ${path}";
exec.poststop = "/root/bin/jail-helper poststop ${name} ${host.hostname} ${path}";
exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
interface = "bridge0";
allow.raw_sockets;
allow.sysvipc;
...
pkg {
        path = "/jail/pkg.zs64.net";
        vnet;
        vnet.interface = "ji${name}";
        host.hostname = "pkg.zs64.net";
        children.max = 40;
        exec.prestart += "/root/bin/jail-helper prevnet ${name} bridge1";
        exec.poststart += "zfs jail $name data/jail/${host.hostname}/poudriere";
        exec.poststart += "jexec $name zfs mount -a";
        #exec.prestop += "zfs unjail $name data/jail/${host.hostname}/poudriere";
        exec.poststop += "/root/bin/jail-helper postvnet ${name}";
        allow.mount;
        allow.mount.devfs;
        allow.mount.linprocfs;
        allow.mount.nullfs;
        allow.mount.procfs;
        allow.mount.tmpfs;
        allow.mount.zfs;
        allow.socket_af;
        allow.chflags;
        enforce_statfs=1;
}

ヘルパースクリプトはこれを行います:

#!/bin/sh

#
# Mount system directories via nullfs
#

cmd="$1"
name="$2"
host="$3"
path="$4"

rofs="/bin /lib /libexec /sbin /usr/bin /usr/include /usr/lib /usr/libdata /usr/libexec /usr/sbin /usr/share /usr/ports"

mountall() {
    mount -t devfs -o ruleset=10 devfs ${path}/dev
    ls ${path}/dev/null >/dev/null
    for i in $rofs; do
        mount -t nullfs -o ro "${i}" "${path}${i}"
    done
    mount -t nullfs -w /freebsd/distfiles ${path}/var/ports/distfiles
}

umountall() {
    mount | \
        sed -nEe 's#.* on ('"${path}"'/[^ ]*) \(.*#\1#p' | \
        sort -r | \
        xargs -n1 umount
}

vnet_create() {
    ifname="$(/sbin/ifconfig epair create)"
    ifbase="${ifname%%a}"
    /sbin/ifconfig "${ifbase}a" up name "jo${name}" >/dev/null
    /sbin/ifconfig "${ifbase}b" name "ji${name}" >/dev/null
    /sbin/ifconfig "${host}" addm "jo${name}"
}

vnet_destroy() {
    /sbin/ifconfig "jo${name}" destroy 2>/dev/null || true
}

case ${cmd} in
    prestart)
        umountall
        mountall
        ;;
    prevnet)
        vnet_destroy
        vnet_create
        ;;
    poststop)
        umountall
        ;;
    postvnet)
        vnet_destroy
        ;;
esac

pkg刑務所の中で、私はこのpoudriere.confを使用します:

BASEFS=/usr/local/poudriere
CCACHE_DIR=/var/cache/ccache
DISTFILES_CACHE=/var/ports/distfiles
FREEBSD_HOST=https://download.FreeBSD.org
PKG_REPO_SIGNING_KEY=/usr/local/etc/poudriere.key
TMPFS_LIMIT=6
URL_BASE=http://pkg.example.com
ZPOOL=data
ZROOTFS=/jail/pkg.example.com/poudriere

ZFSデータセットは、刑務所内では次のようになります。

$ zfs list
NAME                                             USED  AVAIL  REFER  MOUNTPOINT
data                                            1.74T   858G    88K  /data
data/jail                                       1.33T   858G    96K  /jail
data/jail/pkg.example.com                          34.2G   858G  5.54G  /jail/pkg.example.com
data/jail/pkg.example.com/poudriere                24.3G   858G    88K  /p
data/jail/pkg.example.com/poudriere/data           19.1G   858G    96K  /p/data
data/jail/pkg.example.com/poudriere/data/.m        11.6G   858G   112K  /p/data/.m
data/jail/pkg.example.com/poudriere/data/cache      260M   858G  23.8M  /p/data/cache
data/jail/pkg.example.com/poudriere/data/logs      3.17G   858G  2.74G  /p/data/logs
data/jail/pkg.example.com/poudriere/data/packages  4.12G   858G  1.95G  /p/data/packages
data/jail/pkg.example.com/poudriere/data/wrkdirs     88K   858G    88K  /p/data/wrkdirs
data/jail/pkg.example.com/poudriere/jails          1.27G   858G    88K  /p/jails
data/jail/pkg.example.com/poudriere/jails/11amd64    88K   858G    88K  /usr/local/poudriere/jails/11amd64
data/jail/pkg.example.com/poudriere/jails/12amd64  1.27G   858G  1.24G  /usr/local/poudriere/jails/12amd64
data/jail/pkg.example.com/poudriere/ports          3.91G   858G    88K  /p/ports
data/jail/pkg.example.com/poudriere/ports/local    3.91G   858G   903M  /usr/local/poudriere/ports/local

私もこの問題を抱えていたと思いますが、12日に初めて試したので、12のアップグレードに関連しているとは思いませんでした。 ここで皆さんが思いついた解決策を確認するだけです。

テストケースが見つかりました。IPv6オプションとデュアルスタックジェイルを使用してlang/python27またはlang/python3をビルドします。

poudrierejailがjail.confをエクスポートする場合
ip4=inherit; ip6=inherit;
成功を構築する

エクスポートip4.addrおよびip6.addrアドレスのビルドが構成で失敗した場合
checking for getaddrinfo... yes checking getaddrinfo bug... yes Fatal: You must get working getaddrinfo() function. or you can specify "--disable-ipv6".
オプションIPv6修正ビルドを無効にします。

どうやらIPv6のsetloのどこかでエラーが発生しました(:: 1/128)/ 8ではありません

興味深いことに、違いはインタラクティブワーカーが何であるかではありません。
bulk -i自動ビルド失敗構成を使用する場合、このjail成功でハンドビルド
make -C /usr/ports/lang/python27/ .... checking for getaddrinfo... yes checking getaddrinfo bug... no checking for getnameinfo... (cached) yes .... creating Makefile ....

RESTRICT_NETWORKING=noこの問題を修正し、おそらくNO_RESTRICT_NETWORKING_PACKAGES="python27 ..."同様のALLOW_NETWORKING_PACKAGES追加しますか?

VIMAGEとvnetjailを使用して、正常に動作するセットアップを再び取得することができました。 「クラシック」な共有IPセットアップを機能させることができれば、その方法を聞きたいと思います。

上記のコメントに基づいて、私もvnetソリューションを採用しました。 私のために働いた。 ありがとう。

@stblassitudeそれを機能させるために何を変更する必要がありましたか? 具体的には、 vnetオプションはどこに必要ですか? 刑務所の中でPoudriereはPoudriereが作成した刑務所の中または中にいますか?

それはpoudriere刑務所の構成にあります。 これは私がしました。

/etc/rc.confの場合:

cloned_interfaces="bridge0"
ifconfig_bridge0="addm ix0 up"

次に、jail構成の場合:

$ sudo iocage set vnet=on pkg01
$ sudo iocage set ip4_addr="vnet0|10.55.0.29/24" pkg01
$ sudo iocage set ip6_addr="vnet0|[redacted]:23/64" pkg01

来週かそこらにブログ投稿があります。

これを読んだ後、1​​2.1-RELEASE-p7の実行中に行った更新をフォローアップしたかっただけです。

「これは、jailされたデーモンが「ループバックアドレス」のポートに接続する場合、実際にはjailの外部IPアドレスに接続していることも意味します。」
Lucas、Michael W. FreeBSD Mastery:Jails(IT Mastery Book 15)

poudriere.confのLOIP4をjailのip4_addrに設定すると、rubyがコンパイルできるようになりました。

私の場合:
#iocage get ip4_addr poudriere
lo1 | 192.168.10.100

#grep LOIP4 /usr/local/etc/poudriere.conf
LOIP4 = 192.168.10.100

このページは役に立ちましたか?
0 / 5 - 0 評価