X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=control;h=304c93bd1400b6a310f17c8e90288d5594b3cc83;hb=HEAD;hp=f5831a267f8842a3d1090dece847d4d2501648c4;hpb=e0808ddd112116c36fc3fceb65bea8589dff5647;p=rrq%2Fsubhost.git diff --git a/control b/control index f5831a2..304c93b 100755 --- a/control +++ b/control @@ -47,17 +47,11 @@ BRIDGES="$BRIDGES" EOF } -# map a string into a hexadecimal number with 10-digits by folding the given string into 9-digit ascii-code numbers and adding them -hexfoldsum() { - local V - V="$(b2sum -l 40 <<< "$1" | sed 's/\(..\)/\1:/g')" - echo "02:${V:0:14}" -} - -# Generate a mac address for given interface by passing hostname, -# subhost name and interface through 40-bit b2sum and with 02: prefix. +# Generate a mac address for given arguments pass through 40-bit b2sum +# and with 02: prefix. macaddr() { - local V="$(b2sum -l 40 <<< "$(hostname)$NAME$1" | sed 's/\(..\)/\1:/g')" + local V="$(b2sum -l 40 <<< "$*" )" + V="$( sed 's/\(..\)/\1:/g' <<< "${V}aaaaaaaaaa")" echo "02:${V:0:14}" } @@ -66,9 +60,12 @@ setup_network() { E=0 ip netns add $NSNAME for BRIDGE in ${BRIDGES[@]} ; do - brctl show $BRIDGE >& /dev/null || brctl addbr $BRIDGE IF=$NAME$E - MAC=$(macaddr $IF) + B=( ${BRIDGE/:/ } ) + BRIDGE="${B[0]}" + MAC="${B[1]}" + [ -z "$MAC" ] && MAC="$(macaddr "$(hostname)" "$NAME" "$IF")" + brctl show $BRIDGE >& /dev/null || brctl addbr $BRIDGE ip link add $IF type veth peer name eth$E address $MAC netns $NSNAME ip link set $IF up [ -n "$BRIDGE" ] && brctl addif $BRIDGE $IF @@ -105,6 +102,26 @@ setup_rootfs() { fi } +# Set up cgroup CPU accounting (cpuacct) +accounting() { + # 1-- once, system wide + grep -q "/sys/fs/cgroup cgroup" /proc/mounts || \ + mount -t cgroup -ocpuacct none /sys/fs/cgroup + if [ -d /sys/fs/cgroup/$NAME ] ; then + : # reset? + else + mkdir /sys/fs/cgroup/$NAME + # the following fixes things that sometimes are broken? + for f in cpuset.mems cpuset.cpus ; do + [ -z "$(cat /sys/fs/cgroups/$NAME/$F)" ] && \ + echo 0 > /sys/fs/cgroups/$NAME/$F + done + + fi + # Register this task for subhost accounting + echo $$ > /sys/fs/cgroup/$NAME/tasks +} + case "$CMD" in start) [ -e "/run/netns/$NSNAME" ] || setup_network @@ -112,6 +129,7 @@ case "$CMD" in setup_rootfs START=/bin/bash [ -x $TARGET/startup ] && START=/startup + accounting exec ip netns exec $NSNAME unshare \ --fork --pid --mount-proc --kill-child \ --uts --ipc --mount --cgroup \ @@ -121,6 +139,7 @@ case "$CMD" in umount $TARGET [ -e $IMAGE ] && umount $MOUNT ip netns del $NSNAME + rmdir /sys/fs/cgroup/$NAME ;; *) usage