#! /bin/bash # $Id$ #********************************************************************* # # make-fai-nfsroot -- create nfsroot directory and add additional packages # # This script is part of FAI (Fully Automatic Installation) # (c) 2000-2006 by Thomas Lange, lange@informatik.uni-koeln.de # Universitaet zu Koeln # #********************************************************************* # 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; either version 2 of the License, or # (at your option) any later version. # # 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. # # A copy of the GNU General Public License is available as # `/usr/share/common-licences/GPL' in the Debian GNU/Linux distribution # or on the World Wide Web at http://www.gnu.org/copyleft/gpl.html. You # can also obtain it by writing to the Free Software Foundation, Inc., # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #********************************************************************* PATH=/usr/local/bin:/usr/local/sbin:/bin:/sbin:/usr/bin:/usr/sbin if [ `id -u` -ne 0 ]; then echo "Run this program as root." exit 9 fi merror="properly" # option e currently does nothing while getopts ervc:f:kK opt ; do case "$opt" in c) cfdir=$OPTARG ;; v) verbose=1 ; v=-v ;; r) recover=1 ;; f) cfg=$OPTARG ;; k) kinstall=1 ;; K) kremove=1; kinstall=1 ;; e) expert=1 ;; ?) exit 5 ;; # error in option parsing esac done set -e [ -z "$cfdir" ] && cfdir=/etc/fai if [ ! -d "$cfdir" ]; then echo "$cfdir is not a directory" exit 6 fi [ "$verbose" ] && echo "Using configuration files from directory $cfdir" if [ -n "$cfg" ]; then . $cfdir/$cfg else . $cfdir/fai.conf fi # read config file for this tool if [ -f "$cfdir/make-fai-nfsroot.conf" ]; then . $cfdir/make-fai-nfsroot.conf else echo "Can't read $cfdir/make-fai-nfsroot.conf" exit 8 fi if [ -z "$NFSROOT" ]; then echo "\$NFSROOT is not set. Please check your settings in $cfdir/fai.conf." exit 4 fi if [ "$FAI_SOURCES_LIST" ]; then echo "The usage of the variable \$FAI_SOURCES_LIST is deprecated. Please use sources.list now." exit 3 fi if [ ! -s "$cfdir/sources.list" ]; then echo "$cfdir/sources.list does not exists. Can't continue." exit 7 fi kfile="vmlinuz" case `dpkg --print-installation-architecture` in i386) arch_packages="grub lilo dmidecode hwtools read-edid" ;; amd64) arch_packages="grub lilo dmidecode" ;; ia64) arch_packages="elilo gnu-efi efibootmgr dmidecode" ;; sparc) arch_packages="silo sparc-utils" ;; powerpc) arch_packages="" ;; alpha) arch_packages="aboot" ;; *) arch_packages="" ;; esac packages="$packages $arch_packages" ROOTCMD="chroot $NFSROOT" RUNDIR=/var/run/fai/make-fai-nfsroot [ ! -d $RUNDIR ] && mkdir -p $RUNDIR export DEBIAN_FRONTEND=noninteractive [ "$recover" ] || rm -rf $RUNDIR/* trap "umount_dirs" EXIT trap "bad_exit" ERR # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bad_exit() { merror="with errors" echo "An error occured during make-fai-nfsroot." echo "Please fix the error or try make-fai-nfsroot -v" } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - die() { echo "$@" exit 99 } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - call_with_stamp() { local func=$1 local stamp=$RUNDIR/$func # call subroutine [ "$recover" -a -f $stamp ] && return 0 "$@" > $stamp } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - call_verbose() { if [ "$verbose" ]; then "$@" else "$@" > /dev/null fi } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - install_kernel_nfsroot() { rm -rf $NFSROOT/boot/*-$KERNELVERSION $NFSROOT/lib/modules/$KERNELVERSION # since woody we can install the kernel using dpkg -i echo "do_boot_enable=no" > $NFSROOT/etc/kernel-img.conf dpkg -x $KERNELPACKAGE $NFSROOT echo "Kernel $KERNELVERSION installed into the nfsroot." chroot $NFSROOT depmod -qaF /boot/System.map-$KERNELVERSION $KERNELVERSION || true } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - setup_ssh() { # nothing to do if no ssh is available in nfsroot [ -f $NFSROOT/usr/bin/ssh ] || return 0 mkdir -p -m 700 $NFSROOT/root/.ssh if [ -n "$LOGUSER" ] ; then loguserhome=`eval "cd ~$LOGUSER 2>/dev/null && pwd;true"` # is copying of *.pub important? [ -f $loguserhome/.ssh/known_hosts ] && cp $loguserhome/.ssh/known_hosts $NFSROOT/root/.ssh/known_hosts [ -d $loguserhome/.ssh ] && { [ -f $loguserhome/.ssh/id_dsa ] && cp -p $loguserhome/.ssh/id_dsa* $NFSROOT/root/.ssh/ [ -f $loguserhome/.ssh/id_rsa ] && cp -p $loguserhome/.ssh/id_rsa* $NFSROOT/root/.ssh/ cp -p $loguserhome/.ssh/*.pub $NFSROOT/root/.ssh/ } fi # enable root login perl -pi -e 's/PermitRootLogin no/PermitRootLogin yes/' $NFSROOT/etc/ssh/sshd_config if [ -f "$SSH_IDENTITY" ]; then cp $SSH_IDENTITY $NFSROOT/root/.ssh/authorized_keys chmod 0644 $NFSROOT/root/.ssh/authorized_keys echo You can log into install clients without password using $SSH_IDENTITY fi } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - copy_fai_files() { # copy to nfsroot echo "root:$FAI_ROOTPW" | $ROOTCMD chpasswd --encrypted cd $NFSROOT cp -Rpv $cfdir/* $NFSROOT/etc/fai # remove some files that should not be copied rm -f $NFSROOT/etc/fai/make-fai-nfsroot.conf [ -f $cfdir/.cvspass ] && cp -p $v $cfdir/.cvspass $NFSROOT/.cvspass $ROOTCMD shadowconfig on } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - call_debootstrap() { echo "Creating base system for $1 using debootstrap." [ "$verbose" ] && echo "Calling debootstrap $1 $NFSROOT $2" yes '' | LC_ALL=C call_verbose debootstrap $FAI_DEBOOTSTRAP_OPTS $1 $NFSROOT $2 } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - create_base() { if [ "$FAI_DEBOOTSTRAP" ]; then call_with_stamp call_debootstrap $FAI_DEBOOTSTRAP $ROOTCMD apt-get clean rm -f $NFSROOT/etc/resolv.conf echo "Creating base.tgz" tar --one-file-system -C $NFSROOT -cf - --exclude var/tmp/base.tgz . | gzip > $NFSROOT/var/tmp/base.tgz touch $NFSROOT/.THIS_IS_THE_FAI_NFSROOT else die "\$FAI_DEBOOTSTRAP not defined." fi } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - create_nfsroot() { mkdir -p $NFSROOT/$FAI cd $NFSROOT || die "Error: Can't cd to $NFSROOT" call_with_stamp create_base # save the list of all packages in the base.tgz $ROOTCMD dpkg --get-selections | egrep 'install$' | awk '{print $1}' > var/tmp/base-pkgs.lis echo $arch_packages > $NFSROOT/var/tmp/packages.arch if [ "$FAI_DEBMIRROR" ]; then [ "$verbose" ] && echo "Mounting $FAI_DEBMIRROR to $NFSROOT/$MNTPOINT." mkdir -p $NFSROOT/$MNTPOINT mount -o ro,noatime,rsize=8192 $FAI_DEBMIRROR $NFSROOT/$MNTPOINT || \ die "Can't mount $FAI_DEBMIRROR to $NFSROOT/$MNTPOINT." fi # hoaks some packages # liloconfig, dump and raidtool2 needs these files echo "# UNCONFIGURED FSTAB FOR BASE SYSTEM" > etc/fstab > etc/raidtab mkdir -p lib/modules/$KERNELVERSION # dirty trick to hoax lvm > lib/modules/$KERNELVERSION/modules.dep # dirty trick to hoax lvm echo 'NTPSERVERS=""' > etc/default/ntp-servers [ -d $NFSROOT/var/state ] || mkdir $NFSROOT/var/state cp -v $cfdir/sources.list $NFSROOT/etc/apt/sources.list echo "127.0.0.1 localhost" >> etc/hosts echo "$NFSROOT_ETC_HOSTS" >> etc/hosts [ -f $cfdir/preferences ] && cp -v $cfdir/preferences $NFSROOT/etc/apt echo 'APT::Get::AllowUnauthenticated "true";' >$NFSROOT/etc/apt/apt.conf.d/10fai echo "Upgrading $NFSROOT" LC_ALL=C call_verbose call_with_stamp upgrade_nfsroot echo "Adding additional packages to $NFSROOT:" echo "$packages" LC_ALL=C call_verbose call_with_stamp add_packages_nfsroot call_with_stamp copy_fai_files # set timezone in nfsroot timezone=$(readlink /etc/localtime | sed 's%^/usr/share/zoneinfo/%%') echo $timezone > etc/timezone rm -f etc/localtime && ln -sf /usr/share/zoneinfo/$timezone etc/localtime # make little changes to nfsroot, because nfsroot is # read only for the install clients rm etc/mtab ln -s /proc/mounts etc/mtab mkdir var/lib/discover etc/sysconfig ln -s /tmp/etc/syslogsocket dev/log ln -sf /tmp/etc/resolv.conf etc/resolv.conf ln -s /usr/sbin/fai etc/init.d/rcS # for nis [ -d var/yp ] && ln -s /tmp/binding var/yp/binding # definition for loopback device echo "iface lo inet loopback" > etc/network/interfaces echo "*.* /tmp/fai/syslog.log" > etc/syslog.conf cat >> root/.profile <<-EOF PATH=/usr/local/sbin:/usr/local/bin:/usr/lib/fai:/bin:/sbin:/usr/bin:/usr/sbin: export PATH . /usr/lib/fai/subroutines . /usr/lib/fai/subroutines-$OS_TYPE set -a . /tmp/fai/variables.sh 2>/dev/null EOF call_verbose call_with_stamp setup_ssh cat >$NFSROOT/etc/rc2.d/S01fai_abort <<-EOF #!/bin/sh echo FAI: installation aborted. echo reboot with: faireboot echo or after a logout sh cd / umount -ar reboot -dfi EOF chmod a+rx $NFSROOT/etc/rc2.d/S01fai_abort # IMO this may be removed, since all information should be included into sources.list echo -e "\n$FAI_LOCAL_REPOSITORY" >> etc/apt/sources.list } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - upgrade_nfsroot() { if [ -f /etc/resolv.conf ]; then cp -p $v /etc/resolv.conf $NFSROOT/etc/resolv.conf-installserver cp -p $v /etc/resolv.conf $NFSROOT/etc/resolv.conf # this is needed during make-fai-nfsroot fi $ROOTCMD apt-get update $ROOTCMD apt-get -fyu install $ROOTCMD apt-get check rm -rf $NFSROOT/etc/apm mount -t proc /proc $NFSROOT/proc fdivert /sbin/start-stop-daemon /sbin/discover-modprobe cp -p /sbin/fai-start-stop-daemon $NFSROOT/sbin/start-stop-daemon $ROOTCMD apt-get -y dist-upgrade } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - add_packages_nfsroot() { $ROOTCMD apt-get -y --fix-missing install $packages /dev/null 2>&1 || true rm -rf $NFSROOT/.??* $NFSROOT/* # also remove files $NFSROOT/.? but not . and .. find $NFSROOT -xdev -maxdepth 1 ! -type d | xargs -r rm -f fi # Create a new nfsroot if [ ! -x "`which debootstrap`" ]; then die "Can't find debootstrap command. Aborting." fi call_with_stamp create_nfsroot kernel_install umount_dirs trap "true" EXIT echo "make-fai-nfsroot finished $merror." exit 0