Archiv für den Monat: Mai 2014

FreeBSD 10: robuster Betrieb von VIMAGE Jails

WARNING: VIMAGE (virtualized network stack) is a highly experimental feature.

Zurecht, denn VIMAGE ist wirklich eine wackelige Angelegenheit!

Auf einer Maschine laufen 22 Jails, mit … Squid, Samba4, Minidlna, etlichen Apachen, DHCP (pri/sec. sync), DistCC, einigen MySQLs/PostgreSQLs sowie NFS/iSCSI Exports direkt vom Host und bissl mehr … zusätzlich werden noch einige TUN devs ins vnet verschoben …

Der gestrige HOST Reboot entpuppte sich zum waren Jail Spießrutenlauf, mal gab es ein Kernel Stack Fault (ifconfig) beim starten der ersten Jail, dann ab der 14ten, dann wieder ab der dritten … usw.

Die Kiste wollte einfach nicht mehr sauber hochkommen …

Der Übeltäter liegt in diesem Jail Config-Abschnitt:

$
export jail_haproxy_exec_prestart0="ifconfig epair19 create up"
export jail_haproxy_exec_prestart1="ifconfig vswitch0 addm epair19a"
export jail_haproxy_exec_poststart0="ifconfig epair19b vnet haproxy"
$

Von der Erstellung des epairs, über das koppeln an das Bridge-Interface, bis zur Einbindung ins vnet scheint es ein Race Condition Fuckup zu geben …

Mit einer Glückssträhne, in diesem Russischen Roulett, booten die Jails durch, doch darauf sollte man sich nicht verlassen …

vermutlich genügt eine künstliche Verzögerung im prestart zwischen 0/1 sowie 1/2 mit sleep 1

Das ganze kann man jedoch umgehen, indem man direkt beim Booten alle gewünschten epairs präventiv erstellen lässt, dazu später mehr (siehe unten)

Jedoch zunächst einmal die Kernel Module die funktionieren, jene die parallel ihr Dasein fristen können (ohne jedoch aktiv benutzt zu werden) und jene die absolutes Tabu in Kombination mit VIMAGE sind:

— — —> !!! Tabu sind !!! <--- --- --- [bash]$ ---> device pf ---> device pflog ---> device pfsync ---> options ALTQ ---> options KTR_ALQ ---> options ALTQ_CBQ ---> options ALTQ_RED ---> options ALTQ_RIO ---> options ALTQ_HFSC ---> options ALTQ_CDNR ---> options ALTQ_PRIQ ---> options ALTQ_NOPCC $[/bash] --- --- ---> integrierte Kernel-Module die nicht verwendet werden sollten <--- --- --- [bash]$ --> options DUMMYNET --> options HZ=1000 --> options ROUTETABLES --> options MROUTING --> options SCTP* $[/bash] *ab FreeBSD 10 stört SCTP auch nicht mehr --- --- ---> Kernelfeatures die verwendet werden können <--- --- --- [bash]$ -> options IPFIREWALL -> options IPFIREWALL_VERBOSE -> options IPFIREWALL_VERBOSE_LIMIT=5 -> options IPFIREWALL_DEFAULT_TO_ACCEPT -> options IPDIVERT -> device tap -> options RACCT -> options RCTL -> device carp $[/bash] FreeBSD Beastie Config Anpassungen

Punkt 1: mehr Kapazitäten auf dem HOST ermöglichen

$
vi /boot/loader.conf

### more powa // ###
kern.maxfiles="512000"
kern.maxproc="124000"
kern.maxprocperuid="48000"
### // more powa ###
$

Punkt 2: ein Jail-RCTL könnte dann wie folgt aussehen

$
vi /etc/rctl.conf

### RACCT/RCTL // ###
jail:haproxy:pseudoterminals:log=8   
jail:haproxy:pseudoterminals:deny=10
jail:haproxy:pcpu:deny=33/jail 
jail:haproxy:maxproc:log=9000
jail:haproxy:maxproc:deny=10000
### // RACCT/RCTL ###
$

Punkt 3: /etc/rc.conf lagg0 Beispiel

$
vi /etc/rc.conf

### LACP - VIMAGE // ###
ifconfig_em0="up"
ifconfig_em1="up"
cloned_interfaces="bridge0 lagg0 tap0 tun0"
ifconfig_lagg0="laggproto lacp laggport em0 laggport em1 192.168.125.48/24"
defaultrouter="192.168.125.93"

ifconfig_lagg0_ipv6="inet6 accept_rtadv"
ip6addrctl_policy="ipv6_prefer"
ifconfig_lagg0_alias0="inet6 2001:xxxx:xxxx:xxxx::125:48 prefixlen 64"

ifconfig_tap0="up"
ifconfig_tun0="up"
ifconfig_bridge0_name="vswitch0"
ifconfig_vswitch0="addm lagg0 stp lagg0 addm tap0"
### // LACP - VIMAGE ###
$

Punkt 4: /etc/rc.conf – default ezjail deaktivieren

$
vi /etc/rc.conf

### ezjail // ###
ezjail_enable="NO"
jail_parameters="vnet=new"
### // ezjail ###
$

Punkt 5: zentral spielt sich jetzt alles in der /etc/rc.local ab

$
vi /etc/rc.local

/bin/echo ""
/bin/echo "--- --- ---> rctl // <--- --- ---"
/bin/echo ""
(
### RACCT/RCTL // ###
/usr/sbin/service rctl stop
### // RACCT/RCTL ###
)
/bin/echo ""
/bin/echo "--- --- ---> // rctl <--- --- ---"
/bin/echo ""

