15 echo "pipework <bridge> <guest-id> <ipaddr>/<subnet> <broadcast> <gateway> <mac> <guestname> [vlan tag]"
19 # Step 1: Find the guest (for now, we only support LXC containers)
20 while read dev mnt fstype options dump fsck
22 [ "$fstype" != "cgroup" ] && continue
23 echo $options | grep -qw devices || continue
28 echo "Could not locate cgroup mount point."
32 N=$(find "$CGROUPMNT" -name "$GUEST_ID*" | wc -l)
35 echo "Could not find any container matching $GUEST_ID"
42 echo "Found more than one container matching $GUEST_ID"
47 NSPID=$(head -n 1 $(find "$CGROUPMNT" -name "$GUEST_ID*" | head -n 1)/tasks)
49 echo "Could not find a process inside container $GUEST_ID"
53 # Step 2: Prepare the working directory
54 sudo mkdir -p /var/run/netns
55 sudo rm -f /var/run/netns/$NSPID
56 sudo ln -s /proc/$NSPID/ns/net /var/run/netns/$NSPID
58 # Step 3: Creating virtual interfaces
59 LOCAL_IFNAME=vethl-$GUESTNAME #$NSPID
60 GUEST_IFNAME=vethg-$GUESTNAME #$NSPID
61 sudo ip link add name $LOCAL_IFNAME type veth peer name $GUEST_IFNAME
62 sudo ip link set $LOCAL_IFNAME up
64 # Step 4: Adding the virtual interface to the bridge
65 sudo ip link set $GUEST_IFNAME netns $NSPID
68 sudo ovs-vsctl add-port $BRIDGE $LOCAL_IFNAME tag=$VLANTAG
71 sudo ovs-vsctl add-port $BRIDGE $LOCAL_IFNAME
75 # Step 5: Configure networking within the container
76 sudo ip netns exec $NSPID ip link set $GUEST_IFNAME name eth0
77 sudo ip netns exec $NSPID ip addr add $IPADDR broadcast $BROADCAST dev eth0
78 sudo ip netns exec $NSPID ifconfig eth0 hw ether $MAC
79 sudo ip netns exec $NSPID ip addr add 127.0.0.1 dev lo
80 sudo ip netns exec $NSPID ip link set eth0 up
81 sudo ip netns exec $NSPID ip link set lo up
82 sudo ip netns exec $NSPID ip route add default via $GWADDR