Poudriere: 12 estables, corriendo dentro de la cárcel

Creado en 10 dic. 2018  ·  17Comentarios  ·  Fuente: freebsd/poudriere

Tengo problemas para ejecutar poudriere dentro de una cárcel desde que actualicé a 12 estable hace un par de días. Sin ningún cambio en mi configuración, ahora obtengo jail: IPv4 addresses clash mientras la cárcel del constructor poudriere se inicia durante una compilación:

# 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

He jugado con LOIP4 y LOIP6 y la configuración de IP de la cárcel exterior en vano.

Al inspeccionar el código en common.sh , parece que poudriere intenta determinar qué IP pasar a la invocación de inicio de la cárcel, a saber, ip4.addr y ip6.addr . Restablecí localipargs a la cadena vacía (justo después del bloque case $IPS en la línea 7734), lo que hace que mis compilaciones vuelvan a funcionar correctamente.

¿Es esta una posible incompatibilidad con 12-estable?

Base Issue

Comentario más útil

Me las arreglé para volver a tener una configuración funcional, usando VIMAGE y una cárcel de vnet. Si se puede hacer que funcione la configuración de IP compartida "clásica", me gustaría saber cómo.

Todos 17 comentarios

Maldita sea, incluso con ese parche, Python y Ruby no se pueden construir.

Pitón:

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

Rubí:

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

Me las arreglé para volver a tener una configuración funcional, usando VIMAGE y una cárcel de vnet. Si se puede hacer que funcione la configuración de IP compartida "clásica", me gustaría saber cómo.

La construcción de Ruby dentro de una cárcel 12.0-RELEASE-p2 sigue fallando.
La construcción de ruby ​​dentro de una cárcel 11.2-RELEASE-p8 funciona.
¿Alguna idea?

Se adjunta el registro de compilación:
ruby-2.5.3_1,1.log

@stblassitude ¿Qué tuviste que modificar para que funcionara? Específicamente, ¿dónde se necesita la opción vnet ? ¿En la cárcel está Poudriere o en cárceles creadas por Poudriere?

Creo que una solución alternativa podría ser establecer una dirección de loopback única:

LOIP4=127.0.0.2
LOIP6=::2

@bdrewery , el uso de la configuración que sugirió genera las mismas advertencias y errores:
(también probé LOIP4 = "127.0.0.2/32"). Parece que LOIP4 está siendo ignorado. ¿Debería establecerse en otro lugar?
La configuración del loopback de la cárcel poudriere externamente también falla.

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

LOIP4 = 127.0.0.2
LOIP6 = :: 2
NO_ZFS = sí
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 = sí
ALLOW_MAKE_JOBS = sí

[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 , el uso de la configuración que sugirió genera las mismas advertencias y errores:
(también probé LOIP4 = "127.0.0.2/32"). Parece que LOIP4 está siendo ignorado. ¿Debería establecerse en otro lugar?

Es por este código en 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                                                                       

Intenta eliminar eso por ahora. Está tratando de asegurarse de que la cárcel actual tenga la IP que está intentando asignar a la cárcel anidada. (La regresión en cuestión).

Al comentar eso, se muestra lo siguiente y no se procede a la construcción:

jail: jail_set: Operation not permitted

Solo para confirmar, estoy ejecutando Poudriere dentro de una cárcel de iocage en un host que ejecuta 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 compilación de ruby ​​falla para las cárceles que se enumeran a continuación:

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é tuviste que modificar para que funcionara? Específicamente, ¿dónde se necesita la opción vnet ? ¿En la cárcel está Poudriere o en cárceles creadas por Poudriere?

Aquí está mi 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;
}

El script de ayuda hace esto:

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

Dentro de la cárcel pkg , uso este 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

Los conjuntos de datos de ZFS se ven así dentro de la cárcel:

$ 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

Creo que también tuve este problema, pero como lo probé por primera vez en 12, no pensé que estuviera relacionado con una actualización de 12. Solo mira para ver qué solución se les ocurre aquí.

Me encontré con un caso de prueba, construyo lang/python27 o lang/python3 con la opción IPv6 y la cárcel de doble pila.

Si poudriere jail export jail.conf
ip4=inherit; ip6=inherit;
construir el éxito

si las direcciones de exportación ip4.addr y ip6.addr fallan en la configuración
checking for getaddrinfo... yes checking getaddrinfo bug... yes Fatal: You must get working getaddrinfo() function. or you can specify "--disable-ipv6".
deshabilitar la opción de compilación de arreglos de IPv6.

Aparentemente, un error en algún lugar del conjunto lo para IPv6 este ahora (:: 1/128) no / 8

Curiosamente, la diferencia no es qué es un trabajador interactivo.
Si usa bulk -i auto build fail configure, construya manualmente en esta cárcel con éxito
make -C /usr/ports/lang/python27/ .... checking for getaddrinfo... yes checking getaddrinfo bug... no checking for getnameinfo... (cached) yes .... creating Makefile ....

RESTRICT_NETWORKING=no solucione este problema, tal vez agregue NO_RESTRICT_NETWORKING_PACKAGES="python27 ..." similar ALLOW_NETWORKING_PACKAGES ?

Me las arreglé para volver a tener una configuración funcional, usando VIMAGE y una cárcel de vnet. Si se puede hacer que funcione la configuración de IP compartida "clásica", me gustaría saber cómo.

Según el comentario anterior, también opté por una solución vnet . Trabajó para mi. Gracias.

@stblassitude ¿Qué tuviste que modificar para que funcionara? Específicamente, ¿dónde se necesita la opción vnet ? ¿En la cárcel está Poudriere o en cárceles creadas por Poudriere?

Está en la configuración de la cárcel de poudriere. Hice esto.

Para /etc/rc.conf:

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

Luego, para la configuración de la cárcel:

$ 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

Tendré una publicación en el blog durante la próxima semana.

Solo quería continuar con una actualización que hice mientras ejecutaba 12.1-RELEASE-p7 después de leer esto:

"También significa que cuando un demonio encarcelado se conecta a un puerto en la" dirección de bucle de retorno ", en realidad se conecta a la dirección IP externa de la cárcel".
Lucas, Michael W. FreeBSD Mastery: Jails (IT Mastery Book 15)

La configuración de LOIP4 en poudriere.conf en el ip4_addr de la cárcel permitió que ruby ​​se compilara.

En mi caso:
# iocage get ip4_addr poudriere
lo1 | 192.168.10.100

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

¿Fue útil esta página
0 / 5 - 0 calificaciones