#! /bin/sh # $Id$ #********************************************************************* # # make-fai-nfsroot -- create nfsroot directory and add additional packages # # This script is part of FAI (Fully Automatic Installation) # (c) 2000-2002 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. #********************************************************************* # Packages that are install to nfsroot by default Additional packages are # defined with $NFSROOT_PACKAGES in fai.conf packages="portmap file rdate cfengine bootpc rsync wget rsh-client less dump reiserfsprogs dpkg-dev ext2resize strace hdparm parted dnsutils grub ntpdate dosfstools sysutils dialog libdetect0 discover mdetect read-edid kudzu hwtools" 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 while getopts rv opt ; do case "$opt" in v) verbose=1 ;; r) recover=1 ;; esac done set -e . /etc/fai/fai.conf echo Creating FAI nfsroot can take a long time and will echo need more than 160MB disk space in $NFSROOT. ROOTCMD="chroot $NFSROOT" RUNDIR=/var/run/fai/make-nfs-root [ ! -d $RUNDIR ] && mkdir -p $RUNDIR [ ! "$recover" ] && rm -rf $RUNDIR/* LIBFAI=/usr/lib/fai SHAREFAI=/usr/share/fai conffile=$NFSROOT/etc/rcS_fai.conf export DEBIAN_FRONTEND=noninteractive trap "umount_dirs" EXIT # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 # if $NFROOT/proc/modules exists, then update-modules calls depmod -a without # these special flags; so umount first [ -e $NFSROOT/proc/modules ] && umount $NFSROOT/proc chroot $NFSROOT update-modules chroot $NFSROOT depmod -a -F /boot/System.map-$KERNELVERSION $KERNELVERSION } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - setup_ssh() { # nothing to do if no ssh is available in nfsroot [ -f $NFSROOT/var/lib/dpkg/info/ssh.list ] || return 0 mkdir -p -m 700 $NFSROOT/root/.ssh [ -f /etc/ssh/ssh_known_hosts ] && cp /etc/ssh/ssh_known_hosts $NFSROOT/root/.ssh/known_hosts if [ -n "$LOGUSER" ] ; then loguserhome=`eval "cd ~$LOGUSER 2>/dev/null && pwd;true"` # is copying of *.pub important? [ -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 -p $SSH_IDENTITY $NFSROOT/root/.ssh/authorized_keys echo You can log into install clients without password using $SSH_IDENTITY fi } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - copy_fai_files() { # copy to nfsroot perl -pi -e "s#^root::#root:${FAI_ROOTPW}:#" etc/passwd mkdir -p $NFSROOT/$FAI/fai_config $NFSROOT/$SHAREFAI $NFSROOT/$LIBFAI $NFSROOT/etc/fai cd $NFSROOT cp -p $SHAREFAI/etc/dhclient.conf etc/ ln -fs ../sbin/dhclient-script etc/dhclient-script cp -Rp /etc/fai etc/ [ -f /etc/fai/.cvspass ] && cp -p /etc/fai/.cvspass .cvspass cp -p $LIBFAI/sbin/* sbin/ cp -p /usr/bin/fai-class usr/bin/ cp -p $LIBFAI/* usr/lib/fai 2>/dev/null || true # cp will complain about directories cp -p $SHAREFAI/etc/fai_modules_off etc/modutils/ cp -p $SHAREFAI/subroutines* usr/share/fai cp -p $SHAREFAI/etc/apt.conf etc/apt cp -p /usr/share/perl5/Debian/Fai.pm usr/share/perl5/Debian/ echo $NFSROOT_ETC_HOSTS >> etc/hosts } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - call_debootstrap() { echo "Creating nfsroot for $1 using debootstrap" [ "$verbose" ] && echo "Calling debootstrap $1 $NFSROOT $2" yes '' | call_verbose debootstrap $FAI_DEBOOTSTRAP_OPTS $1 $NFSROOT $2 || true } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - create_base() { if [ "$FAI_DEBOOTSTRAP" ]; then call_with_stamp call_debootstrap $FAI_DEBOOTSTRAP $ROOTCMD apt-get clean echo "Creating base.tgz" tar -l -C $NFSROOT -cf - . | gzip > $NFSROOT/../base.tgz mv $NFSROOT/../base.tgz $NFSROOT/var/tmp/base.tgz 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 if [ "$FAI_DEBMIRROR" ]; then mkdir -p $NFSROOT/$MNTPOINT mount -o ro,noatime,rsize=8192 $FAI_DEBMIRROR $NFSROOT/$MNTPOINT || \ die "Can't mount $FAI_DEBMIRROR" 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 # woody uses debconf # use FAI_SOURCES_LIST, if undefined copy from /etc/fai or last try from /etc/apt if [ "$FAI_SOURCES_LIST" ]; then echo "$FAI_SOURCES_LIST" > etc/apt/sources.list else cp /etc/fai/sources.list etc/apt/sources.list || \ cp /etc/apt/sources.list etc/apt/sources.list fi [ -f /etc/apt/preferences ] && cp /etc/apt/preferences etc/apt echo "Upgrading $NFSROOT" call_verbose call_with_stamp upgrade_nfsroot echo "Adding additional packages to $NFSROOT:" echo "$packages" call_verbose call_with_stamp add_packages_nfsroot call_with_stamp copy_fai_files # set timezone rm -f etc/localtime cp -d /etc/localtime /etc/timezone etc # make little changes to nfsroot, because nfsroot is # read only for the install clients rm -rf etc/mtab var/run etc/sysconfig mv etc/init.d/rcS etc/init.d/rcS.orig ln -s /proc/mounts etc/mtab ln -s /tmp/var/run var/run ln -sf /tmp/etc/resolv.conf etc/resolv.conf ln -sf /tmp etc/sysconfig ln -s ../../sbin/rcS_fai etc/init.d/rcS ln -s /dev/null etc/network/ifstate # for nis [ -d var/yp ] && ln -s /tmp/binding var/yp/binding # turn off logging of loading kernel modules [ -d var/log/ksymoops/ ] && rmdir var/log/ksymoops/ ln -s /dev/null var/log/ksymoops # 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 . $SHAREFAI/subroutines . $SHAREFAI/subroutines-$OS_TYPE set -a . /etc/fai/fai.conf . /tmp/rcsfai.var 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 echo "$FAI_LOCAL_REPOSITORY" >> etc/apt/sources.list } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - upgrade_nfsroot() { cp /etc/resolv.conf $NFSROOT/etc $ROOTCMD apt-get update $ROOTCMD apt-get check rm -rf $NFSROOT/etc/apm mount -t proc /proc $NFSROOT/proc $ROOTCMD apt-get --purge -y install debconf /dev/null 2>&1 || true umount $NFSROOT/dev/pts 1>/dev/null 2>&1 ||true if [ "$FAI_DEBMIRROR" ]; then test -d $NFSROOT/$MNTPOINT && umount $NFSROOT/$MNTPOINT || true fi # show directories still mounted on nfsroot mount | grep " on $NFSROOT " || true } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - get_kernel_version() { local package=$1 KERNELVERSION=`dpkg --info $1 | grep "Package: kernel-image" | sed -e 's/.*kernel-image-'//` } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - setup_bootp(){ if [ -x "`which mknbi-linux`" ]; then mknbi-linux --verbose -a "ip=both" \ $NFSROOT/boot/vmlinuz-$KERNELVERSION /boot/fai/installimage else die "Command mknbi-linux not found. Please install the package netboot" fi # imggen is free software from 3com - use ver1.00: 1.01 produces "Image too Big" errors. # it converts netboot images to images which are bootable by 3com network cards if [ -x "`which imggen`" ]; then imggen -a /boot/fai/installimage /boot/fai/installimage_3com fi echo "BOOTP environment prepared." } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - setup_dhcp(){ # pxe and dhcp environment local pxebin=/usr/lib/syslinux/pxelinux.0 cp -p $NFSROOT/boot/vmlinuz-$KERNELVERSION /boot/fai/installkernel [ -f $pxebin ] && cp $pxebin /boot/fai [ -d /boot/fai/pxelinux.cfg ] || mkdir /boot/fai/pxelinux.cfg || true cp -p /usr/share/fai/etc/pxelinux.cfg /boot/fai/pxelinux.cfg/default echo "DHCP environment prepared. Now enable dhcpd and the special tftp daemon" } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # main routine # Kill the directory if not in recover mode if [ -d $NFSROOT/$FAI -a ! "$recover" ] then echo $NFSROOT already exists. Removing $NFSROOT umount $NFSROOT/dev/pts 1>/dev/null 2>&1 || true rm -rf $NFSROOT/.??* $NFSROOT/* # also remove files $NFSROOT/.? but not . and .. find $NFSROOT ! -type d -xdev -maxdepth 1 | xargs -r rm -f fi # Create a new nfsroot call_with_stamp create_nfsroot # Install the kernel package if [ -f $KERNELPACKAGE ]; then # determine kernel version get_kernel_version $KERNELPACKAGE # create tftp boot images call_with_stamp install_kernel_nfsroot # setup for both DHCP and BOOTP call_with_stamp setup_dhcp call_with_stamp setup_bootp else echo "Kernel package $KERNELPACKAGE not found." echo "No install kernel installed in /boot/fai." echo "No kernel modules available in nfsroot." fi echo make-fai-nfsroot finished. exit 0