1 # This file implements common functions for all boot methods
8 # grab and set a configuration variable
9 # $1 = variable, [ $2 = default .. error otherwise ]
11 eval $1="$(sed "/^$1=.*/{s|^$1=||;b};d" $CONFIG)"
12 [ -z "$(eval echo "\$$1")" ] || return 0
13 [ $# -lt 2 ] && die "Missing $1=... in $CONFIG"
18 # Install a default $1/etc/network/interfaces on the subhost root $1
20 [ -r $1/etc/network/interfaces ] && return 0
21 mkdir -p $1/etc/network
22 cat <<EOF >> $1/etc/network/interfaces
23 # Generated for $NAME subhost
25 iface lo inet loopback
27 for IF in $(ip netns exec $NAME ip link show | grep "^eth") ; do
28 cat <<EOF >> $1/etc/network/interfaces
31 iface eth$i inet manual
36 # Setup the network namespace for the given $CABLES
37 # $1=netns ( $2="br=mac" .. )
39 local NETNS BR IF MAC C i ADD
46 [ -z "$MAC" ] || MAC="address $MAC"
47 ip link add $IF type veth peer name eth$i $MAC netns $NETNS
50 if [ -z "$BR" ] ; then
60 # (name live system root work)
61 # Set up an overlay fmr $name on $live, with a new tmpfs on its /run,
62 # and "install" a "reaper" as the upcoming pid 1
64 local LIVE="$2" LOWER="$3" UPPER="$4" ROOT
66 if grep -q "$1 $2" /proc/mounts ; then
67 die "$1 is already mounted"
70 if [ -f "${UPPER%% *}" ] ; then
71 if [ -x "${UPPER%% *}" ] ; then
72 echo "${UPPER%% *} appears to be executable" >&2
73 # Giving a program/script as UPPER= asks for running this
74 # first, to make a root filesystem available. The script takes
75 # ACTION "setup" and "teardown", and on "setup" it must tell
76 # where the ROOT is set up.
77 ROOT="$(env ACTION=setup $UPPER)"
78 if [ ! -d "$ROOT" ] ; then
80 die "root setup failed: $UPPER"
83 ## Now falling down to "normal overlay" setup
85 die "${UPPER%% *} (root setup program/script) is not executable"
89 # LIVE is the same as LOWER then skip the overlay; just assume
90 # a proper chroot system exists at LIVE.
91 if [ "$LIVE" != "$LOWER" ] ; then
94 mount -t tmpfs -osize=100M tmpfs "$UPPER/run"
95 mkdir -p "$UPPER/run/lock"
98 mount -t tmpfs -osize=100M tmpfs "$UPPER/dev"
99 mknod -m 622 "$UPPER/dev/console" c 5 1
100 mknod -m 666 "$UPPER/dev/null" c 1 3
101 mknod -m 666 "$UPPER/dev/zero" c 1 5
102 mknod -m 666 "$UPPER/dev/ptmx" c 5 2
103 mknod -m 666 "$UPPER/dev/tty" c 5 0
104 mknod -m 444 "$UPPER/dev/random" c 1 8
105 mknod -m 444 "$UPPER/dev/urandom" c 1 9
106 chown root:tty "$UPPER/dev/console"
107 chown root:tty "$UPPER/dev/ptmx"
108 chown root:tty "$UPPER/dev/tty"
109 ln -sTf /proc/self/fd "$UPPER/dev/fd"
110 ln -sTf /proc/self/fd/0 "$UPPER/dev/stdin"
111 ln -sTf /proc/self/fd/1 "$UPPER/dev/stdout"
112 ln -sTf /proc/self/fd/2 "$UPPER/dev/stderr"
113 ln -sTf /proc/kcore "$UPPER/dev/core"
114 mkdir "$UPPER/dev/shm"
115 mkdir "$UPPER/dev/pts"
116 chmod 1777 "$UPPER/dev/shm"
118 # all good so far ; now avoid using the host's networking setup
119 setup_networking "$UPPER"
121 OLY="-olowerdir=$3,upperdir=$UPPER,workdir=$5"
122 if ! mount -t overlay "$OLY" $1 $2 ; then
123 umount -R "$UPPER/dev"
125 die "Cannot set up the overlay mount $2"
129 echo "Installing $OVERLAYDIR/reaper to $LIVE/.reaper"
130 cp -p $OVERLAYDIR/reaper $LIVE/.reaper
139 # find the upperdir option for an overlay mount line
141 sed 's/.*upperdir=\([^,]*\).*/\1/'
144 # Check if $1 is "live" and echo the
145 # unshare and reaper process pids
148 local USPID="$(pgrep -f "unshare.* $NAME ")"
149 [ -z "$USPID" ] && return 1
150 echo $USPID $(pgrep -f ".reaper $NAME")
154 for C in $(pgrep -a overlay-boot | awk '{print $4}') ; do
155 eval NAME="$(sed "/^NAME=.*/{s|^NAME=||;b};d" $C)"
156 [ -z "$NAME" ] && NAME=$(basename $C .conf)