User:BrianShowalter/Using FAI to install Linux-vservers
This document explains how to set up and use FAI to install Linux vservers. It assumes that the vserver patches have already been compiled into the kernel that will be installed by FAI.
In the $FAI_CONFIGDIR
or /usr/lib/fai
directory, there is a file called subroutines
which contains functions that handle certain FAI tasks. Load this file into a text editor. Around line 112 there is a line that executes "unset task_$taskname
". Comment out this line so that the task functions will remain available for use when installing vserver children.
In $FAI_CONFIGDIR/class/50-host-classes
, set up the vserver host and child classes similar to the following:
#!/bin/sh class $HOSTNAME in vshost) echo "FAIBASE VSHOST VSCOMMON";; vschild1) echo "VSCHILD VSCOMMON APACHE" && exit 0;; vschild2) echo "VSCHILD VSCOMMON MYSQL" && exit 0;; vschild3) echo "VSCHILD VSCOMMON POSTFIX" && exit 0;; *) echo "FAIBASE DHCPC";; esac ifclass I386 && echo "GRUB" exit 0
In $FAI_CONFIGDIR/class/vshost.var
, set up the names of the child vservers that are associated with a host:
vschildren="vschild1 vschild2 vschild3"
Set up the vserver child classes (one class file per child) as follows in $FAI_CONFIGDIR/class/<childname>.var
:
vsname="vs1" childdev="eth0" childip="192.168.0.10" childprefix="24"
Copy $FAI_CONFIGDIR/debconf/FAIBASE
to $FAI_CONFIGDIR/debconf/VSCHILD
.
In $FAI_CONFIGDIR/hooks/finish.VSHOST
, create a file with the following contents:
#!/bin/sh # # $FAI_CONFIGDIR/hooks/finish.VSHOST # # Save hostname and root directory of vserver base VSHOST=$HOSTNAME VSHOST_IPADDR=$IPADDR VSHOST_FAI_ROOT=$FAI_ROOT # Create vserver base directories [ -e $FAI_ROOT/vservers ] || mkdir $FAI_ROOT/vservers rm -f $FAI_ROOT/etc/vservers/.defaults/vdirbase chroot $FAI_ROOT ln -s /vservers /etc/vservers/.defaults/vdirbase chroot $FAI_ROOT setattr --barrier /vservers mkdir -p $FAI_ROOT/etc/vservers/.defaults/apps/debootstrap echo "http://$mirrorhost/debian" >$FAI_ROOT/etc/vservers/.defaults/apps/debootstrap/mirror # Check whether any vserver children need to be installed if [ -n "$vschildren" ]; then for childhost in $vschildren; do HOSTNAME=$childhost hostname $childhost echo "vserver child hostname set to $childhost" sleep 3 export HOSTNAME task vschild_defclass task defvar # Set up FAI_ROOT to point to vserver child root export FAI_ROOT="$VSHOST_FAI_ROOT/vservers/$vsname" export ROOTCMD="chroot $FAI_ROOT" export IPADDR=$childip # Variables for cfengine target=$FAI_ROOT # Create child vserver task vschild_create # Install & configure vserver packages task vschild_install done fi # Restore hostname, IP address and root directory of vserver base export HOSTNAME=$VSHOST hostname $VSHOST export IPADDR=$VSHOST_IPADDR export FAI_ROOT=$VSHOST_FAI_ROOT export ROOTCMD="chroot $FAI_ROOT"
In $FAI_CONFIGDIR/hooks/subroutines
, create a file with the following contents:
#! /bin/bash # # $FAI_CONFIGDIR/hooks/subroutines # Custom FAI subroutines to install vserver children # # Written by Brian Showalter # 11 Feb 2006 task_vschild_defclass() { # Reevaluate classes fai-class -T $FAI/class $LOGDIR/FAI_CLASSES classes=$(< $LOGDIR/FAI_CLASSES) # define classes as: a.b.c.d for cfengine -D # this doesn't work without echo cfclasses=$(echo $classes) cfclasses=${cfclasses// /.} [ "$debug" ] && echo "cfclasses: $cfclasses" } task_vschild_create() { echo "Creating vserver $vsname" local removepkgs="sparc-utils,dhcp-client,lilo,makedev,pcmcia-cs,ppp,pppconfig,pppoe" removepkgs="${removepkgs},pppoeconf,setserial,syslinux,fdutils,libpcap0" removepkgs="${removepkgs},pciutils,ipchains,iptables,jove,nano" chroot $VSHOST_FAI_ROOT /usr/sbin/vserver $vsname build -m debootstrap \ --hostname $childhost --interface $childdev:$childip/$childprefix -- \ -d sarge -m http://$mirrorhost/debian -- --exclude="$removepkgs" } task_vschild_updatebase() { if [ "$FAI_ACTION" = "install" ]; then # Some packages must access /proc even in chroot environment mount -t proc proc $FAI_ROOT/proc # if libc is upgraded init u is called in chroot environment and # then init will eat up much cpu time fai-divert -a /sbin/init /usr/sbin/liloconfig /usr/sbin/invoke-rc.d # fake some more programs # fai-divert -a /etc/init.d/nis /sbin/start-stop-daemon # cp /sbin/start-stop-daemon $FAI_ROOT/sbin/start-stop-daemon fi # update the apt-get information inside the nfsroot export aptopt='-y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold"' $ROOTCMD apt-get $aptopt update $ROOTCMD apt-get $aptopt check [ $? -ne 0 ] && $ROOTCMD apt-get $aptopt -f install </dev/null $ROOTCMD dpkg -C [ $? -ne 0 ] && yes '' | $ROOTCMD dpkg --configure -a # using the above value, causes an error: "dpkg need action" export aptopt= $ROOTCMD apt-get $aptopt -f -y dist-upgrade </dev/null # update dpkg info which packages are available tmp=$($ROOTCMD mktemp) $ROOTCMD apt-cache dumpavail > $FAI_ROOT/$tmp $ROOTCMD dpkg --update-avail $tmp rm -f $FAI_ROOT/$tmp } task_vschild_install() { task debconf task prepareapt task vschild_updatebase task instsoft task configure }
The two commented-out lines above cause problems when starting vserver children.
In $FAI_CONFIGDIR/package_config/VSCOMMON
, insert the following package names to install common software. This is similar to those installed with the FAIBASE class, except that it doesn't include packages that should not go in a vserver child, such as hdparm or nfs-common:
PACKAGES aptitude bzip2 cfengine cron debconf-utils file less linuxlogo rsync ssh sysutils time
In $FAI_CONFIGDIR/package_config/VSHOST
, insert the following package names to install the vserver utility software:
PACKAGES aptitude util-vserver vserver-debiantools
In $FAI_CONFIGDIR/scripts/VSCHILD/10-misc
, insert the following:
#! /bin/sh # (c) Thomas Lange, 2001-2005, lange@debian.org error=0 ; trap "error=$((error|1))" ERR # assuming that make-fai-nfsroot.conf sets # FAI_LOCAL_REPOSITORY="deb file:/fai/files packages/" # install additional packags that are located in /fai/files/packages/ if [ -d /fai/files/packages ] && [ ! -f /fai/files/packages/Packages.gz ]; then # Mm. It seems not to be a simple repository. I assume it's configured in sources.list echo "WARNING! Index file Packages.gz is missing in /fai/files/packages." fi fcopy /etc/hostname || echo $HOSTNAME > $target/etc/hostname echo $time_zone > $target/etc/timezone ln -fs /usr/share/zoneinfo/${time_zone} $target/etc/localtime fcopy -iM /etc/hosts /etc/motd # set root password echo "root:$rootpw" | $ROOTCMD chpasswd --encrypted # make /root accessable only by root chmod 0700 $target/root chown root:root $target/root # copy default dotfiles for root account fcopy -ir /root # create keyboard layput table $ROOTCMD bash -c "echo 'console-data console-data/keymap/full select $FAI_KEYMAP' | debconf-set-selections" $ROOTCMD install-keymap $FAI_KEYMAP || true # dumpkeys | gzip -9f >$target/etc/console/boottime.kmap.gz exit $error
In $FAI_CONFIGDIR/scripts/VSCHILD/20-misc
, insert the following:
#! /usr/bin/cfengine control: OutputPrefix = ("cfengine") actionsequence = ( tidy ) EditFileSize = ( 30000 ) tidy: any:: ${target}/etc/rc?.d pattern=S??exim4 R=0 age=0 ${target}/etc/rc?.d pattern=S??klogd R=0 age=0 ${target}/etc/rc?.d pattern=S??makedev R=0 age=0 ${target}/etc/rc?.d pattern=S??nfs-common R=0 age=0 ${target}/etc/rc?.d pattern=S??portmap R=0 age=0 ${target}/etc/rc?.d pattern=S??postfix R=0 age=0 ${target}/etc/rc?.d pattern=S??rsync R=0 age=0
In $FAI_CONFIGDIR/scripts/VSHOST/10-misc
, insert the following:
#! /usr/bin/cfengine control: OutputPrefix = ("cfengine") actionsequence = ( directories editfiles ) EditFileSize = ( 30000 ) directories: any:: ${target}/vservers mode=1000 owner=0 group=0 editfiles: any:: { ${target}/etc/ssh/sshd_config LocateLineMatching "#ListenAddress 0.0.0.0" ReplaceLineWith "ListenAddress ${IPADDR}" }