[comp.os.minix] A program for an easy minix hard disk installation

rtregn@immd3.informatik.uni-erlangen.de (Robert Regn) (12/15/88)

I have installed minix on various machines and think the procedure for that
is much too difficult and can only be done by a minix 'guru'. A big danger
is to destroy existing DOS or Xenix Filesystems by specifying a wrong
device (=partition) for mkfs.
I have now a shell script to automatisize the hard disk installation ready.
This is only a first approach. It should be named /.profile. Then it will
be executed on the first root login and all things run well if no errors
occur. It also customizes /etc/rc and /etc/shutdown (earlier posted with
shut.c, now included) and copies things to the ram image medium.
Creating a ram image on the disk is also supported.
It uses further the improved fdisk.c posted on 6. Dec (It isn't
tolerable to must recompile if the disk has more than 4 heads !)
The user must know:
	number of heads
	size of the extended memory (for an AT)
	number of the partitions for minix
For the handling of bad sectors i have fixed dd (the original dies even with
the conv=noerror option) and badblocks (doesn't return 0 if all OK), cdiffs are included.

It would be nice if many people test this script on the next opportunity and
report problems or fix them.

---------------------------------------- cut here ---------------------------
#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of shell archive."
# Contents:  install shutdown dd.c.cdif badblocks.c.cdif
# Wrapped by rtregn@faui32 on Wed Dec 14 17:59:12 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'install' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'install'\"
else
echo shar: Extracting \"'install'\" \(9535 characters\)
sed "s/^X//" >'install' <<'END_OF_FILE'
X#
X# Minix installation script
X# Version 1.0				Author: Robert Regn
X#					rtregn@faui32.uucp
X#					rtregn@immd3.informatik.uni-erlangen.de
X# Fri Dec  16 MET 1988
X#
X# Copyright 1988,89 by Robert Regn, Germany. All rights reserved.
X# This code may be used for personal purposes.
X# It may be freely distributed providing this notice is kept intact.
X# No charge may be made other than resonable charges for reproduction.
X# It may not be sold for profit.
X# The author is not responsible for the consequences of use this software,
X# even if they arise from flaws in it.
X#
X#
X# Needs 10 KB stack in /bin/sh !!!!!
X# should named /.profile 
X# ROOTIM is the partition from which the kernel loads the root filesystem
X#		(depends on boot floppy )
X# PROTORAM is a prototype file for the root filesystem
X# PROFILE is the name of the original root profile
X# Work still to do: support of a second floppy drive, a second hard disk,
X#	badblock handling (problem: dd dies even with noerror),
X#	a program which recognizes the size of extended memory and the number
X#	of heads, handling of various errors
X
XROOTIM=2
XPROTORAM=/usr/ast/proto.ram
XPROFILE=/.prof
XPATH=$PATH:/usr/ast/bin:/etc
Xtrap "echo installation aborted;exit" 2 3
Xif test -f /usr/tmp/config		#after reboot
X	then set `cat /usr/tmp/config`
X	rm /usr/tmp/config
X	n=$1
X	root=$2
X	else
X	echo '	*********************************************************'
X	echo '	*            Minix hard disk installation procedure     *'
X	echo '	*********************************************************'
X#	general check
X#
X	echo
X	echo -n checking disk '   '
X	dd if=/dev/hd0 of=/dev/null bs=7k count=100 2>/tmp/dd.out
X	if grep 'read error' /tmp/dd.out
X		then
X		echo read error on disk
X		echo your disk is not compatible or you have wrong driver in kernel
X		exit
X		else echo OK
X	fi
X	echo Please enter number of heads of disk or 0 if partitions already exists
X	read heads
X	if test "$heads" = ""
X		then heads=0
X	fi
X	if test $heads -ne 0
X		then echo 'Please generate partition for minix (/usr) and'
X		echo "optionally for root filesystem (position $ROOTIM preferred)"
X		fdisk -$heads /dev/hd0
X	fi
X	echo which partition is created for minix - counted from the lowest cylinder
X	echo warning - the number shown by fdisk is NOT necessaryly the partition number
X	echo see doc/READ_ME
X	echo Caution - wrong numbers will destroy data in other partitions
X	read n
X	echo is there a partition for the root image \?
X	echo enter number or 0
X	read root
X
X	if test $root -eq $n
X	then echo you cannot have the same partition for usr and root
X		exit
X	fi
X
X	if test $heads -ne 0
X	then
X#		prepare reboot
X
X		if test ! -d /usr/tmp
X			then mkdir /usr/tmp
X		fi
X		echo $n $root $heads >/usr/tmp/config
X		sync
X		cp /usr/bin/login /bin
X		umount /dev/fd0 2>/dev/null
X		echo OK, now please reboot
X		exit
X	fi
Xfi
X
X#
X#safety checking - we don't want to destroy other filesystems on the disk
X#cooperation with the user necessary
Xfor i in $n $root
X	do dd if=/dev/hd$i of=/tmp/f bs=512 count=1 2>/dev/null
X#	check for dos
X	od -x /tmp/f |head -1 >/tmp/fx
X	if grep 'e[9b] ' /tmp/fx
X		then echo CAUTION partition $i is probably DOS
X		echo -n the OEM name would be: '  '
X		dd if=/tmp/f bs=1 skip=3 count=8 2>/dev/null
X		echo
X		echo will you continue \?
X		read ans
X		if test $ans = n || test $ans = N
X			then exit
X		fi
X	fi
X#	problem: because of the alignment of the partitions to 1k blocks
X#	is hd$i probably 512B to late ->
X#	another check for dos : search boot files in the root directory
X#	translate the attribute code for dir into newline
X#		 fgrep don't work otherwise
X	if dd if=/dev/hd$i bs=1k count=65 2>/dev/null | tr '\21' '\12' | fgrep 'IBMDOS  COM'
X		then echo CAUTION partition $i is probably DOS
X		echo will you continue \?
X		read ans
X		if test $ans = n || test $ans = N
X			then exit
X		fi
X	fi
X
X#	check for Xenix	- grep can't this
X	if fgrep 'boot0: error' /tmp/f
X		then echo CAUTION partition $i is probably Xenix
X		echo will you continue \?
X		read ans
X		if test $ans = n || test $ans = N
X			then exit
X		fi
X	fi
X
Xdone
X
X#		badblock handling
X
Xecho checking partition $n  - may take several minutes
Xdd if=/dev/hd$n of=/dev/null bs=1k 2>/tmp/dd.out
Xif grep 'read error' /tmp/dd.out
X	then echo partition $n has bad blocks
X	echo want you nevertheless use this partition \?
X	read ans
X	if test "$ans" = n
X		then exit
X	fi
X#			recheck partition and list errors
X	echo checking partition $n again - may take several minutes
X	dd if=/dev/hd$n of=/dev/null bs=1k conv=noerror 2>/tmp/dd.err
X#					last two lines are size
X	tail -2 /tmp/dd.err >/tmp/dd.out
X	grep 'records' /tmp/dd.err |sed 's/+.*//' |uniq >/tmp/errors
X	set `wc -l /tmp/errors`
X	err=`expr $1 - 1`		# now remove size line and join lines
X	head -$err /tmp/errors | tr '\12' ' ' >/tmp/err.line
X	mv /tmp/err.line /tmp/errors
X	echo there are $err bad blocks
X	echo '' >>/tmp/errors		#add \n
X	rm /tmp/dd.err
X
X	else echo ready
Xfi
X
Xsize=`head -1 /tmp/dd.out | sed 's/+.*//'`
Xecho partition is  $size KB big
Xif test $size -le 1200
X	then echo this is too small
X	exit
Xfi
X
Xecho generate filesystem on partition $n
Xsleep 3		#if you want stop
X
Xif mkfs /dev/hd$n $size
X	then echo generated
X	else echo error - ask minix guru
X	exit
Xfi
X
Xif test -f /tmp/errors
X	then	if badblocks /dev/hd$n </tmp/errors
X		then :
X		else echo could not mark bad blocks
X#			no return 0 from badblocks yet
X#		exit
X		fi
X	rm /tmp/errors
Xfi
X
X#		set mount points
Xif test ! -d /mnt
X	then mkdir /mnt
Xfi
X
Xif test ! -d /user
X	then mkdir /user
Xfi
X
X#		mount the hard disk
Xif mount /dev/hd$n /mnt
X	then :
X	else echo error in mounting hard disk - ask minix guru
X	exit
Xfi
X#		mkfs sets root of a filesystem to 777 !
Xchmod 755 /mnt
X
Xecho will you copy the files of the /usr floppy onto the disk \?
Xecho please do it except you have a complete backup to restore
X# At this stage of this script you must do it to avoid missing many cmds later
Xread ans
Xif test $ans = y
X	then echo copy files - please wait
X	cpdir -sm /usr /mnt
X	sync
X#	in else  we must copy all necessary commands
X#	e.g. ed mkfs test tar vol cpdir cpio proto.ram
X#	(too much for /dev/ram )
X	else
X	for i in test echo getlf vol cpdir tar
X	do	if test ! -f /bin/$i
X		then	cp /usr/bin/$i /bin
X		fi
X	done
Xfi
X
X#		change to hard disk
X
Xcp $PROTORAM /tmp/proto.ram
Xumount /dev/fd0
Xumount /dev/hd$n 2>/dev/null
Xmount /dev/hd$n /usr 2>/dev/null
Xecho remove /usr floppy
X
X#		restore any files or backups
X
Xecho
Xecho now you should restore all files or backups
Xans=99
Xwhile test "$ans" != 0
X	do echo you can use:
X# putting the next statement later gives a syntax error
X#	echo '	disks with cpio format       	- type c'
X	echo '	disks in tar format          	- type t'
X	echo '	disks with minix filesystems 	- type m'
X	echo if done, type 0
X	read ans
X	case $ans in
X		[tc]*)	echo enter the size of the volumes in KB
X			read size;;
X	esac
X	case $ans in
X		t*)	vol -u $size /dev/at0 |tar x -;;
X		m*)	umount /dev/fd0 2>/dev/null
X			echo what is the target directory for copying \?
X			read dir
X			if test "$dir" = ""
X				then dir=/usr
X			fi
X			getlf "insert disk and hit return"
X			mount /dev/fd0 /mnt
X			cpdir -sm /mnt $dir
X			umount /dev/fd0;;
X#	later :
X		c*)	vol -u $size /dev/at0 |cpio -iBvdm;;
X	esac
Xdone
X
X
X#		install the root image
X
Xif test $root -ne 0
X	then echo
X	echo how big should be the root filesystem \?
X	echo Caution - if you have root filesystem greater 255 KB,
X	echo you must have an AT or 386 with extended memory with a size
X	echo at least of the root filesystem
X	echo -n size of the root partition is: "(wait)   "
X	dd if=/dev/hd$root of=/dev/null bs=1k 2>&1 |head -1 |sed 's/+.*//' >/tmp/dd.out
X	cat /tmp/dd.out
X#	the size of the rootfsys can be greater than the root partition !
X	echo -n size of the root filesystem in KB "?      "
X	read size
X	if test "$size" = ""
X		then size=`cat /tmp/dd.out`
X		echo take $size KB
X	fi
X	if test $size -gt 512
X		then inodes=256
X	elif test $size -gt 255
X		then inodes=128
X	else inodes=96
X	fi
X
X
X
X#	edit /tmp/proto.ram - insert size and inodes
X#	<<- not supported
X	ed - /tmp/proto.ram <<EOF
X		2s/.*/$size $inodes/
X		w
X		q
XEOF
X	mkfs /dev/hd$root /tmp/proto.ram
X#	copy root filesystem
X
X	if mount /dev/hd$root /user
X	then
X		umount /dev/fd0 2>/dev/null
X		getlf "insert root disk and hit return"
X		mount /dev/fd0 /mnt -r 2>/dev/null
X		echo copy root filesystem
X#		errors about special files to null
X		cpdir -sm /mnt /user 2>/dev/null
X		umount /dev/fd0 2>/dev/null
X		umount /dev/hd$root
X		echo remove root disk
X
X		if test $root -ne $ROOTIM
X			then echo you must rebuild the filesystem process with RAM_IMAGE = 0x30$root
X			echo this definition is in filesystem/main.c
X		fi
X		else	echo error - no root image created
X	fi
X	else
X	echo you need 2 disks for booting minix
Xfi
X
X#		password
X#
Xecho
Xecho
Xecho please set a root password
Xpasswd root
X
X#		mount root image medium to make changes permanent
Xif test $root -eq 0
X	then umount /dev/fd0 2>/dev/null
X	getlf "insert root disk and hit return"
X	mount /dev/fd0 /mnt
X	else mount /dev/hd$root /mnt 2>/dev/null
Xfi
Xcp /etc/passwd /mnt/etc/passwd
X
X#		customize /etc/rc and shutdown
Xecho now i customize /etc/rc and shutdown
Xed - /mnt/etc/rc <<EOF
X	/mount/s/[fh]d./hd$n
X	w
X	q
XEOF
Xed - /mnt/etc/shutdown <<EOF
X	/USR/s,=.*,=/dev/hd$n
X	/ROOT/s,=.*,=/dev/hd$root
X	w
X	q
XEOF
Xcp /mnt/etc/shutdown /etc	# for first shut
Xmv /mnt/.profile /mnt/.install
Xmv /.profile /.install
X
X#		install the original profiles
Xcp /$PROFILE /.profile
Xcp /$PROFILE /mnt/.profile
X
Xif test $root -eq 0
X	then umount /dev/fd0
X	echo remove root floppy
X	else umount /dev/hd$root 2>/dev/null
Xfi
X
X#	cleanup
Xrm -f /tmp/f /tmp/fx /tmp/dd.out
Xecho
Xecho '		' INSTALLATION READY
Xecho
Xexit
X
END_OF_FILE
if test 9535 -ne `wc -c <'install'`; then
    echo shar: \"'install'\" unpacked with wrong size!
