#! /bin/sh # # @(#)install_small_kernel 1.1 94/10/31 SMI # # install_small_kernel # # Copyright (c) 1989 by Sun Microsystems, Inc. # # This shell script installs a small preconfigured kernel for # hardware configurations typically equipped with SCSI devices. # It can be invoked from the miniroot, and from both single and # multi-user modes. # # The following host types are supported by this script: # Standalone with SCSI disks only # Server: If the server has non-SCSI disks, the small kernel # can be installed on its clients having the supported # configurations. Otherwise, the user has the # option of installing the small kernel on the host # and each of the clients. # # Dataless installs are supported only if this script is invoked # in multi-user mode. # # The script normally processes only those clients which aren't # flagged as having been installed with the small kernel. # You can force small kernel installation on specific hosts or speed # up the installation process by invoking the script and specifying # hostnames on the command line. # PATH=/bin:/usr/bin:/etc:/usr/etc:/usr/etc/upgrade:/usr/ucb ; export PATH files_dir=/etc/install; script='install_small_kernel' PWD=`pwd`; tmp=/tmp usage="USAGE: $script [hostname1] [hostname2] [hostname3]..." [ $# = 0 ] && default=1 && do_host=1 if [ -f /.MINIROOT ]; then top='/a' && mini=1 else [ ! `whoami` = "root" ] && echo "Not superuser!" && exit 1 ps -ax > /tmp/$$ if egrep -s '[/ ]cron$' /tmp/$$ || egrep -s '[/ ]update$' /tmp/$$; then multi=1 else single=1 fi fi # # Make sure files created by suninstall are available # for installfile in mount_list sys_info; do [ -s $files_dir/${installfile} ] && continue notfound="$notfound $installfile" done if [ "$notfound" ]; then echo "This utility depends on these files generated by 'suninstall':" echo " $notfound." echo "They are not available on this system."; exit 1 fi host_type=`awk -F= '$1 ~ /^sys_type$/ {print $2}' $files_dir/sys_info` if [ "$mini" ] ; then sys_name=`awk -F= '$1 ~ /^hostname/ {print $2}' $files_dir/sys_info|\ awk -F, '{print $1}'` else sys_name=`hostname` fi # # Validate optional hostnames provided # for i in $*; do case $i in $sys_name ) do_host=1;; * ) if [ -s $files_dir/client.${i} ]; then clients="$clients $i"; continue fi notfound="$notfound $i";; esac done [ "$notfound" ] && echo "Unknown host: $notfound" && echo $usage && exit 1 # # Subroutine: Process yes/no responses # get_yn='(while read yn; do case "$yn" in [Yy]* ) exit 0;; [Nn]* ) exit 1;; * ) echo -n "Please answer y or n: ";; esac done)' echo " This utility installs a small pre-configured kernel for systems which are either diskless, or equipped with SCSI devices. The kernel supports about four users for the following diskfull or diskless configurations: Sun3/50 and Sun3/60 with up to 2 SCSI disks, 1 SCSI tape Sun3/80 with up to 4 SCSI disks, 2 SCSI tapes Sun4/110 with up to 4 SCSI disks, 2 SCSI tapes SPARCsystem 330 with up to 4 SCSI disks, 2 SCSI tapes SPARCstation 1, 1+, and 2 systems with up to 8 SCSI disks, 4 SCSI tapes, 2 CD-ROM drives, 1 Floppy Disk If this system is a server that does not fit any of the above configurations, this utility can be invoked to install the small kernel on its clients listed above. " [ "$mini" ] && echo "Dataless systems are supported in multi-user mode only. " echo -n "Do you wish to continue? (y/n): " eval "$get_yn" || exit 1 wrong_config=\ "This utility installs a smaller generic kernel on systems having SCSI disks. It appears that this machine does not have the valid configuration that can be supported by this utility." no_dataless=\ "This utility does not support dataless clients from the miniroot. If you wish to install the small kernel, reboot your system and invoke it in multi-user mode." if [ "$host_type" = "dataless" -a "$mini" ]; then echo "$no_dataless" && exit 1 fi # # Subroutine: Mount and unmount partitions; if operation fails, # attempt error recovery # get_mtstat='( [ "$do_mt" = "0" ] && cmd="mount" || cmd="umount" tried=""; fixit="" while : do /etc/mount|grep -s "$mt_dir " [ "$?" = "$do_mt" ] && exit 0 if [ "$tried" ]; then if [ "$do_mt" = "0" -a ! "$fixit" ]; then /etc/umount $mt_dev && tried="" && fixit=1 && continue fi echo -n "Unable to $cmd $mt_dir! Try again? (y/n) " eval "$get_yn" && continue || exit 1 fi if [ "$do_mt" = 0 ]; then /etc/${cmd} $mt_dev $mt_dir && echo "$mt_dev $mt_dir" >> \ $tmp/mt_$$ else /etc/${cmd} $mt_dev fi tried=1 done )' # # Subroutine: Copy and verify the small kernel installed. # If copy operation fails, try one more time and restore original # version, if unsuccessful. # do_copy='( if [ ! -s $from/vmunix_small ]; then echo "Small Kernel not found in $from!" exit 1 fi if [ -f $to/vmunix ]; then [ ! -s $to/vmunix.orig ] && mv $to/vmunix $to/vmunix.orig fi for i in 1 2; do cp $from/vmunix_small $to/vmunix sync; sync sum1=`$top/usr/bin/sum $from/vmunix_small` sum2=`$top/usr/bin/sum $to/vmunix` [ "$sum1" = "$sum2" ] && exit 0 if [ "$i" = 2 ]; then echo "Unable to install small kernel for $sys_name!" [ ! -f $to/vmunix.orig ] && exit 1 echo "Restoring default generic kernel..." mv $to/vmunix.orig $to/vmunix sync; sync exit 1 fi done )' # # Subroutine: Before exiting, restore original filesystem mount state # and display appropriate completion message # cleanup='( [ ! "$multi" ] && /etc/umount -at 4.2 > /dev/null 2>&1 if [ -s $tmp/mt_$$ ] && [ ! "$mini" ] ; then do_mt=1 cat $tmp/mt_$$ | while read mountlist; do set $mountlist mt_dev=$1; dir_nm=$2; mt_dir=${top}$dir_nm eval "$get_mtstat" || break done fi rm -f $tmp/*_$$; cd $PWD if [ "$kern_ok" ]; then echo "" echo "The small pre-configured kernel has been installed on:" echo " $kern_ok" [ "$mini" ] && echo "You may reboot your system now." || \ echo "You may reboot the system(s) now." else echo "The small pre-configured kernel has not been installed." fi exit 0 )' # # Mount and verify root partition # cd $files_dir for i in `cat mount_list`; do case $i in partition* ) disk=$i;; mount_pt=/ ) rootdisk=`echo $disk | sed 's/.*=//g'`; break;; *) ;; esac done do_mt=0; mt_dev=/dev/${rootdisk}; mt_dir=${top} eval "$get_mtstat" [ ! "$?" = 0 ] && eval "$cleanup" && exit 1 trap 'echo $script ABORTED!; eval "$cleanup"; exit 1' 1 2 3 15 if [ ! -s $top/sbin/init ] ; then echo \ "${rootdisk} does not appear to be the correct root partition!" eval "$cleanup" && exit 1 fi # # Check if host has non-SCSI disks # If host=server with non-SCSI disks, install on clients only # disk_types=`awk '$1 ~ /^\/dev/ {print $1 }' ${top}/etc/fstab|\ sed 's/^\/dev\///'` if [ "$do_host" ] ; then for i in $disk_types; do case $i in sd*|fd* ) ;; * ) do_host= [ ! "$host_type" = "server" ] && err=1 && break if [ "$default" ] || [ "$clients" ]; then echo "Small kernel not installed on $sys_name." echo "Non-SCSI disk ($i) found..." else err=1 fi break;; esac done fi [ "$err" ] && echo "$wrong_config" && eval "$cleanup" && exit 1 # # Mount all partitions # do_mt=0 awk ' $1 ~ /^\/dev/ { print $1 " " $2}' < ${top}/etc/fstab |\ while read mountlist; do set $mountlist mt_dev=$1; dir_nm=$2; [ "$dir_nm" = "/" ] && continue [ "$dir_nm" = "/pcfs" ] && continue mt_dir=${top}$dir_nm eval "$get_mtstat" && continue eval "$cleanup" && exit 1 done # # Install small kernel to host and verify it. # If kernel can't be installed on server, query for clients. # if [ "$do_host" ] ; then echo -n "Install small kernel on $sys_name? (y/n) " eval "$get_yn" || do_host= fi if [ "$do_host" ]; then to=$top from=${top}/usr/kvm/stand trap '' 1 2 3 15 eval "$do_copy"; stat=$? trap 'echo $script ABORTED!; eval "$cleanup"; exit 1' 1 2 3 15 case $stat in 0) kern_ok="$kern_ok $sys_name" [ ! "$host_type" = "server" ] && eval "$cleanup" && exit 0 ;; *) [ ! "$host_type" = "server" ] && eval "$cleanup"&& exit 1 echo -n "Install small kernel on clients? (y/n) " eval "$get_yn" [ ! "$?" = 0 ] && eval "$cleanup" && exit 1;; esac fi # # Get client info for server installations, using suninstall data files # install_flag='small_kernel=' if [ "$default" ]; then ls client_list.* > $tmp/client_$$ 2>/dev/null if [ ! -s $tmp/client_$$ ] ; then echo "No clients have been set up for this server." eval "$cleanup" && exit 1 fi clnt=`cat client_list.sun*` else clnt=`echo $clients` fi [ ! "$clnt" ] && eval "$cleanup" && exit 0 skip='(small kernel previously installed).' echo "Processing clients..." last_clnt=`echo $clnt | awk '{print $NF}'` for sys_name in $clnt; do cl_info=${files_dir}/client.${sys_name} if [ "$default" ]; then if grep -s ${install_flag}yes $cl_info; then echo \ "Not processed: $sys_name $skip" continue fi fi echo -n "Install small kernel on $sys_name? (y/n) " eval "$get_yn" || continue rpath=`awk -F= '$1 ~ /^root_path$/ {print $2}' $cl_info` to=${top}${rpath} kpath=`awk -F= '$1 ~ /^kvm_path$/ {print $2}' $cl_info` from=${top}${kpath}/stand if [ ! -d $to ]; then echo "Directory $to does not exist." && continue fi trap '' 1 2 3 15 eval "$do_copy"; stat=$? trap 'echo $script ABORTED!; eval "$cleanup"; exit 1' 1 2 3 15 case $stat in 0) sed "s/^\($install_flag\).*/\1yes/" $cl_info > \ $tmp/$cl_info_$$ kern_ok="$kern_ok $sys_name" cp -p $tmp/$cl_info_$$ ${cl_info} [ "$mini" ] && cp -p $tmp/$cl_info_$$ ${top}${cl_info};; *) if [ ! "$sys_name" = "$last_clnt" ] ; then echo -n "Continue with other clients? (y/n) " eval "$get_yn" && continue || break fi eval "$cleanup" && exit 1 esac done eval "$cleanup" && exit 0