2 # Copyright (C) 2006 Sam Vilain <sam.vilain@catalyst.net.nz>
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation; version 2 of the License.
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
13 # You should have received a copy of the GNU General Public License
14 # along with this program; if not, write to the Free Software
15 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17 tmp=$(getopt -o '+d:f:n:a' --long debug,pkgmgmt -n "$0" -- "$@") || exit 1
20 . "$_LIB_VSERVER_BUILD_FUNCTIONS_PKGMGMT"
21 . "$__PKGLIBDIR/vserver.functions"
26 FAI_NFSROOT=/usr/lib/fai/nfsroot
27 FAI_DIR=/usr/local/share/fai
32 -f) FAI_VSERVER=$2; shift; ;;
33 -n) FAI_NFSROOT=$2; shift; ;;
34 -d) FAI_DIR=$2; shift; ;;
36 --debug) DEBUG=1; SH_DEBUG=-x; set -x;;
38 *) echo "vserver-build.fai: internal error: unrecognized option '$1'" >&2
48 base.initFilesystem "$OPTION_FORCE"
50 setup_writeOption "$VSERVER_NAME"
51 setup_writeInitialFstab
53 test -z "$BUILD_INITPRE" || "$BUILD_INITPRE" "$SETUP_CONFDIR" "$UTIL_VSERVER_VARS"
55 # migrate is a 2.6 feature, we need 2.6 for the secure_mount ccap
56 if ! $_VSERVER_INFO - FEATURE migrate; then
58 The fai build method requires kernel features that are not present
62 # if they specified a vserver where FAI is installed, then prefix its
63 # root to the FAI_NFSROOT etc (unless they have already specified a
64 # $ROOTDIR-relative path)
65 REAL_ROOTDIR=`getPhysicalDir "$ROOTDIR"`
66 REAL_VDIR=`getPhysicalDir "$VDIR"`
67 echo $"ROOTDIR is $REAL_ROOTDIR"
68 echo $"VDIR is $REAL_VDIR"
69 if [ -n "$FAI_VSERVER" ]
71 echo "FAI_VSERVER is $FAI_VSERVER"
72 if [ `expr "$FAI_NFSROOT" : "$REAL_ROOTDIR"` -eq 0 ]
74 FAI_NFSROOT="$REAL_ROOTDIR/$FAI_VSERVER$FAI_NFSROOT"
76 if [ `expr "$FAI_DIR" : "$REAL_ROOTDIR"` -eq 0 ]
78 FAI_DIR="$REAL_ROOTDIR/$FAI_VSERVER$FAI_DIR"
81 echo $"FAI_NFSROOT is $FAI_NFSROOT"
82 echo $"FAI_DIR is $FAI_DIR"
85 if [ ! -e "$FAI_NFSROOT/usr/sbin/fai" ]
87 panic $"NFSROOT not found - did you run fai-setup?"
90 if ! grep -qw VIRTUAL "$FAI_NFSROOT/usr/sbin/fai"
93 *** Looks like you don't have the patched FAI.
94 *** get it from svn://svn.debian.org/svn/fai/people/mugwump/vserver"
99 # suppresses color logo, as it does not leave the terminal in a nice
103 # set up interfaces, so that the vserver can be built with restricted
105 generateOptions "$SETUP_CONFDIR"
106 enableInterfaces "$SETUP_CONFDIR"
108 # last chance to abort!
111 echo -n "Press ENTER to begin, or Ctrl+C to cancel: "
117 S_CONTEXT=$($_CAT "$SETUP_CONFDIR"/run 2>/dev/null)
118 if [ $? -eq 0 -a -d "/proc/virtual/$S_CONTEXT" ]
120 $_VKILL -c "$S_CONTEXT" -s 15
122 $_VKILL -c "$S_CONTEXT" -s 9
125 disableInterfaces "$SETUP_CONFDIR"
128 trap killprocs INT EXIT
130 rwpaths="/var/lock /var/log /dev /var/run /etc/sysconfig"
131 [ -d "$FAI_NFSROOT/etc/network/run" ] && rwpaths="$rwpaths /etc/network/run"
133 export VDIR ROOTDIR FAI_VSERVER FAI_DIR FAI_NFSROOT FAI_ROOT console
135 [ -z "$AUTO" ] && FINAL_SHELL="exec /bin/sh -i"
137 # set up /mnt with all the mounts required
138 $_SECURE_MOUNT -n -o ro --bind "$FAI_NFSROOT" /mnt
139 $_SECURE_MOUNT -n -t tmpfs -o size=64m,mode=1777 vm /mnt/tmp
140 $_MKDIR -p /mnt/tmp/target
141 $_SECURE_MOUNT -n --bind "$VDIR" /mnt/tmp/target
142 $_MKDIR -p /mnt/tmp/target/proc
143 $_SECURE_MOUNT -n -t proc proc /mnt/tmp/target/proc
146 /mnt/usr/lib/fai/mkrw -n "/mnt$x"
148 $_SECURE_MOUNT -n -o ro --bind "$FAI_DIR" /mnt/fai
149 $_SECURE_MOUNT -n -t proc proc /mnt/proc
152 $_CHBIND "${CHBIND_OPTS[@]}" \
153 $_VCONTEXT --create "${OPTS_VCONTEXT_CREATE[@]}" -- \
154 $_VUNAME --xid self --set -t nodename="${SETUP_HOSTNAME:-fai-build}" \
155 -t context="$SETUP_CONFDIR" -- \
156 $_VATTRIBUTE --set --xid self "${OPTS_VATTRIBUTE[@]}" --ccap secure_mount \
157 $_SAVE_CTXINFO "$SETUP_CONFDIR" \
158 $_VCONTEXT --migrate-self --endsetup --chroot $SILENT_OPT \
159 "${OPTS_VCONTEXT_MIGRATE[@]}" "${OPTS_VCONTEXT_ENTER[@]}" -- \
160 /bin/sh -c "/bin/sh $SH_DEBUG /etc/init.d/rcS -N vschild_build; $FINAL_SHELL"
162 test -z "$BUILD_INITPOST" || "$BUILD_INITPOST" "$SETUP_CONFDIR" "$UTIL_VSERVER_VARS"