213 lines
4.8 KiB
Bash
Executable file
213 lines
4.8 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 | [123]:cdfdboot )
|
|
action=$1 dev=$2 size=$3
|
|
;;
|
|
*) echo "Usage: $0 [bootable | hdboot | fdboot [device]] | cdfdboot [device [size]]" >&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"
|
|
;;
|
|
|
|
cdfdboot)
|
|
# cdfdboot: Make a boot floppy image to go on a CD for booting from.
|
|
if [ -z "$dev" ]
|
|
then
|
|
ramdisk `expr 1440 \* 1024` 2>/dev/null
|
|
dev=/dev/ram
|
|
fi
|
|
if [ -z "$size" ]
|
|
then
|
|
size=1440
|
|
fi
|
|
umount $dev 2>/dev/null
|
|
if mkfs -B 1024 -b $size -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 && sh /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 rootdev;
|
|
unset leader;
|
|
unset image;
|
|
disable=inet;
|
|
bootcd=1;
|
|
cdproberoot=1;
|
|
ata_id_timeout=2;
|
|
bootbig(1, Regular MINIX 3) { unset image; boot }
|
|
leader() { echo \n--- Welcome to MINIX 3. This is the boot monitor. ---\n\nChoose an option from the menu or press ESC if you need to do anything special.\nOtherwise I will boot with my defaults in 10 seconds.\n\n };
|
|
main(){trap 10000 boot; menu; };
|
|
save' || exit
|
|
|
|
# copy image
|
|
dd if=$dev of=cdfdimage bs=1024 count=$size
|
|
esac
|
|
sync
|
|
exit 0
|