Poudriere: 12- إسطبل يعمل داخل السجن

تم إنشاؤها على ١٠ ديسمبر ٢٠١٨  ·  17تعليقات  ·  مصدر: freebsd/poudriere

أواجه مشكلة في تشغيل 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 مستقرًا؟

Base Issue

التعليق الأكثر فائدة

لقد تمكنت من الحصول على إعداد عمل مرة أخرى ، باستخدام VIMAGE و vnet jail. إذا كان من الممكن إجراء إعداد IP المشترك "الكلاسيكي" للعمل ، أود أن أعرف كيف.

ال 17 كومينتر

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 خارجيًا.

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

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

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات