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?
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.
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
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.