vserver-build.fai (5024B)
1 # 2 # Copyright (C) 2006 Sam Vilain <sam.vilain@catalyst.net.nz> 3 # 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. 7 # 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. 12 # 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. 16 17 tmp=$(getopt -o '+d:f:n:a' --long debug,pkgmgmt -n "$0" -- "$@") || exit 1 18 eval set -- "$tmp" 19 20 . "$_LIB_VSERVER_BUILD_FUNCTIONS_PKGMGMT" 21 . "$_LIB_VSERVER_FUNCTIONS" 22 23 DISTRIBUTION=: 24 25 FAI_VSERVER= 26 FAI_NFSROOT=/usr/lib/fai/nfsroot 27 FAI_DIR=/usr/local/share/fai 28 AUTO=1 29 30 use_pkgmgmt= 31 while true; do 32 case "$1" in 33 -f) FAI_VSERVER=$2; shift; ;; 34 -n) FAI_NFSROOT=$2; shift; ;; 35 -d) FAI_DIR=$2; shift; ;; 36 -a) AUTO=;; 37 --debug) DEBUG=1; SH_DEBUG=-x; set -x;; 38 --) shift; break ;; 39 *) echo "vserver-build.fai: internal error: unrecognized option '$1'" >&2 40 exit 1 41 ;; 42 esac 43 shift 44 done 45 46 getDistribution '' 1 47 48 base.init 49 base.initFilesystem "$OPTION_FORCE" 50 51 setup_writeOption "$VSERVER_NAME" 52 setup_writeInitialFstab 53 54 test -z "$BUILD_INITPRE" || "$BUILD_INITPRE" "$SETUP_CONFDIR" "$UTIL_VSERVER_VARS" 55 56 # migrate is a 2.6 feature, we need 2.6 for the secure_mount ccap 57 if ! $_VSERVER_INFO - FEATURE migrate; then 58 panic $"\ 59 The fai build method requires kernel features that are not present 60 in your kernel." 61 fi 62 63 # if they specified a vserver where FAI is installed, then prefix its 64 # root to the FAI_NFSROOT etc (unless they have already specified a 65 # $ROOTDIR-relative path) 66 REAL_ROOTDIR=`getPhysicalDir "$ROOTDIR"` 67 REAL_VDIR=`getPhysicalDir "$VDIR"` 68 echo $"ROOTDIR is $REAL_ROOTDIR" 69 echo $"VDIR is $REAL_VDIR" 70 if [ -n "$FAI_VSERVER" ] 71 then 72 echo "FAI_VSERVER is $FAI_VSERVER" 73 if [ `expr "$FAI_NFSROOT" : "$REAL_ROOTDIR"` -eq 0 ] 74 then 75 FAI_NFSROOT="$REAL_ROOTDIR/$FAI_VSERVER$FAI_NFSROOT" 76 fi 77 if [ `expr "$FAI_DIR" : "$REAL_ROOTDIR"` -eq 0 ] 78 then 79 FAI_DIR="$REAL_ROOTDIR/$FAI_VSERVER$FAI_DIR" 80 fi 81 fi 82 echo $"FAI_NFSROOT is $FAI_NFSROOT" 83 echo $"FAI_DIR is $FAI_DIR" 84 FAI_ROOT=/tmp/target 85 86 if [ ! -e "$FAI_NFSROOT/usr/sbin/fai" ] 87 then 88 panic $"NFSROOT not found - did you run fai-setup?" 89 fi 90 91 if ! grep -qw VIRTUAL "$FAI_NFSROOT/usr/sbin/fai" 92 then 93 panic $"\ 94 ERROR: Looks like you don't have the patched FAI. 95 See http://faiwiki.informatik.uni-koeln.de/index.php/Using_FAI_as_a_vserver_build_method 96 for information on where to get it." 97 fi 98 99 set -e 100 101 # suppresses color logo, as it does not leave the terminal in a nice 102 # state. 103 console=dummy 104 105 killprocs() { 106 set +e 107 S_CONTEXT= 108 if isVserverRunning "$SETUP_CONFDIR" S_CONTEXT 109 then 110 $_VKILL -c "$S_CONTEXT" -s 15 111 sleep 2 112 $_VKILL -c "$S_CONTEXT" -s 9 113 sleep 2 114 isVserverRunning "$SETUP_CONFDIR" && warning $"\ 115 Vserver '$VSERVER_NAME' still running unexpectedly; please investigate it 116 manually." 117 fi 118 [ -n "$HAVE_INTERFACES" ] && disableInterfaces "$SETUP_CONFDIR" 119 base.__cleanup 120 } 121 122 trap killprocs INT EXIT 123 124 # last chance to abort! 125 if [ -z "$AUTO" ] 126 then 127 echo -n "Press ENTER to begin, or Ctrl+C to cancel: " 128 read junk 129 fi 130 131 # set up interfaces, so that the vserver can be built with restricted 132 # network access. 133 generateOptions "$SETUP_CONFDIR" 134 enableInterfaces "$SETUP_CONFDIR" 135 HAVE_INTERFACES=1 136 137 rwpaths="/var/lock /var/log /dev /var/run /etc/sysconfig" 138 [ -d "$FAI_NFSROOT/etc/network/run" ] && rwpaths="$rwpaths /etc/network/run" 139 140 export VDIR ROOTDIR FAI_VSERVER FAI_DIR FAI_NFSROOT FAI_ROOT console 141 142 [ -z "$AUTO" ] && FINAL_SHELL="exec /bin/sh -i" 143 144 # set up /mnt with all the mounts required 145 $_SECURE_MOUNT -n -o ro,dev --bind "$FAI_NFSROOT" /mnt 146 $_SECURE_MOUNT -n -t tmpfs -o size=64m,mode=1777 vm /mnt/tmp 147 $_MKDIR -p /mnt/tmp/target 148 $_SECURE_MOUNT -n -o rw,dev --bind "$VDIR" /mnt/tmp/target 149 $_MKDIR -p /mnt/tmp/target/proc 150 $_SECURE_MOUNT -n -t proc proc /mnt/tmp/target/proc 151 for x in $rwpaths 152 do 153 /mnt/usr/lib/fai/mkrw -n "/mnt$x" 154 done 155 $_SECURE_MOUNT -n -o ro --bind "$FAI_DIR" /mnt/fai 156 $_SECURE_MOUNT -n -t proc proc /mnt/proc 157 158 cd /mnt 159 "${CHBIND_CMD[@]}" \ 160 $_VCONTEXT --create "${OPTS_VCONTEXT_CREATE[@]}" -- \ 161 $_VUNAME --xid self --set -t nodename="${SETUP_HOSTNAME:-fai-build}" \ 162 -t context="$SETUP_CONFDIR" -- \ 163 $_VATTRIBUTE --set --xid self "${OPTS_VATTRIBUTE[@]}" --ccap secure_mount \ 164 $_SAVE_CTXINFO "$SETUP_CONFDIR" \ 165 $_VCONTEXT --migrate-self --endsetup --chroot $SILENT_OPT \ 166 "${OPTS_VCONTEXT_MIGRATE[@]}" "${OPTS_VCONTEXT_ENTER[@]}" -- \ 167 /bin/sh -c "/bin/sh $SH_DEBUG /etc/init.d/rcS -N vschild_build; $FINAL_SHELL" 168 169 test -z "$BUILD_INITPOST" || "$BUILD_INITPOST" "$SETUP_CONFDIR" "$UTIL_VSERVER_VARS" 170 171 base.setSuccess