Poudriere: 12-stabil, berjalan di dalam penjara

Dibuat pada 10 Des 2018  ·  17Komentar  ·  Sumber: freebsd/poudriere

Saya mengalami kesulitan menjalankan poudriere di dalam penjara sejak memutakhirkan ke 12-stable beberapa hari yang lalu. Tanpa perubahan apa pun pada konfigurasi saya, saya sekarang mendapatkan jail: IPv4 addresses clash saat jail builder poudriere dimulai selama 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

Saya telah mengutak-atik LOIP4 dan LOIP6 dan konfigurasi IP penjara luar tetapi tidak berhasil.

Memeriksa kode di common.sh , tampaknya poudriere mencoba menentukan IP mana yang akan diteruskan ke pemanggilan jail start, yaitu, ip4.addr dan ip6.addr . Saya telah menyetel ulang localipargs ke string kosong (tepat setelah blok case $IPS di sekitar baris 7734), yang membuat bangunan saya berfungsi dengan benar lagi.

Apakah ini potensi ketidakcocokan dengan 12-stabil?

Base Issue

Komentar yang paling membantu

Saya telah berhasil mendapatkan pengaturan yang berfungsi lagi, dengan menggunakan VIMAGE dan vnet jail. Jika pengaturan IP bersama "klasik" dapat dibuat berfungsi, saya ingin mendengar caranya.

Semua 17 komentar

Sial, bahkan dengan tambalan itu, Python dan Ruby gagal dibangun.

ular piton:

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

Rubi:

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

Saya telah berhasil mendapatkan pengaturan yang berfungsi lagi, dengan menggunakan VIMAGE dan vnet jail. Jika pengaturan IP bersama "klasik" dapat dibuat berfungsi, saya ingin mendengar caranya.

Membangun ruby ​​​​di dalam penjara 12.0-RELEASE-p2 masih gagal.
Membangun ruby ​​​​di dalam penjara 11.2-RELEASE-p8 berfungsi.
Ada wawasan?

Terlampir adalah log build:
ruby-2.5.3_1,1.log

@stblassitude Apa yang harus Anda modifikasi untuk membuatnya berfungsi? Khususnya di mana opsi vnet diperlukan? Di penjara Poudriere ada di dalam atau di penjara yang dibuat Poudriere?

Saya pikir solusinya adalah dengan mengatur alamat loopback yang unik:

LOIP4=127.0.0.2
LOIP6=::2

@bdrewery , menggunakan pengaturan yang Anda sarankan menghasilkan peringatan dan kesalahan yang sama:
(juga mencoba LOIP4="127.0.2/32"). Sepertinya LOIP4 diabaikan. Haruskah itu diatur di tempat lain?
Menyetel loopback dari penjara poudriere secara eksternal juga gagal.

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

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

[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 , menggunakan pengaturan yang Anda sarankan menghasilkan peringatan dan kesalahan yang sama:
(juga mencoba LOIP4="127.0.2/32"). Sepertinya LOIP4 diabaikan. Haruskah itu diatur di tempat lain?

Itu karena kode ini di 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                                                                       

Coba hapus itu untuk saat ini. Ini mencoba memastikan penjara saat ini memiliki IP yang Anda coba tetapkan ke penjara bersarang. (Regresi yang dimaksud.)

Saat mengomentari itu, berikut ini ditampilkan dan tidak ada bangunan yang dilanjutkan:

jail: jail_set: Operation not permitted

Sekadar konfirmasi, saya menjalankan Poudriere di dalam penjara iocage pada host yang menjalankan 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       |

Kompilasi ruby ​​​​gagal untuk penjara yang tercantum di bawah ini:

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 Apa yang harus Anda modifikasi untuk membuatnya berfungsi? Khususnya di mana opsi vnet diperlukan? Di penjara Poudriere ada di dalam atau di penjara yang dibuat Poudriere?

Ini 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;
}

Skrip pembantu melakukan ini:

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

Di dalam pkg jail, saya menggunakan 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

Kumpulan data ZFS terlihat seperti ini di dalam penjara:

$ 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

Saya yakin saya juga mengalami masalah ini, tetapi karena saya mencobanya untuk pertama kalinya pada 12, saya tidak berpikir itu terkait dengan peningkatan 12. Hanya melihat untuk melihat solusi apa yang Anda semua dapatkan di sini.

Saya menemukan test case, build lang/python27 atau lang/python3 dengan opsi IPv6 dan dual stack jail.

Jika poudriere jail ekspor jail.conf
ip4=inherit; ip6=inherit;
membangun kesuksesan

jika mengekspor alamat ip4.addr dan ip6.addr build gagal saat mengkonfigurasi
checking for getaddrinfo... yes checking getaddrinfo bug... yes Fatal: You must get working getaddrinfo() function. or you can specify "--disable-ipv6".
nonaktifkan opsi perbaikan IPv6 build.

Rupanya ada kesalahan di suatu tempat di set lo untuk IPv6 ini sekarang (::1/128) bukan /8

Menariknya, perbedaannya bukanlah pekerja interaktif.
Jika menggunakan konfigurasi bulk -i auto build gagal, build tangan di jail ini berhasil
make -C /usr/ports/lang/python27/ .... checking for getaddrinfo... yes checking getaddrinfo bug... no checking for getnameinfo... (cached) yes .... creating Makefile ....

RESTRICT_NETWORKING=no perbaiki masalah ini, mungkin tambahkan NO_RESTRICT_NETWORKING_PACKAGES="python27 ..." serupa ALLOW_NETWORKING_PACKAGES ?

Saya telah berhasil mendapatkan pengaturan yang berfungsi lagi, dengan menggunakan VIMAGE dan vnet jail. Jika pengaturan IP bersama "klasik" dapat dibuat berfungsi, saya ingin mendengar caranya.

Berdasarkan komentar di atas, saya juga menggunakan solusi vnet . Bekerja untuk saya. Terima kasih.

@stblassitude Apa yang harus Anda modifikasi untuk membuatnya berfungsi? Khususnya di mana opsi vnet diperlukan? Di penjara Poudriere ada di dalam atau di penjara yang dibuat Poudriere?

Itu dalam konfigurasi untuk penjara poudriere. Saya melakukan ini.

Untuk /etc/rc.conf:

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

Kemudian untuk konfigurasi jailnya:

$ 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

Saya akan memiliki posting blog di minggu depan atau lebih.

Hanya ingin menindaklanjuti dengan pembaruan yang saya buat saat menjalankan 12.1-RELEASE-p7 setelah membaca ini:

"Ini juga berarti bahwa ketika daemon yang dipenjara menempel ke port pada "alamat loopback", itu sebenarnya melampirkan ke alamat IP eksternal penjara."
Lucas, Michael W. Penguasaan FreeBSD: Penjara (Buku Penguasaan IT 15)

Menyetel LOIP4 di poudriere.conf ke ip4_addr jail memungkinkan ruby ​​untuk dikompilasi.

Dalam hal ini:
# iocage dapatkan ip4_addr poudriere
lo1|192.168.10.100

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

Apakah halaman ini membantu?
0 / 5 - 0 peringkat