/bin/echo ""
/bin/echo "--- --- ---> VIMAGE // <--- --- ---"
/bin/echo ""
(
/sbin/ifconfig epair18 create up
/sbin/ifconfig epair19 create up
/sbin/ifconfig epair20 create up
/bin/sleep 1
/sbin/ifconfig tun8 create up
/sbin/ifconfig tun9 create up
/sbin/ifconfig tun10 create up
/bin/sleep 1
/sbin/ifconfig vswitch0 addm epair18a addm epair19a addm epair20a
)
/bin/echo ""
/bin/echo "--- --- ---> // VIMAGE <--- --- ---"
/bin/echo ""

/bin/echo "--- --- ---> ezjail // <--- --- ---"
(
/bin/echo "--- --- --->"
/bin/echo ""
/usr/local/bin/ezjail-admin onestart dnscache
/bin/sleep 10
/bin/echo "--- --- --->"
/bin/echo ""
/usr/local/bin/ezjail-admin onestart haproxy
/bin/sleep 10
/bin/echo "--- --- --->"
/bin/echo ""
/usr/local/bin/ezjail-admin onestart dhcp
/bin/sleep 10
/bin/echo "--- --- --->"
)
/bin/echo "--- --- ---> // ezjail <--- --- ---"

/bin/echo ""
/bin/echo "--- --- ---> rctl // <--- --- ---"
/bin/echo ""
(
### RACCT/RCTL // ###
/usr/sbin/service rctl start
### // RACCT/RCTL ###
)
/bin/echo ""
/bin/echo "--- --- ---> // rctl <--- --- ---"
/bin/echo ""
$

Punkt 6: Beispiel ezjail Config

$
vi /usr/local/etc/ezjail/haproxy

### EZJAIL CONFIG // ###
export jail_haproxy_hostname="haproxy.domain.tld"
#export jail_haproxy_ip="0.0.0.0"
export jail_haproxy_rootdir="/usr/jails/haproxy"
export jail_haproxy_exec_start="/bin/sh /etc/rc"
export jail_haproxy_exec_stop="/bin/sh /etc/rc.shutdown"
export jail_haproxy_mount_enable="YES"
export jail_haproxy_devfs_enable="YES"
export jail_haproxy_devfs_ruleset="22"
export jail_haproxy_procfs_enable="YES"
export jail_haproxy_fdescfs_enable="YES"
export jail_haproxy_image=""
export jail_haproxy_imagetype="zfs"
export jail_haproxy_attachparams=""
export jail_haproxy_attachblocking=""
export jail_haproxy_forceblocking=""
export jail_haproxy_zfs_datasets=""
export jail_haproxy_cpuset=""
export jail_haproxy_fib=""
export jail_haproxy_parentzfs="zroot/ezjail"
export jail_haproxy_parameters="allow.raw_sockets=1 allow.sysvipc=1"
export jail_haproxy_post_start_script=""

#export jail_haproxy_exec_prestart0="ifconfig epair19 create up"
#export jail_haproxy_exec_prestart1="ifconfig vswitch0 addm epair19a"
export jail_haproxy_exec_poststart0="ifconfig epair19b vnet haproxy; sleep 1; (echo 'JAIL: haproxy booting' | logger)"
export jail_haproxy_exec_poststart1="jexec haproxy /sbin/ifconfig epair19b 192.168.249.88/24"
export jail_haproxy_exec_poststart2="jexec haproxy /sbin/route add default 192.168.249.233"
export jail_haproxy_exec_poststart3="jexec haproxy /sbin/ifconfig epair19b inet6 2001:xxxx:xxxx:xxxx::249:88 prefixlen 64"
export jail_haproxy_exec_poststart4="jexec haproxy /sbin/route add -inet6 default fe80::yyyy:yyyy:yyyy:1dac%epair19b"
#export jail_haproxy_exec_poststop0="ifconfig vswitch0 deletem epair19a"
#export jail_haproxy_exec_poststop1="ifconfig epair19a destroy"

#export jail_haproxy_exec_prestart2="ifconfig tun9 create up"
export jail_haproxy_exec_poststart5="ifconfig tun9 vnet haproxy"
#export jail_haproxy_exec_poststop2="ifconfig tun9 destroy"
### // EZJAIL CONFIG ###
$

… TUN-Devices lassen sich nicht immer sauber „destroyn“ …

Ergänzungen

31.05.2015
Wer gerne die Interfaces direkt mit der /etc/rc.conf erstellen möchte kann sich folgendes Beispiel anschauen:

$
vi /etc/rc.conf

cloned_interfaces="bridge0 lagg0 tap0 tun0 tun1 tun2 tun3 tun4 tun5 epair1 epair2 epair3 epair4 epair5"
ifconfig_tap0="up"
ifconfig_tun0="up"
ifconfig_tun1="up"
ifconfig_tun2="up"
ifconfig_tun3="up"
ifconfig_tun4="up"
ifconfig_tun5="up"
#
ifconfig_epair1a="up"
ifconfig_epair2a="up"
ifconfig_epair3a="up"
ifconfig_epair4a="up"
ifconfig_epair5a="up"
#
ifconfig_bridge0_name="vswitch0"
ifconfig_vswitch0="addm lagg0 stp lagg0 addm tap0 addm epair1a addm epair2a addm epair3a addm epair4a addm epair5a"
$

That’s FreeBSD