185 lines
4.6 KiB
Bash
Executable file
185 lines
4.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 | 1:cdfdboot )
|
|
action=$1 dev=$2
|
|
;;
|
|
*) echo "Usage: $0 [bootable | hdboot | cdfdboot | 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`
|
|
oldrev=$revision
|
|
target="${version}r${revision}"
|
|
|
|
if [ -z "$revision" ]
|
|
then
|
|
revision=0
|
|
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`
|
|
fi
|
|
target="${version}r${revision}"
|
|
|
|
set -- `ls -t $rootdir/boot/image`
|
|
|
|
case $# in
|
|
0|1)
|
|
# Not much there, do not remove a thing.
|
|
;;
|
|
*)
|
|
# Remove the newest image in /boot/image. This seems strange,
|
|
# but the old image is normally the "stable" image.
|
|
|
|
echo "rm $root:/boot/image/$1"
|
|
rm -f "$rootdir/boot/image/$1"
|
|
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"
|
|
;;
|
|
|
|
cdfdboot)
|
|
# cdfdboot: Make a boot floppy image to go on a CD for booting from.
|
|
dev=/dev/ram
|
|
umount $dev 2>/dev/null
|
|
if mkfs -B 1024 -b 1440 -i 512 $dev || exit 1
|
|
then :
|
|
else
|
|
echo "mkfs of $dev failed."
|
|
exit 1;
|
|
fi
|
|
|
|
# Install /dev, /boot
|
|
mount $dev /mnt || exit 1
|
|
mkdir /mnt/dev
|
|
mkdir /mnt/boot
|
|
mkdir /mnt/boot/image
|
|
( cd /mnt/dev && /usr/src/commands/scripts/MAKEDEV.sh std )
|
|
cp -p image /mnt/boot/image || exit 1
|
|
cp -p ../boot/boot /mnt/boot/boot || exit 1
|
|
umount $dev || exit 1
|
|
installboot -d $dev ../boot/bootblock boot/boot || exit 1
|
|
edparams $dev 'unset bootopts; unset servers; unset image; ramimagedev=c0d2p1; unset rootdev; unset leader; leader() { echo If the system cannot find root, please hit ESC and set your\nramimagedev to the CD device, partition 1. e.g.\nramimagedev=c0d2p1 .. then boot to start.\n\nOtherwise I will boot with my defaults in 10 seconds.\n\n }; bootcd=1; main(){delay 10000;boot}; save' || exit
|
|
# edparams $dev 'unset bootopts; unset servers; unset image; ramimagedev=c0d2p1; unset rootdev; unset leader; bootcd=1; main(){delay 10000;boot}; save' || exit
|
|
|
|
# copy image
|
|
dd if=$dev of=cdfdimage bs=8192 count=180
|
|
esac
|
|
sync
|
|
exit 0
|