minix/tools/mkboot
Ben Gras e248f7c1a3 If the file (created by setup) exists, use boot parameters from there
for the boot floppy instead of copying it from the current root partition.
This makes making a boot floppy at installation time before booting from
the new system possible (conveniently).
2005-05-13 12:27:42 +00:00

173 lines
4.3 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
mkfs -B 1024 -i 512 $dev || exit
# 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
mkfs -B 1024 -b 1440 -i 512 $dev || exit 1
# 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
# copy image
dd if=$dev of=cdfdimage bs=8192 count=180
esac
exit 0