: ${WORK=$TOP/work}
: ${MOUNT=$TOP/mnt}
: ${NSNAME=$NAME}
-: ${BRIDGES=homenet}
+: ${BRIDGES=lan_br}
: ${CONFIG=$TOP/config}
[ -e "$CONFIG" ] && . "$CONFIG"
# Create a simple overlay subhost without its own image file
create_subhost() {
mkdir -p $TARGET $MOUNT $UPPER $WORK
- [ -d "$OSROOT" ] || OSROOT=$SUBHOST/daedalus/root
+ [ -d "$OSROOT" ] || OSROOT=$SUBHOST/chimaera/base
[ -e $CONFIG ] || cat <<EOF > "$CONFIG"
# Subhost $NAME is an autogenerated overlay subhost with shared filesystem
OSROOT="$OSROOT"
EOF
}
-# generate a mac for given $1 (interface) using the last 5 characters
+# Generate a mac address for given arguments pass through 40-bit b2sum
+# and with 02: prefix.
macaddr() {
- local M="$(xxd -p <<< "${1:$(( ${#1} - 5)):5}")66666666"
- echo "0a:${M:0:2}:${M:2:2}:${M:4:2}:${M:6:2}:${M:8:2}"
+ local V="$(b2sum -l 40 <<< "$*" )"
+ V="$( sed 's/\(..\)/\1:/g' <<< "${V}aaaaaaaaaa")"
+ echo "02:${V:0:14}"
}
# setup the subhost network namespace and link up the host side
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
if is_mounted $TARGET ; then
mount -oremount $TARGET
else
- if [ -f "$IMAGE" ] ; then
- # The subhost has an image file with /root and /work in it
+ if [ -e "$IMAGE" ] ; then
+ # $IMAGE is either an image file or a link to a partition,
+ # with /root and /work in it.
is_mounted $MOUNT || mount $IMAGE $MOUNT || exit 1
UPPER=$MOUNT/root
WORK=$MOUNT/work
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
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 \
- "--root=$TARGET" $START
+ chroot $TARGET $START
;;
stop)
umount $TARGET
[ -e $IMAGE ] && umount $MOUNT
ip netns del $NSNAME
+ rmdir /sys/fs/cgroup/$NAME
;;
*)
usage