fi
# end of 'install'
fi
if test -f 'shutdown' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'shutdown'\"
else
echo shar: Extracting \"'shutdown'\" \(382 characters\)
sed "s/^X//" >'shutdown' <<'END_OF_FILE'
XUSR=/dev/hd4
XROOT=/dev/hd2
Xsync
Xsync
X/etc/umount /dev/fd0 2>/dev/null
X/etc/umount /dev/fd1 2>/dev/null
X/etc/umount $ROOT 2>/dev/null
Xcp /usr/bin/echo /tmp
Xcp /usr/bin/true /tmp
Xcp /usr/bin/login /bin
Xif	/etc/umount $USR
X	then	/tmp/echo '			' NORMAL SYSTEM SHUTDOWN
X	while /tmp/true
X	do :
X	done
X	else	/tmp/echo cannot umount hard disk -- please kill processes
X		/tmp/echo type F9
Xfi
END_OF_FILE
if test 382 -ne `wc -c <'shutdown'`; then
    echo shar: \"'shutdown'\" unpacked with wrong size!
fi
# end of 'shutdown'
fi
if test -f 'dd.c.cdif' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'dd.c.cdif'\"
else
echo shar: Extracting \"'dd.c.cdif'\" \(440 characters\)
sed "s/^X//" >'dd.c.cdif' <<'END_OF_FILE'
X*** minix/1.3/a.fertig/commands/dd.c	Tue Oct  4 12:43:04 1988
X--- /tmp/rr/dd.c	Tue Dec 13 15:22:09 1988
X***************
X*** 264,270 ****
X  		ibc = 0;
X  		for (i = 0; i < ibs; i++)
X  			if (ibuf[i] != 0)
X! 				ibs = i;
X  		statistics();
X  	}
X  	if ((ibc == 0) && (--files <= 0)) {
X--- 264,270 ----
X  		ibc = 0;
X  		for (i = 0; i < ibs; i++)
X  			if (ibuf[i] != 0)
X! 				ibc = i;
X  		statistics();
X  	}
X  	if ((ibc == 0) && (--files <= 0)) {
END_OF_FILE
if test 440 -ne `wc -c <'dd.c.cdif'`; then
    echo shar: \"'dd.c.cdif'\" unpacked with wrong size!
fi
# end of 'dd.c.cdif'
fi
if test -f 'badblocks.c.cdif' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'badblocks.c.cdif'\"
else
echo shar: Extracting \"'badblocks.c.cdif'\" \(774 characters\)
sed "s/^X//" >'badblocks.c.cdif' <<'END_OF_FILE'
X*** 1.3/a.fertig/commands/badblocks.c	Tue Oct  4 12:58:48 1988
X--- badblocks.c	Tue Dec 13 17:06:13 1988
X***************
X*** 364,370 ****
X  
X  	modify(cnt);
X  	close(fd);		/* free device */
X! 	done(FILE_EXISTS);
X  }
X  
X  modify(nr_blocks)
X--- 364,370 ----
X  
X  	modify(cnt);
X  	close(fd);		/* free device */
X! 	done(SUCCESS);
X  }
X  
X  modify(nr_blocks)
X***************
X*** 591,598 ****
X  int nr;
X  {
X  	switch(nr) {
X- 	case FILE_EXISTS:	unlink(file_name);
X  	case SUCCESS:
X  	case DEV_MOUNTED: 	umount(dev_name);
X  	case DIR_CREATED:	unlink(dir_name);
X  	case HARMLESS: ;
X--- 591,598 ----
X  int nr;
X  {
X  	switch(nr) {
X  	case SUCCESS:
X+ 	case FILE_EXISTS:	unlink(file_name);
X  	case DEV_MOUNTED: 	umount(dev_name);
X  	case DIR_CREATED:	unlink(dir_name);
X  	case HARMLESS: ;
END_OF_FILE
if test 774 -ne `wc -c <'badblocks.c.cdif'`; then
    echo shar: \"'badblocks.c.cdif'\" unpacked with wrong size!
fi
# end of 'badblocks.c.cdif'
fi
echo shar: End of shell archive.
exit 0

Robert Regn					Germany
rtregn@faui32.uucp				Tel: 09131 857913
rtregn@immd3.informatik.uni-erlangen.de