302 lines
6.2 KiB
Bash
302 lines
6.2 KiB
Bash
|
#!/bin/sh
|
||
|
#
|
||
|
# mkdist 3.6 - Make a Minix distribution Author: Kees J. Bot
|
||
|
# 20 Dec 1994
|
||
|
|
||
|
system=`uname`
|
||
|
|
||
|
usage()
|
||
|
{
|
||
|
case $system in
|
||
|
Minix) echo "Usage: $0" >&2
|
||
|
;;
|
||
|
Minix-vmd) echo "Usage: $0 base-path root-device usr-device" >&2
|
||
|
esac
|
||
|
exit 1
|
||
|
}
|
||
|
|
||
|
# No options.
|
||
|
while getopts '' opt; do usage; done
|
||
|
shift `expr $OPTIND - 1`
|
||
|
|
||
|
case $system:$# in
|
||
|
Minix:0)
|
||
|
# Interactive.
|
||
|
case "$0" in
|
||
|
/tmp/*)
|
||
|
rm -f "$0"
|
||
|
;;
|
||
|
*) # Move out of /usr.
|
||
|
cp -p "$0" /tmp/mkdist
|
||
|
exec /tmp/mkdist
|
||
|
esac
|
||
|
std=t
|
||
|
base=/
|
||
|
export PATH=/bin:/usr/bin
|
||
|
;;
|
||
|
Minix-vmd:3)
|
||
|
# Called by an external script from Minix-vmd to help make a distribution.
|
||
|
std=
|
||
|
base="$1" rootdev="$2" usrdev="$3"
|
||
|
esac
|
||
|
|
||
|
usrlist="
|
||
|
bin
|
||
|
bin/MAKEDEV
|
||
|
bin/arch
|
||
|
bin/badblocks
|
||
|
bin/chmod
|
||
|
bin/clone
|
||
|
bin/compress
|
||
|
bin/cp
|
||
|
bin/cpdir
|
||
|
bin/df
|
||
|
`test -f $base/usr/bin/mtools || echo bin/dosdir bin/dosread bin/doswrite`
|
||
|
`test -f $base/usr/bin/mtools && echo bin/mtools`
|
||
|
bin/edparams
|
||
|
bin/getty
|
||
|
bin/grep
|
||
|
bin/installboot
|
||
|
bin/isodir
|
||
|
bin/isoinfo
|
||
|
bin/isoread
|
||
|
bin/kill
|
||
|
bin/ln
|
||
|
bin/login
|
||
|
bin/ls
|
||
|
bin/mined
|
||
|
bin/mkdir
|
||
|
bin/mkfs
|
||
|
bin/mknod
|
||
|
bin/mkswap
|
||
|
bin/mv
|
||
|
bin/od
|
||
|
bin/part
|
||
|
bin/partition
|
||
|
bin/readall
|
||
|
bin/repartition
|
||
|
bin/rm
|
||
|
bin/rmdir
|
||
|
bin/sed
|
||
|
bin/setup
|
||
|
bin/shutdown
|
||
|
bin/sleep
|
||
|
bin/sort
|
||
|
bin/stty
|
||
|
bin/sysenv
|
||
|
bin/tar
|
||
|
bin/uname
|
||
|
bin/uncompress
|
||
|
bin/update
|
||
|
bin/vol
|
||
|
bin/zcat
|
||
|
etc
|
||
|
etc/rc
|
||
|
lib
|
||
|
lib/keymaps
|
||
|
`cd $base/usr && echo lib/keymaps/*`
|
||
|
lib/pwdauth
|
||
|
mdec
|
||
|
mdec/boot
|
||
|
mdec/bootblock
|
||
|
mdec/jumpboot
|
||
|
mdec/masterboot
|
||
|
tmp
|
||
|
"
|
||
|
|
||
|
if [ "$std" ]
|
||
|
then
|
||
|
# Find the root device, and the real root device.
|
||
|
. /etc/fstab
|
||
|
realroot=`printroot -r`
|
||
|
if [ $realroot = $root ]
|
||
|
then
|
||
|
rootdir=/
|
||
|
else
|
||
|
umount $root >/dev/null 2>&1
|
||
|
mount $root /root || exit
|
||
|
rootdir=/root
|
||
|
fi
|
||
|
|
||
|
echo -n "
|
||
|
The installation root and /usr can be put on either one diskette of at least
|
||
|
1.2 Mb, or on two diskettes of at least 720 kb.
|
||
|
|
||
|
Do you want to use a single diskette of at least 1.2 Mb? [y] "; read single
|
||
|
|
||
|
case $single in
|
||
|
''|[yY]*|sure)
|
||
|
single=t
|
||
|
;;
|
||
|
*) single=
|
||
|
esac
|
||
|
|
||
|
echo -n "Which drive to use? [0] "; read drive
|
||
|
|
||
|
case $drive in
|
||
|
'') drive=0
|
||
|
;;
|
||
|
[01]) ;;
|
||
|
*) echo "Please type '0' or '1'" >&2; exit 1
|
||
|
esac
|
||
|
|
||
|
if [ "$single" ]
|
||
|
then
|
||
|
echo -n "Insert the root+usr diskette in drive $drive and hit RETURN"
|
||
|
else
|
||
|
echo -n "Insert the root diskette in drive $drive and hit RETURN"
|
||
|
fi
|
||
|
read ret
|
||
|
|
||
|
rootdev=/dev/fd$drive
|
||
|
v1=-1
|
||
|
else
|
||
|
rootdir=$base
|
||
|
v1='-t 1'
|
||
|
fi
|
||
|
|
||
|
umount $rootdev 2>/dev/null
|
||
|
if [ "$std" ]
|
||
|
then
|
||
|
umount ${rootdev}p1 2>/dev/null
|
||
|
umount ${rootdev}p2 2>/dev/null
|
||
|
else
|
||
|
umount $rootdir/minix 2>/dev/null
|
||
|
umount $rootdir/etc 2>/dev/null
|
||
|
fi
|
||
|
mkfs $v1 -i 272 $rootdev 480 || exit
|
||
|
mount $rootdev /mnt || exit
|
||
|
if [ "$std" ]
|
||
|
then
|
||
|
partition -mf $rootdev 0 81:960 81:240 81:240 >/dev/null || exit
|
||
|
repartition $rootdev >/dev/null || exit
|
||
|
mkfs $v1 ${rootdev}p1 || exit
|
||
|
mkfs $v1 ${rootdev}p2 || exit
|
||
|
mount ${rootdev}p1 $rootdir/minix || exit # Hide /minix and /etc
|
||
|
mount ${rootdev}p2 $rootdir/etc 2>/dev/null # (complains about /etc/mtab)
|
||
|
else
|
||
|
install -d /tmp/.minix || exit
|
||
|
install -d /tmp/.etc || exit # Hide /minix and /etc
|
||
|
mount -t lo /tmp/.minix $rootdir/minix || exit
|
||
|
mount -t lo /tmp/.etc $rootdir/etc || exit
|
||
|
fi
|
||
|
cpdir -vx $rootdir /mnt || exit
|
||
|
install -d -o 0 -g 0 -m 755 /mnt || exit
|
||
|
install -d -o 0 -g 0 -m 555 /mnt/root || exit
|
||
|
install -d -o 0 -g 0 -m 555 /mnt/mnt || exit
|
||
|
install -d -o 0 -g 0 -m 555 /mnt/usr || exit
|
||
|
if [ "$std" ]
|
||
|
then
|
||
|
umount ${rootdev}p2 2>/dev/null # Unhide /etc
|
||
|
umount ${rootdev}p1 || exit # Unhide /minix
|
||
|
else
|
||
|
umount $rootdir/etc || exit # Unhide /etc
|
||
|
umount $rootdir/minix || exit # Unhide /minix
|
||
|
fi
|
||
|
install -d -o 2 -g 0 -m 755 /mnt/minix || exit
|
||
|
install -d -o 2 -g 0 -m 755 /mnt/etc || exit
|
||
|
set `ls -t $rootdir/minix` # Install the latest kernel
|
||
|
install -c $rootdir/minix/$1 /mnt/minix/`echo $1 | sed 's/r[0-9]*$//` || exit
|
||
|
cpdir -v $base/usr/src/etc /mnt/etc || exit # Install a fresh /etc
|
||
|
chown -R 0:0 /mnt/etc # Patch up owner and mode
|
||
|
chmod 600 /mnt/etc/shadow
|
||
|
|
||
|
# Change /etc/fstab.
|
||
|
echo >/mnt/etc/fstab "\
|
||
|
# Poor man's File System Table.
|
||
|
|
||
|
root=unknown
|
||
|
usr=unknown"
|
||
|
|
||
|
# How to install?
|
||
|
echo >/mnt/etc/issue "\
|
||
|
|
||
|
Login as root and run 'setup' to install Minix."
|
||
|
|
||
|
umount $rootdev || exit
|
||
|
test "$std" && umount $root 2>/dev/null
|
||
|
installboot -d $rootdev $base/usr/mdec/bootblock boot >/dev/null
|
||
|
|
||
|
# Partition the root floppy whether necessary or not. (Two images can be
|
||
|
# concatenated, or a combined image can be split later.)
|
||
|
partition -mf $rootdev 0 81:960 0:0 81:1440 81:480 >/dev/null || exit
|
||
|
|
||
|
if [ "$std" ]
|
||
|
then
|
||
|
if [ "$single" ]
|
||
|
then
|
||
|
repartition $rootdev >/dev/null
|
||
|
usrdev=${rootdev}p2
|
||
|
else
|
||
|
echo -n "Insert the usr diskette in drive $drive and hit RETURN"
|
||
|
read ret
|
||
|
usrdev=$rootdev
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
mkfs $v1 -i 96 $usrdev 720 || exit
|
||
|
mount $usrdev /mnt || exit
|
||
|
install -d -o 0 -g 0 -m 755 /mnt || exit
|
||
|
(cd $base/usr && exec tar cfD - $usrlist) | (cd /mnt && exec tar xvfp -) || exit
|
||
|
umount $usrdev || exit
|
||
|
|
||
|
# Put a "boot the other drive" bootblock on the /usr floppy.
|
||
|
installboot -m $usrdev /usr/mdec/masterboot >/dev/null
|
||
|
|
||
|
# We're done for Minix-vmd here, it has its own ideas on how to package /usr.
|
||
|
test "$std" || exit 0
|
||
|
|
||
|
# Guess the size of /usr in compressed form. Assume compression down to 60%
|
||
|
# of the original size. Use "disk megabytes" of 1000*1024 for a safe guess.
|
||
|
set -$- `df | grep "^$usr"`
|
||
|
size=`expr \\( $4 \\* 6 / 10 + 999 \\) / 1000`
|
||
|
|
||
|
echo -n "
|
||
|
You now need enough diskettes to hold /usr in compressed form, close to
|
||
|
$size Mb total. "
|
||
|
|
||
|
size=
|
||
|
while [ -z "$size" ]
|
||
|
do
|
||
|
if [ "$single" ]; then defsize=1440; else defsize=720; fi
|
||
|
|
||
|
echo -n "What is the size of the diskettes? [$defsize] "; read size
|
||
|
|
||
|
case $size in
|
||
|
'') size=$defsize
|
||
|
;;
|
||
|
360|720|1200|1440)
|
||
|
;;
|
||
|
*) echo "Sorry, I don't believe \"$size\", try again." >&2
|
||
|
size=
|
||
|
esac
|
||
|
done
|
||
|
|
||
|
drive=
|
||
|
while [ -z "$drive" ]
|
||
|
do
|
||
|
echo -n "What floppy drive to use? [0] "; read drive
|
||
|
|
||
|
case $drive in
|
||
|
'') drive=0
|
||
|
;;
|
||
|
[01])
|
||
|
;;
|
||
|
*) echo "It must be 0 or 1, not \"$drive\"."
|
||
|
drive=
|
||
|
esac
|
||
|
done
|
||
|
|
||
|
echo "
|
||
|
Enter the floppies in drive $drive when asked to. Mark them with the volume
|
||
|
numbers!
|
||
|
"
|
||
|
sleep 2
|
||
|
|
||
|
if [ `arch` = i86 ]; then bits=13; else bits=16; fi
|
||
|
|
||
|
>/tmp/DONE
|
||
|
cd /usr && tar cvf - . /tmp/DONE \
|
||
|
| compress -b$bits | vol -w $size /dev/fd$drive &&
|
||
|
echo Done.
|