daca9de450
ow that the image has grown beyond the 1.44M that fits on a floppy. (previously, the floppy emulation mode was used for cd's.) the boot cd now uses 'no emulation mode,' where an image is provided on the cd that is loaded and executed directly. this is the boot monitor. in order to make this work (the entry point is the same as where the image is loaded, and the boot monitor needs its a.out header too) and keep compatability with the same code being used for regular booting, i prepended 16 bytes that jumps over its header so execution can start there. to be able to read the CD (mostly in order to read the boot image), boot has to use the already present 'extended read' call, but address the CD using 2k sectors.
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
|