166 lines
3.6 KiB
Bash
Executable file
166 lines
3.6 KiB
Bash
Executable file
#!/bin/sh
|
|
#
|
|
# mkboot 2.0 - make boot floppy, make root device bootable, etc.
|
|
# Author: Kees J. Bot
|
|
|
|
trap 'e=$?; rm -f /tmp/mkb.$$; exit $e' 0 2
|
|
|
|
mdec=/usr/mdec # bootstraps
|
|
|
|
# Check arguments.
|
|
case "$#:$1" in
|
|
1:bootable | 1:hdboot | [12]:fdboot )
|
|
action=$1 dev=$2 size=$3
|
|
;;
|
|
*) echo "Usage: $0 [bootable | hdboot | fdboot [device]]" >&2
|
|
exit 1
|
|
esac
|
|
|
|
# Get the device table.
|
|
. /etc/fstab
|
|
|
|
# The real root device may be the RAM disk.
|
|
realroot=`printroot -r`
|
|
|
|
# If it's an initial fstab, pretend root is real root
|
|
if [ $root = "/dev/ROOT" ]
|
|
then root=$realroot
|
|
fi
|
|
|
|
case $action in
|
|
bootable | hdboot)
|
|
# We need the root device.
|
|
|
|
if [ $realroot = $root ]
|
|
then
|
|
rootdir=
|
|
else
|
|
umount $root 2>/dev/null
|
|
mount $root /mnt || exit
|
|
rootdir=/mnt
|
|
fi
|
|
esac
|
|
|
|
case $action in
|
|
bootable)
|
|
# Install the boot monitor on the root device and make it bootable.
|
|
install -cs -m 644 $mdec/boot $rootdir/boot/boot || exit
|
|
sync
|
|
installboot -device $root $mdec/bootblock /boot/boot || exit
|
|
test $realroot != $root && umount $root
|
|
;;
|
|
hdboot)
|
|
# Install a new image on the root device.
|
|
if [ ! -d $rootdir/boot/image ]
|
|
then
|
|
# /boot/image is not yet a directory! Fix it.
|
|
su root -c \
|
|
"exec mv $rootdir/boot/image /M"
|
|
install -d $rootdir/boot/image
|
|
su root -c \
|
|
"exec mv $rootdir/M $rootdir/boot/image/`uname -r`.`uname -v`"
|
|
fi
|
|
|
|
sh tell_config OS_RELEASE . OS_VERSION >/tmp/mkb.$$
|
|
version=`sed 's/[" ]//g;/^$/d' </tmp/mkb.$$`
|
|
|
|
revision=`cat revision 2>/dev/null`
|
|
|
|
if [ -z "$revision" ]
|
|
then rrevision=""
|
|
else rrevision=r$revision
|
|
fi
|
|
|
|
oldrev=$revision
|
|
|
|
target="${version}r${revision}"
|
|
|
|
if [ -z "$revision" ]
|
|
then
|
|
revision=0
|
|
rrevision=""
|
|
elif [ -f $rootdir/boot/image/$target ]
|
|
then
|
|
if [ $rootdir/boot/image/$target -newer image ]
|
|
then
|
|
echo "$root:/boot/image/$target is up to date"
|
|
test $realroot != $root && umount $root
|
|
exit 0
|
|
fi
|
|
revision=`expr $revision + 1`
|
|
rrevision=r$revision
|
|
fi
|
|
target="${version}${rrevision}"
|
|
|
|
set -- `ls -t $rootdir/boot/image`
|
|
|
|
case $# in
|
|
0|1|2|3)
|
|
# Not much there, do not remove a thing.
|
|
;;
|
|
*)
|
|
# Remove the third-newest image in /boot/image, but
|
|
# only if there's an older one (which is kept).
|
|
echo "rm $root:/boot/image/$3"
|
|
rm -f "$rootdir/boot/image/$3"
|
|
esac
|
|
|
|
# Install the new image.
|
|
echo "install image $root:/boot/image/$target"
|
|
install -o root -m 600 image $rootdir/boot/image/$target || exit
|
|
|
|
# Save the revision number.
|
|
test "$revision" != "$oldrev" && echo $revision >revision
|
|
|
|
test $realroot != $root && umount $root
|
|
echo "Done."
|
|
;;
|
|
fdboot)
|
|
# fdboot: Make a boot floppy.
|
|
|
|
if [ -z "$dev" ]
|
|
then
|
|
echo -n \
|
|
"Finish the name of the floppy device to write (by default 'fd0'): /dev/";
|
|
read dev
|
|
case "$dev" in
|
|
'') dev=/dev/fd0
|
|
;;
|
|
/dev/*)
|
|
;;
|
|
*) dev=/dev/$dev
|
|
esac
|
|
fi
|
|
|
|
# Make a file system.
|
|
umount $dev 2>/dev/null
|
|
if mkfs -B 1024 -i 512 $dev
|
|
then :
|
|
else
|
|
echo "mkfs of $dev failed."
|
|
exit 1;
|
|
fi
|
|
|
|
# Install /dev, /boot/boot and /boot/image.
|
|
mount $dev /mnt || exit
|
|
mkdir -p /mnt/boot/image || exit
|
|
cpdir /dev /mnt/dev || exit
|
|
cp -p $mdec/boot /mnt/boot/boot || exit
|
|
cp -p image /mnt/boot/image/ || exit
|
|
umount $dev || exit
|
|
|
|
# Make bootable and copy the boot parameters.
|
|
installboot -d $dev $mdec/bootblock /boot/boot || exit
|
|
pfile=fdbootparams
|
|
if [ -f $pfile ]
|
|
then echo "Using floppy boot parameters from file $pfile."
|
|
edparams $dev "`cat $pfile`" || exit
|
|
else echo "Copying floppy boot parameters from $root."
|
|
dd if=$root of=$dev skip=1 seek=1 count=1 conv=silent || exit
|
|
fi
|
|
edparams $dev 'main(){delay 2000;boot}; save' || exit
|
|
echo "Test kernel installed on $dev"
|
|
;;
|
|
esac
|
|
sync
|
|
exit 0
|