Poudriere: 12 stables, courant à l'intérieur de la prison

Créé le 10 déc. 2018  ·  17Commentaires  ·  Source: freebsd/poudriere

J'ai du mal à faire fonctionner poudriere dans une prison depuis la mise à niveau vers 12-stable il y a quelques jours. Sans aucune modification de ma config, j'obtiens maintenant jail: IPv4 addresses clash alors que la prison du constructeur poudriere est démarrée lors d'un build :

# 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

J'ai manipulé LOIP4 et LOIP6 et la configuration IP de la prison extérieure en vain.

En inspectant le code dans common.sh , il semble que poudriere essaie de déterminer quelles IP passer à l'invocation de démarrage de la prison, à savoir ip4.addr et ip6.addr . J'ai réinitialisé localipargs à la chaîne vide (juste après le bloc case $IPS vers la ligne 7734), ce qui permet à mes builds de fonctionner à nouveau correctement.

Est-ce une incompatibilité potentielle avec 12-stable ?

Base Issue

Commentaire le plus utile

J'ai réussi à retrouver une configuration fonctionnelle en utilisant VIMAGE et une prison vnet. Si la configuration IP partagée "classique" peut fonctionner, j'aimerais savoir comment.

Tous les 17 commentaires

Dang, même avec ce correctif, Python et Ruby ne parviennent pas à se construire.

Python:

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

Rubis:

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

J'ai réussi à retrouver une configuration fonctionnelle en utilisant VIMAGE et une prison vnet. Si la configuration IP partagée "classique" peut fonctionner, j'aimerais savoir comment.

La construction de ruby ​​dans une prison 12.0-RELEASE-p2 échoue toujours.
Construire Ruby à l'intérieur d'une prison 11.2-RELEASE-p8 fonctionne.
Une idée ?

Ci-joint le journal de construction :
ruby-2.5.3_1,1.log

@stblassitude Qu'avez-vous dû modifier pour que cela fonctionne ? Plus précisément, où l'option vnet nécessaire ? Dans la prison Poudrière est dans ou dans les prisons créées par Poudrière ?

Je pense qu'une solution de contournement pourrait consister à définir une adresse de bouclage unique :

LOIP4=127.0.0.2
LOIP6=::2

@bdrewery , l'utilisation des paramètres que vous avez suggérés génère les mêmes avertissements et erreurs :
(également essayé LOIP4="127.0.0.2/32"). On dirait que LOIP4 est ignoré. Doit-il être réglé ailleurs ?
Le réglage du bouclage de la prison poudrière en externe échoue également.

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

LOIP4=127.0.0.2
LOIP6=::2
NO_ZFS=oui
FREEBSD_HOST = ftp://ftp.freebsd.org
RESOLV_CONF=/etc/resolv.conf
BASEFS=/p
USE_PORTLINT=non
USE_TMPFS=non
DISTFILES_CACHE=/usr/ports/distfiles
NOLINUX=oui
ALLOW_MAKE_JOBS=oui

[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 , l'utilisation des paramètres que vous avez suggérés génère les mêmes avertissements et erreurs :
(également essayé LOIP4="127.0.0.2/32"). On dirait que LOIP4 est ignoré. Doit-il être réglé ailleurs ?

C'est à cause de ce code dans 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                                                                       

Essayez de supprimer cela pour le moment. Il essaie de s'assurer que la prison actuelle a l'adresse IP que vous essayez d'attribuer à la prison imbriquée. (La régression en question.)

Lorsque vous commentez cela, ce qui suit s'affiche et aucune construction ne se poursuit :

jail: jail_set: Operation not permitted

Juste pour confirmer, j'exécute Poudriere dans une prison iocage sur un hôte exécutant FreeBSD 12.0-RELEASE-p3 GENERIC

# 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       |

La compilation de ruby ​​échoue pour les prisons répertoriées ci-dessous :

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 Qu'avez-vous dû modifier pour que cela fonctionne ? Plus précisément, où l'option vnet nécessaire ? Dans la prison Poudrière est dans ou dans les prisons créées par Poudrière ?

Voici mon 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;
}

Le script d'aide fait ceci :

#!/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

Dans la prison pkg , j'utilise ce 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

Les ensembles de données ZFS ressemblent à ceci à l'intérieur de la prison :

$ 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

Je crois que j'ai eu ce problème aussi, mais comme je l'avais essayé pour la première fois sur 12, je ne pensais pas que c'était lié à une mise à niveau 12. Je regarde juste pour voir quelle solution vous proposez tous ici.

J'ai trouvé un cas de test, construisez lang/python27 ou lang/python3 avec l'option IPv6 et la prison à double pile.

Si poudriere jail export jail.conf
ip4=inherit; ip6=inherit;
construire le succès

si l'export ip4.addr et ip6.addr adresses échouent lors de la configuration
checking for getaddrinfo... yes checking getaddrinfo bug... yes Fatal: You must get working getaddrinfo() function. or you can specify "--disable-ipv6".
désactiver l'option IPv6 fix build.

Apparemment une erreur quelque part dans set lo pour IPv6 ceci maintenant (::1/128) pas /8

Fait intéressant, la différence n'est pas ce qu'est un travailleur interactif.
Si vous utilisez bulk -i auto build fail configure, build hand in this jail réussi
make -C /usr/ports/lang/python27/ .... checking for getaddrinfo... yes checking getaddrinfo bug... no checking for getnameinfo... (cached) yes .... creating Makefile ....

RESTRICT_NETWORKING=no résoudre ce problème, peut-être ajouter NO_RESTRICT_NETWORKING_PACKAGES="python27 ..." similaire ALLOW_NETWORKING_PACKAGES ?

J'ai réussi à retrouver une configuration fonctionnelle en utilisant VIMAGE et une prison vnet. Si la configuration IP partagée "classique" peut fonctionner, j'aimerais savoir comment.

Sur la base du commentaire ci-dessus, j'ai également opté pour une solution vnet . A travaillé pour moi. Merci.

@stblassitude Qu'avez-vous dû modifier pour que cela fonctionne ? Plus précisément, où l'option vnet nécessaire ? Dans la prison Poudrière est dans ou dans les prisons créées par Poudrière ?

C'est dans la configuration pour la prison poudrière. J'ai fait ça.

Pour /etc/rc.conf :

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

Ensuite pour la configuration de la prison :

$ 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

J'aurai un article de blog dans la semaine prochaine.

Je voulais juste faire un suivi avec une mise à jour que j'ai faite lors de l'exécution de 12.1-RELEASE-p7 après avoir lu ceci :

"Cela signifie également que lorsqu'un démon emprisonné s'attache à un port sur "l'adresse de bouclage", il s'attache en fait à l'adresse IP externe de la prison."
Lucas, Michael W. Maîtrise FreeBSD : Prisons (Livre de maîtrise informatique 15)

La définition de LOIP4 dans poudriere.conf sur l'ip4_addr de la prison a permis à ruby ​​de se compiler.

Dans mon cas:
#iocage get ip4_addr poudriere
lo1|192.168.10.100

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

Cette page vous a été utile?
0 / 5 - 0 notes