The attached patch adds support for a FAI build method to util-vserver. It is of proof-of-concept quality; it works, but could do with a bit of refactoring.
This patch requires the "vserver" branch of FAI, browsable online at http://svn.debian.org/wsvn/fai/people/mugwump/vserver/ Detection of this branch is still TO-DO. --- Makefile.in | 1 scripts/Makefile-files | 1 scripts/vserver-build | 6 + scripts/vserver-build.fai | 182 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 189 insertions(+), 1 deletion(-)
#! /bin/sh /usr/share/dpatch/dpatch-run ## 22_fai.dpatch by Sam Vilain <[EMAIL PROTECTED]> ## ## All lines beginning with `## DP:' are a description of the patch. ## DP: No description. @DPATCH@ diff -urN util-vserver-0.30.210.orig/Makefile.in util-vserver-0.30.210/Makefile.in --- util-vserver-0.30.210.orig/Makefile.in 2006-06-20 17:31:04.000000000 +1200 +++ util-vserver-0.30.210/Makefile.in 2006-06-20 17:30:02.000000000 +1200 @@ -1916,6 +1916,7 @@ scripts/vserver-build.apt-rpm \ scripts/vserver-build.skeleton \ scripts/vserver-build.debootstrap \ + scripts/vserver-build.fai \ scripts/vserver-build.rpm \ scripts/vserver-build.yum \ scripts/vserver-build.functions \ --- util-vserver-0.30.210.orig/scripts/Makefile-files 2006-06-20 17:31:04.000000000 +1200 +++ util-vserver-0.30.210/scripts/Makefile-files 2006-06-20 17:30:02.000000000 +1200 @@ -41,6 +41,7 @@ scripts/vserver-build.apt-rpm \ scripts/vserver-build.skeleton \ scripts/vserver-build.debootstrap \ + scripts/vserver-build.fai \ scripts/vserver-build.rpm \ scripts/vserver-build.yum \ scripts/vserver-build.functions \ diff -urN util-vserver-0.30.210.orig/scripts/vserver-build util-vserver-0.30.210/scripts/vserver-build --- util-vserver-0.30.210.orig/scripts/vserver-build 2006-06-20 17:31:04.000000000 +1200 +++ util-vserver-0.30.210/scripts/vserver-build 2006-06-20 17:30:02.000000000 +1200 @@ -66,6 +66,10 @@ configuration file and calls an optional command then debootstrap ... -- -d <distribution> [-m <mirror>] [-s <script> ] [-- <debootstrap-options>*] bootstraps the vserver with Debian's 'debootstrap' package + fai ... -- -f <fai_vserver> [-n <nfsroot>] [-d <fai_dir> ] [ -a ] + bootstraps the vserver with Debian Fully Automatic Installation + -a means skip confirmation prompt and final shell. + Please report bugs to $PACKAGE_BUGREPORT" exit 0 @@ -126,7 +130,7 @@ case x"$method" in (xlegacy) exec $_VSERVER_LEGACY "$VSERVER_NAME" build "$@" ;; - (xapt-rpm|xcopy|xskeleton|xdebootstrap|xyum|xrpm) + (xapt-rpm|xcopy|xskeleton|xdebootstrap|xyum|xrpm|xfai) . $__PKGLIBDIR/vserver-build.$method ;; (x) panic $"No build-method specified";; diff -urN util-vserver-0.30.210.orig/scripts/vserver-build.fai util-vserver-0.30.210/scripts/vserver-build.fai --- util-vserver-0.30.210.orig/scripts/vserver-build.fai 1970-01-01 12:00:00.000000000 +1200 +++ util-vserver-0.30.210/scripts/vserver-build.fai 2006-06-20 17:30:18.000000000 +1200 @@ -0,0 +1,182 @@ +# +# Copyright (C) 2006 Sam Vilain <[EMAIL PROTECTED]> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +tmp=$(getopt -o '+d:+f:+n:+a' --long debug,pkgmgmt -n "$0" -- "$@") || exit 1 +eval set -- "$tmp" + +. "$_LIB_VSERVER_BUILD_FUNCTIONS_PKGMGMT" + +DISTRIBUTION=: + +FAI_VSERVER= +FAI_NFSROOT=/usr/lib/fai/nfsroot +FAI_DIR=/usr/local/share/fai + +use_pkgmgmt= +while true; do + case "$1" in + -f) FAI_VSERVER=$2; shift; ;; + -n) FAI_NFSROOT=$2; shift; ;; + -d) FAI_DIR=$2; shift; ;; + -a) AUTO=1; ;; + --debug) DEBUG=1; SH_DEBUG=-x; set -x;; + --) shift; break ;; + *) echo "vserver-build.fai: internal error: unrecognized option '$1'" >&2 + exit 1 + ;; + esac + shift +done + +getDistribution '' 1 + +base.init +base.initFilesystem "$OPTION_FORCE" + +setup_writeOption "$VSERVER_NAME" +setup_writeInitialFstab + +test -z "$BUILD_INITPRE" || "$BUILD_INITPRE" "$SETUP_CONFDIR" "$UTIL_VSERVER_VARS" +test -z "$1" || "$@" +test -z "$BUILD_INITPOST" || "$BUILD_INITPOST" "$SETUP_CONFDIR" "$UTIL_VSERVER_VARS" + +# if they specified a vserver where FAI is installed, then prefix its +# root to the FAI_NFSROOT etc (unless they have already specified a +# $ROOTDIR-relative path) +REAL_ROOTDIR=`cd $ROOTDIR; pwd -P` +REAL_VDIR=`cd $VDIR; pwd -P` +echo "ROOTDIR is $REAL_ROOTDIR" +echo "VDIR is $REAL_VDIR" +if [ -n "$FAI_VSERVER" ] +then + echo "FAI_VSERVER is $FAI_VSERVER" + if [ `expr "$FAI_NFSROOT" : "$REAL_ROOTDIR"` -eq 0 ] + then + FAI_NFSROOT="$REAL_ROOTDIR/$FAI_VSERVER$FAI_NFSROOT" + fi + if [ `expr "$FAI_DIR" : "$REAL_ROOTDIR"` -eq 0 ] + then + FAI_DIR="$REAL_ROOTDIR/$FAI_VSERVER$FAI_DIR" + fi +fi +echo "FAI_NFSROOT is $FAI_NFSROOT" +echo "FAI_DIR is $FAI_DIR" +FAI_ROOT=/tmp/target + +# setup a new filesystem namespace +set -e +#[ -d $FAI_NFSROOT/var/log/fai ] || mkdir $FAI_NFSROOT/var/log/fai + +# pick a context number +CTX=1000 +while [ -d /proc/virtual/$CTX ] +do + CTX=`expr $CTX + 1` +done + +# suppresses color logo, as it does not leave the terminal in a nice +# state. +console=dummy + +# set up interfaces, so that the vserver can be built with restricted +# network access. +echo "SETUP_INTERFACES is $SETUP_INTERFACES" +for i in "[EMAIL PROTECTED]" +do + eval "`perl -le '$ARGV[0] =~ m{^(?:([^:]*):)?((?:\d+\.){3}\d+)(?:/(\d+))?$} && do { print for (\"iface=$1\", \"addr=$2\", \"prefix=$3\") }' $i`" + echo "iface: $iface, $addr, $prefix" + if [ -n "$iface" -a -n "$prefix" ] + then + ip addr del $addr/$prefix dev $iface 2>/dev/null ||: + ip addr add $addr/$prefix dev $iface + IFSPEC="$IFSPEC --ip $addr" + AFTER="${AFTER}ip addr del $addr/$prefix dev $iface + " + else + echo "WARNING: FAI build method can't understand ifspec '$i'" + fi +done + +echo "IFSPEC is $IFSPEC" +if [ -n "$IFSPEC" ] +then + chbind="/usr/sbin/chbind $IFSPEC" +fi + +# last chance to abort! +if [ -z "$AUTO" ] +then + echo -n "Press ENTER to begin, or Ctrl+C to cancel: " + read junk +fi + +rm -f /tmp/go 2>/dev/null ||: +mkfifo /tmp/go + +( +read junk < /tmp/go +vattribute --set --xid $CTX --secure --ccap secure_mount +[ -z "$SETUP_HOSTNAME" ] && SETUP_HOSTNAME="vs$CTX" +vuname -s --xid $CTX -t nodename=$SETUP_HOSTNAME +) & + +killprocs() { +if [ -e /proc/virtual/$CTX ] +then +echo "Killing stray processes in context $CTX:" +vps ax | grep -w $CTX | perl -nle 'm{^\s*(\d+)\s+(\d+)\s+(.*)} && ('$CTX') && ('$CTX' == $2) && do { print "$1 $3"; kill 15, $1 or warn "Error sending signal: $!" }' +sleep 2; +vps ax | grep -w $CTX | perl -nle 'm{^\s*(\d+)\s+(\d+)\s+(.*)} && ('$CTX') && ('$CTX' == $2) && do { print "$1 $3"; kill 9, $1 or warn "Error sending signal: $!" }' +fi +set -x +eval $AFTER +} + +trap killprocs INT EXIT + +rwpaths="/var/lock /var/log /dev /var/run /etc/sysconfig" +if [ -d "$FAI_NFSROOT/etc/network/run" ] +then + rwpaths="$rwpaths /etc/network/run" +fi + +export VDIR ROOTDIR FAI_VSERVER FAI_DIR FAI_NFSROOT FAI_ROOT console + +if [ -z "$AUTO" ] +then + FINAL_SHELL="exec /bin/sh -i" +fi + +vnamespace -n -- sh $SH_DEBUG -c " + mount -n -o ro --bind $FAI_NFSROOT /mnt && + mount -n -t tmpfs -o size=64m,mode=1777 vm /mnt/tmp && + mkdir /mnt/tmp/target && + mount -n --bind $VDIR /mnt/tmp/target && + (mkdir /mnt/tmp/target/proc 2>/dev/null; + mount -n -t proc proc /mnt/tmp/target/proc ) && + for x in $rwpaths + do + /mnt/usr/lib/fai/mkrw -n /mnt\$x + done && + mount -n -o ro --bind $FAI_DIR /mnt/fai && + mount -n -t proc proc /mnt/proc && + $chbind chcontext --secure --xid $CTX /bin/sh -c ' + echo "ok" > /tmp/go + sleep 1 + chroot /mnt /bin/sh -c \ + \"/bin/sh $SH_DEBUG /etc/init.d/rcS -N vschild_build; $FINAL_SHELL\"'" + +base.setSuccess
_______________________________________________ Vserver mailing list Vserver@list.linux-vserver.org http://list.linux-vserver.org/mailman/listinfo/vserver