أواجه مشكلة في تشغيل poudriere داخل السجن منذ الترقية إلى 12 مستقرة قبل يومين. بدون أي تغييرات على التكوين الخاص بي ، أحصل الآن على jail: IPv4 addresses clash
بينما يتم بدء سجن poudriere builder أثناء الإنشاء:
# 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.addr
و ip6.addr
. لقد قمت بإعادة تعيين localipargs
إلى السلسلة الفارغة (مباشرة بعد كتلة case $IPS
عند السطر 7734 تقريبًا) ، مما يجعل تصميماتي تعمل بشكل صحيح مرة أخرى.
هل هذا تعارض محتمل مع 12 مستقرًا؟
Dang ، حتى مع هذا التصحيح ، فشل Python و Ruby في البناء.
بايثون:
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 و vnet jail. إذا كان من الممكن إجراء إعداد IP المشترك "الكلاسيكي" للعمل ، أود أن أعرف كيف.
بناء روبي داخل سجن 12.0-RELEASE-p2 لا يزال يفشل.
بناء روبي داخل سجن 11.2-RELEASE-p8.
أي بصيرة؟
مرفق سجل البناء:
روبي 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. هل يجب وضعها في مكان آخر؟
فشل أيضًا تعيين استرجاع سجن poudriere خارجيًا.
LOIP4 = 127.0.0.2
LOIP6 = :: 2
NO_ZFS = نعم
FREEBSD_HOST = ftp://ftp.freebsd.org
RESOLV_CONF = / etc / resolv.conf
BASEFS = / ص
USE_PORTLINT = لا
USE_TMPFS = لا
DISTFILES_CACHE = / usr / ports / distfiles
NOLINUX = نعم
ALLOW_MAKE_JOBS = نعم
[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. هل يجب وضعها في مكان آخر؟
إنه بسبب هذا الرمز المشترك. 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
فقط للتأكيد ، أقوم بتشغيل Poudriere داخل سجن iocage على مضيف يقوم بتشغيل 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 |
فشل تجميع الياقوت للسجون المدرجة أدناه:
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. مجرد إلقاء نظرة لمعرفة الحل الذي توصلتم إليه جميعًا هنا.
تم العثور على حالة اختبار ، وقم بإنشاء lang/python27
أو lang/python3
مع خيار IPv6 وسجن مكدس مزدوج.
إذا poudriere jail تصدير 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 إصلاح البناء.
يبدو أن هناك خطأ في مكان ما في set lo لـ IPv6 هذا الآن (:: 1/128) ليس / 8
ومن المثير للاهتمام أن الاختلاف ليس هو العامل التفاعلي.
إذا كان استخدام bulk -i
فشل تكوين الإنشاء التلقائي ، فالبناء اليدوي في نجاح هذا السجن
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 ..."
similar ALLOW_NETWORKING_PACKAGES
؟
لقد تمكنت من الحصول على إعداد عمل مرة أخرى ، باستخدام VIMAGE و vnet jail. إذا كان من الممكن إجراء إعداد IP المشترك "الكلاسيكي" للعمل ، أود أن أعرف كيف.
بناءً على التعليق أعلاه ، ذهبت أيضًا مع حل vnet
. عملت من أجلي. شكرا لك.
stblassitude ما الذي يجب عليك تعديله لجعله يعمل؟ أين يحتاج الخيار
vnet
وجه التحديد؟ في السجن Poudriere داخل أو في سجون Poudriere التي أنشأتها؟
إنه في التكوين لسجن بودرير. انا فعلت هذا.
من أجل /etc/rc.conf:
cloned_interfaces="bridge0"
ifconfig_bridge0="addm ix0 up"
ثم لتكوين السجن:
$ 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
سأحصل على مدونة في الأسبوع المقبل أو نحو ذلك.
أردت فقط المتابعة بتحديث قمت به أثناء تشغيل 12.1-RELEASE-p7 بعد قراءة هذا:
"هذا يعني أيضًا أنه عندما يتم إرفاق برنامج خفي مسجون بمنفذ على" عنوان الاسترجاع "، فإنه في الواقع يتم إرفاقه بعنوان IP الخارجي للسجن."
لوكاس ، مايكل دبليو. إتقان فري بي إس دي: السجون (كتاب إتقان تكنولوجيا المعلومات 15)
سمح ضبط LOIP4 في poudriere.conf على ip4_addr الخاص بالسجن لروبي بالتجميع.
في حالتي:
# iocage احصل على ip4_addr poudriere
lo1 | 192.168.10.100
# grep LOIP4 /usr/local/etc/poudriere.conf
LOIP4 = 192.168.10.100
التعليق الأكثر فائدة
لقد تمكنت من الحصول على إعداد عمل مرة أخرى ، باستخدام VIMAGE و vnet jail. إذا كان من الممكن إجراء إعداد IP المشترك "الكلاسيكي" للعمل ، أود أن أعرف كيف.