minix/commands/scripts/setup.sh
2005-07-26 13:14:59 +00:00

391 lines
10 KiB
Bash
Executable file

#!/bin/sh
#
# setup 4.1 - install a Minix distribution Author: Kees J. Bot
# 20 Dec 1994
PATH=/bin:/usr/bin
export PATH
usage()
{
cat >&2 <<'EOF'
Usage: setup # Install a skeleton system on the hard disk.
setup /usr # Install the rest of the system (binaries or sources).
# To install from other things then floppies:
urlget http://... | setup /usr # Read from a web site.
urlget ftp://... | setup /usr # Read from an FTP site.
mtools copy c0d0p0:... - | setup /usr # Read from the C: drive.
dosread c0d0p0 ... | setup /usr # Likewise if no mtools.
EOF
exit 1
}
# No options.
while getopts '' opt; do usage; done
shift `expr $OPTIND - 1`
if [ "$USER" != root ]
then echo "Please run setup as root."
exit 1
fi
# Installing Minix on the hard disk.
case "$0" in
/tmp/*)
rm -f "$0"
;;
*) cp -p "$0" /tmp/setup
exec /tmp/setup
esac
# Find out what we are running from.
exec 9<&0 </etc/mtab # Mounted file table.
read thisroot rest # Current root (/dev/ram or /dev/fd?)
read fdusr rest # USR (/dev/fd? or /dev/fd?p2)
exec 0<&9 9<&-
# What do we know about ROOT?
case $thisroot:$fdusr in
/dev/ram:/dev/fd0p2) fdroot=/dev/fd0 # Combined ROOT+USR in drive 0
;;
/dev/ram:/dev/fd1p2) fdroot=/dev/fd1 # Combined ROOT+USR in drive 1
;;
/dev/ram:/dev/fd*) fdroot=unknown # ROOT is some other floppy
;;
/dev/fd*:/dev/fd*) fdroot=$thisroot # ROOT is mounted directly
;;
*) fdroot=$thisroot # ?
esac
echo -n "\
This is the Minix installation script.
Note 1: If the screen blanks suddenly then hit CTRL+F3 to select \"software
scrolling\".
Note 2: If things go wrong then hit DEL and start over.
Note 3: The installation procedure is described in the manual page
usage(8). It will be hard without it.
Note 4: Some questions have default answers, like this: [y]
Simply hit RETURN (or ENTER) if you want to choose that answer.
Note 5: If you see a colon (:) then you should hit RETURN to continue.
:"
read ret
echo "
What type of keyboard do you have? You can choose one of:
"
ls -C /usr/lib/keymaps | sed -e 's/\.map//g' -e 's/^/ /'
echo -n "
Keyboard type? [us-std] "; read keymap
test -n "$keymap" && loadkeys "/usr/lib/keymaps/$keymap.map"
echo -n "Welcome to Minix partitioning. Do you want to
follow the (A)utomatic or the e(X)pert mode? Expert mode drops
you into part to let you edit your partition table to taste.
Automatic mode is much easier, but can't handle all cases. In
cases it can't handle, it will tell you to use expert mode.
Please choose, A for Automatic, or X for Expert: "
read ch
case "$ch" in
[Aa]*) auto="1" ;;
[Xx]*) auto="" ;;
*) echo "Unrecognized response."; exit 1;
esac
primary=
if [ -z "$auto" ]
then
# Expert mode
echo -n "
Minix needs one primary partition of at about 210 MB for a full install
with sources. (The full install also fits in about 180 MB, but it
needs more if fully recompiled. Add more space to taste.)
* Minix currently only understands filesystems up to 4GB, so don't make
it bigger.
If there is no free space on your disk then you have to back up one of the
other partitions, shrink, and reinstall. See the appropriate manuals of the
the operating systems currently installed. Restart your Minix installation
after you have made space.
To make this partition you will be put in the editor \"part\". Follow the
advice under the '!' key to make a new partition of type MINIX. Do not
touch an existing partition unless you know precisely what you are doing!
Please note the name of the partition (e.g. c0d0p1, c0d1p3, c1d1p0) you
make. (See the devices section in usage(8) on Minix device names.)
:"
read ret
while [ -z "$primary" ]
do
part || exit
echo -n "
Please finish the name of the primary partition you have created:
(Just type RETURN if you want to rerun \"part\") /dev/"
read primary
done
else
# Automatic mode
while [ -z "$primary" ]
do
PF="/tmp/pf"
echo -n "Press return to enter the autopart tool, or DEL to abort.
:"
read ret
if autopart -f$PF
then if [ -s "$PF" ]
then
bd="`cat $PF`"
if [ -b "/dev/$bd" ]
then primary="$bd"
else echo "Funny device $bd from autopart."
fi
else
echo "Didn't find output from autopart."
fi
else echo "Autopart tool failed. Trying again."
fi
done
fi
root=${primary}s0
swap=${primary}s1
usr=${primary}s2
hex2int()
{
# Translate hexadecimal to integer.
local h d i
h=$1
i=0
while [ -n "$h" ]
do
d=$(expr $h : '\(.\)')
h=$(expr $h : '.\(.*\)')
d=$(expr \( 0123456789ABCDEF : ".*$d" \) - 1)
i=$(expr $i \* 16 + $d)
done
echo $i
}
# Ask user about networking
echo ""
echo "Minix currently supports the Intel Pro/100 and RealTek 8139 "
echo "Ethernet cards. Please choose: "
echo ""
echo "0. No Ethernet card (no networking)"
echo "1. An Intel Pro/100 Ethernet card is installed"
echo "2. A Realtek 8139 Ethernet card is installed"
echo "3. A different Ethernet card is installed (no networking)"
echo ""
echo "You can always change your mind after the install."
echo ""
echo -n "Choice? "
read eth
driver=""
inetparams=""
case "$eth" in
1) driver=FXP; inetparams="servers=inet;" ;;
2) driver=RTL8139; inetparams="servers=inet;" ;;
esac
# Compute the amount of memory available to Minix.
memsize=0
ifs="$IFS"
IFS=','
set -- $(sysenv memory)
IFS="$ifs"
for mem
do
mem=$(expr $mem : '.*:\(.*\)')
memsize=$(expr $memsize + $(hex2int $mem) / 1024)
done
# Compute an advised swap size.
swapadv=0
case `arch` in
i86)
test $memsize -lt 4096 && swapadv=$(expr 4096 - $memsize)
;;
*) test $memsize -lt 6144 && swapadv=$(expr 6144 - $memsize)
esac
blockdefault=8
echo "\
The default block size on the disk is $blockdefault KB. However, sizes of 1 to $blockdefault KB
are also supported. If you have a small disk or small RAM you may want less
than $blockdefault KB, in which case type a block size from 1 to 8 (1, 2, 4 or $blockdefault are
suggested values). Otherwise hit ENTER for the default of $blockdefault KB blocks, which
should be fine in most cases."
while [ -z "$blocksize" ]
do echo -n "Block size [$blockdefault KB]? "
read blocksize
if [ -z "$blocksize" ]
then blocksize=$blockdefault
fi
if [ $blocksize -gt $blockdefault -o $blocksize -lt 1 ]
then echo "$blocksize bogus block size. 1-$blockdefault please."
blocksize=""
fi
done
blocksizebytes="`expr $blocksize '*' 1024`"
echo -n "
How much swap space would you like? Swapspace is only needed if this
system is memory starved, like a 16-bit system with less then 2M, or a
32-bit system with less then 4M. Minix swapping isn't very good yet, so
there is no need for it otherwise.
Size in kilobytes? [$swapadv] "
swapsize=
read swapsize
test -z "$swapsize" && swapsize=$swapadv
echo -n "
You have created a partition named: /dev/$primary
The following subpartitions are about to be created on /dev/$primary:
Root subpartition: /dev/$root 16 MB
Swap subpartition: /dev/$swap $swapsize kb
/usr subpartition: /dev/$usr rest of $primary
Hit return if everything looks fine, or hit DEL to bail out if you want to
think it over. The next step will destroy /dev/$primary.
:"
read ret
# Secondary master bootstrap.
installboot -m /dev/$primary /usr/mdec/masterboot >/dev/null || exit
# Partition the primary.
p3=0:0
test "$swapsize" -gt 0 && p3=81:`expr $swapsize \* 2`
partition /dev/$primary 1 81:32768* $p3 81:0+ || exit
if [ "$swapsize" -gt 0 ]
then
# We must have that swap, now!
mkswap -f /dev/$swap || exit
mount -s /dev/$swap || exit
else
# Forget about swap.
swap=
fi
echo "
Migrating to disk...
"
mkfs -B $blocksizebytes /dev/$usr
echo "\
Scanning /dev/$usr for bad blocks. (Hit DEL to stop the scan if you are
absolutely sure that there can not be any bad blocks. Otherwise just wait.)"
trap ': nothing' 2
readall -b /dev/$usr | sh
sleep 2
trap 2
mount /dev/$usr /mnt || exit # Mount the intended /usr.
cpdir -v /usr /mnt || exit # Copy the usr floppy.
umount /dev/$usr || exit # Unmount the intended /usr.
umount $fdusr # Unmount the /usr floppy.
mount /dev/$usr /usr || exit # A new /usr
if [ $fdroot = unknown ]
then
echo "
By now the floppy USR has been copied to /dev/$usr, and it is now in use as
/usr. Please insert the installation ROOT floppy in a floppy drive."
drive=
while [ -z "$drive" ]
do
echo -n "What floppy drive is it in? [0] "; read drive
case $drive in
'') drive=0
;;
[01])
;;
*) echo "It must be 0 or 1, not \"$drive\"."
drive=
esac
done
fdroot=/dev/fd$drive
fi
echo "
Copying $fdroot to /dev/$root
"
mkfs -B $blocksizebytes /dev/$root || exit
mount /dev/$root /mnt || exit
# Running from the installation CD.
cpdir -vx / /mnt || exit
chmod 555 /mnt/usr
# CD remnants that aren't for the installed system
rm /mnt/etc/issue /mnt/CD 2>/dev/null
# Change /etc/fstab.
echo >/mnt/etc/fstab "\
# Poor man's File System Table.
root=/dev/$root
${swap:+swap=/dev/$swap}
usr=/dev/$usr"
# National keyboard map.
test -n "$keymap" && cp -p "/usr/lib/keymaps/$keymap.map" /mnt/etc/keymap
# Set inet.conf to correct driver
if [ -n "$driver" ]
then echo "eth0 $driver 0 { default; };" >/mnt/etc/inet.conf
fi
umount /dev/$root || exit # Unmount the new root.
# Compute size of the second level file block cache.
case `arch` in
i86)
cache=`expr "0$memsize" - 1024`
test $cache -lt 32 && cache=0
test $cache -gt 512 && cache=512
;;
*)
cache=`expr "0$memsize" - 2560`
test $cache -lt 64 && cache=0
test $cache -gt 1024 && cache=1024
esac
echo "Second level file system block cache set to $cache kb."
if [ $cache -eq 0 ]; then cache=; else cache="ramsize=$cache"; fi
# Make bootable.
installboot -d /dev/$root /usr/mdec/bootblock /boot/boot >/dev/null || exit
edparams /dev/$root "rootdev=$root; ramimagedev=$root; $cache; $inetparams; main() { delay 2000; boot }; save" || exit
pfile="/usr/src/tools/fdbootparams"
echo "Remembering boot parameters in ${pfile}."
echo "rootdev=$root; ramimagedev=$root; $cache; save" >$pfile || exit
sync
echo "
Please type 'shutdown' to exit Minix.
You can type 'boot $primary' to try the newly installed Minix system. See
\"TESTING\" in the usage manual."