Ohledně kombinace "network namespace + macvlan", mám-li být konkrétnější, nedávno jsem potřeboval cosi otestovat, a nasimulovat větší počet klientských instancí jednoho... "programu", který se nerad spouští opakovaně na tomtéž fyzickém síťovém rozhraní. Takže jsem ho potřeboval zavřít na jeho vlastní "lehce virtuální" pískoviště. Přitom ale aby všechny ty instance jely ven do světa přes totéž fyzické rozhraní. Prostě takový generátor specifického bordelu na síti, proti testované "servisce". Velice mi pomohl
článek Dana Ohnesorga tady na rootu.
Níže se pokusím přiložit výpisy dvou skriptů + malého sdíleného konfiguráku.
Soubor
cfg.sh :
IPNET_BASE="192.168.4."
IPNET_SLASH="24"
IP_ADDR_BASE="20"
PHYNET=eth1
COUNT=20
Soubor
start.sh :
#!/bin/bash
. cfg.sh
echo Bringing up interface $PHYNET
ip link set dev $PHYNET up
for (( idx = 0; idx<$COUNT; idx++)) do
IP_ADDR_LAST_BYTE=$(($IP_ADDR_BASE + $idx))
IP_ADDR="${IPNET_BASE}${IP_ADDR_LAST_BYTE}"
CFGFILE=my_program${idx}.conf
NAMESPACE=mycustomns$idx
NETIF=macvlan$idx
echo Adding $NAMESPACE $NETIF $IP_ADDR $CFGFILE
ip link add $NETIF link $PHYNET type macvlan mode private
ip netns add $NAMESPACE
ip link set $NETIF netns $NAMESPACE
ip netns exec $NAMESPACE ip addr add dev $NETIF $IP_ADDR/$IPNET_SLASH
# "netif up" must be done *after* the netif gets assigned to a namespace
ip netns exec $NAMESPACE ip link set $NETIF up
# Note: it takes a moment for the interface to transition from NO-CARRIER to LOWER_UP
#ip netns exec $NAMESPACE ip link show $NETIF
ip netns exec $NAMESPACE ip addr show $NETIF
# Create a per-instance config file
cp master.conf $CFGFILE
echo "something or another" >> $CFGFILE
echo "Starting instance $idx of my_program in the background"
nohup ip netns exec $NAMESPACE my_program -c $CFGFILE > nohup${idx}.out &
done
Soubor
stop.sh :
#!/bin/bash
. cfg.sh
killall my_program
for (( idx = 0; idx<$COUNT; idx++)) do
IP_ADDR_LAST_BYTE=$(($IP_ADDR_BASE + $idx))
IP_ADDR="${IPNET_BASE}${IP_ADDR_LAST_BYTE}"
CFGFILE=my_program${idx}.conf
NAMESPACE=mycustomns$idx
NETIF=macvlan$idx
echo Removing $NAMESPACE $NETIF $IP_ADDR $CFGFILE
ip netns exec $NAMESPACE ip addr delete dev $NETIF $IP_ADDR/$IPNET_SLASH
ip netns exec $NAMESPACE ip link delete $NETIF
ip netns delete $NAMESPACE
rm $CFGFILE
#echo leaving nohup${idx}.out in place for your reference
rm nohup${idx}.out
done
echo Shutting down interface $PHYNET
ip link set dev $PHYNET down
Pro jistotu nechci být konkrétní, co to bylo zač - takže ten skript je následně maličko upravený, bez finálního otestování.
Každé virtuální macvlan rozhraní dostane nějakou vygenerovanou MAC adresu. Popravdě jsem je nezkoumal, takže nevím, jak vlastně vypadají. Ani jsem je nezkoušel nastavit natvrdo. Asi bych zkusil
něco jakoip nents exec $NAMESPACE ip link set $NETIF address 02:01:b0:0b:13:55
...a následně zkontrolovat pomocí
ip nents exec $NAMESPACE ip link show $NETIF
To je jenom taková malá ochutnávka, jak zabydlet namespace - buď jednotlivě, nebo taky hromadně větším počtem instancí téhož softíku.