Bootloader reinstall mode for setup.
This commit is contained in:
parent
72eca0eb1e
commit
9290237811
1 changed files with 210 additions and 24 deletions
|
@ -74,6 +74,34 @@ warn()
|
||||||
echo -e "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b ! $1"
|
echo -e "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b ! $1"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
check_mbr()
|
||||||
|
{
|
||||||
|
# check for potential problems with old mbr.
|
||||||
|
disk=`echo -n "/dev/$primary" | sed 's/p[0-3]//'`
|
||||||
|
minix_primaries=`echo -n "" | fdisk "$disk" | grep "MINIX" | wc -l`
|
||||||
|
if [ "$minix_primaries" -gt 1 ]
|
||||||
|
then
|
||||||
|
# old mbr + bootxx will not work with several partitions of
|
||||||
|
# the same type.
|
||||||
|
dd if=/usr/mdec/mbr of=temp_mbr_netbsd bs=1 count=440 2>/dev/null
|
||||||
|
dd if="$disk" bs=1 count=440 2>/dev/null | cmp - temp_mbr_netbsd >/dev/null
|
||||||
|
if [ "$?" -ne 0 ]
|
||||||
|
then
|
||||||
|
echo ""
|
||||||
|
echo "Warning: you have MBR which doesn't support multiple MINIX 3 partitions!"
|
||||||
|
echo "You will be able to boot from the first one only!"
|
||||||
|
echo -n "Do you want to install new MBR into $disk? [Y] "
|
||||||
|
read ok
|
||||||
|
if [ "$ok" = Y -o "$ok" = y -o "$ok" = "" ]
|
||||||
|
then
|
||||||
|
installboot_nbsd -m "$disk" /usr/mdec/mbr >/dev/null
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
rm temp_mbr_netbsd
|
||||||
|
fi
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
# No options.
|
# No options.
|
||||||
while getopts '' opt; do usage; done
|
while getopts '' opt; do usage; done
|
||||||
shift `expr $OPTIND - 1`
|
shift `expr $OPTIND - 1`
|
||||||
|
@ -323,13 +351,15 @@ echo " --- Step 4: Reinstall choice ------------------------------------------"
|
||||||
echo "You have selected an existing MINIX 3 partition."
|
echo "You have selected an existing MINIX 3 partition."
|
||||||
echo "Type F for full installation (to overwrite entire partition)"
|
echo "Type F for full installation (to overwrite entire partition)"
|
||||||
echo "Type R for a reinstallation (existing /home will not be affected)"
|
echo "Type R for a reinstallation (existing /home will not be affected)"
|
||||||
|
echo "Type B to reinstall/upgrade bootloader (no data affected)"
|
||||||
echo ""
|
echo ""
|
||||||
echo -n "(F)ull or (R)einstall? [R] "
|
echo -n "(F)ull, (R)einstall or (B)ootloader install? [R] "
|
||||||
read conf
|
read conf
|
||||||
case "$conf" in
|
case "$conf" in
|
||||||
"") confirm="ok"; auto="r"; ;;
|
"") confirm="ok"; auto="r"; ;;
|
||||||
[Rr]*) confirm="ok"; auto="r"; ;;
|
[Rr]*) confirm="ok"; auto="r"; ;;
|
||||||
[Ff]*) confirm="ok"; auto="" ;;
|
[Ff]*) confirm="ok"; auto="" ;;
|
||||||
|
[Bb]*) confirm="ok"; bootreinstall="ok" ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
else echo ""
|
else echo ""
|
||||||
|
@ -340,6 +370,184 @@ echo " --- Step 4: Reinstall choice ------------------------------------------"
|
||||||
|
|
||||||
done
|
done
|
||||||
|
|
||||||
|
if [ "$bootreinstall" = "ok" ]
|
||||||
|
then
|
||||||
|
echo ""
|
||||||
|
echo " --- Step 5: Reinstall bootloader ----------------------------------"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "WARNING: This procedure uses your current /usr to store your /."
|
||||||
|
echo "Once the procedure starts, it has to finish"
|
||||||
|
echo "to restore your / partition. Please make sure it is not interrupted."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -n "It's recommended to run fsck before you continue, run? [Y/n] "
|
||||||
|
read ok
|
||||||
|
if [ "$ok" = "y" -o "$ok" = "Y" -o "$ok" = "" ]
|
||||||
|
then
|
||||||
|
fsck.mfs -a "/dev/$root" >/dev/null
|
||||||
|
fsck.mfs -a "/dev/$usr" >/dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If there is no ELF stuff and not enough space after repartitioning,
|
||||||
|
# user will fall into trouble. So at first copy new stuff.
|
||||||
|
mount "/dev/$root" /mnt >/dev/null || exit
|
||||||
|
|
||||||
|
# grep, stat, etc in chroot
|
||||||
|
mount "/dev/$usr" /mnt/usr >/dev/null || exit
|
||||||
|
|
||||||
|
cp -pf /bin/update_bootcfg /mnt/bin/ && \
|
||||||
|
cp -pf /etc/boot.cfg.default /mnt/etc/ && \
|
||||||
|
cp -pf /boot_monitor /mnt/ || exit
|
||||||
|
|
||||||
|
if [ ! -d /mnt/boot/minix_default -o ! -r /mnt/boot/minix_default/kernel ]
|
||||||
|
then
|
||||||
|
if [ -r /mnt/boot.cfg ]
|
||||||
|
then
|
||||||
|
echo ""
|
||||||
|
echo "There is no /boot/minix_default/, but /boot.cfg exists."
|
||||||
|
echo -n "Do you want to copy minix_default from CD? [Y/n] "
|
||||||
|
else
|
||||||
|
echo ""
|
||||||
|
echo -n "There is no /boot/minix_default/, do you want to copy it from CD? [Y/n] "
|
||||||
|
fi
|
||||||
|
read ok
|
||||||
|
if [ "$ok" = "y" -o "$ok" = "Y" -o "$ok" = "" ]
|
||||||
|
then
|
||||||
|
if [ -e /mnt/boot/minix_default ]
|
||||||
|
then
|
||||||
|
echo "Old /boot/minix_default moved to /boot/minix_default_old"
|
||||||
|
mv /mnt/boot/minix_default /mnt/boot/minix_default_old
|
||||||
|
fi
|
||||||
|
|
||||||
|
cp -rfp /boot/minix_default /mnt/boot/ || exit
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo " * Updating /boot.cfg"
|
||||||
|
|
||||||
|
chroot /mnt update_bootcfg
|
||||||
|
|
||||||
|
umount /mnt/usr && umount /mnt || exit
|
||||||
|
|
||||||
|
# Check if enough space for new boot
|
||||||
|
let bootspace=`devsize /dev/$primary`-`devsize /dev/$root`-`devsize /dev/$home`-`devsize /dev/$usr` >/dev/null
|
||||||
|
if [ $bootspace -lt $BOOTXXSECTS ]
|
||||||
|
then
|
||||||
|
echo ""
|
||||||
|
echo "Root partition size will be reduced by up to 16Kb to fit new bootloader."
|
||||||
|
echo "This is not a problem."
|
||||||
|
|
||||||
|
free_space=`df /dev/$root | awk '{print $3}' | tail -n 1`
|
||||||
|
# round 16 => 20
|
||||||
|
if [ "$free_space" -le 20 ]
|
||||||
|
then
|
||||||
|
echo ""
|
||||||
|
echo "Not enough space on /dev/$root, you need at least 20Kb to use new bootloader!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
ROOTSECTS=`expr \`devsize /dev/$root\` - $BOOTXXSECTS + $bootspace`
|
||||||
|
|
||||||
|
free_space=`df /dev/$usr | awk '{print $3}' | tail -n 1`
|
||||||
|
required_space=`df /dev/$root | awk '{print $4}' | tail -n 1`
|
||||||
|
|
||||||
|
if [ "$required_space" -gt "$free_space" ]
|
||||||
|
then
|
||||||
|
echo ""
|
||||||
|
echo "You don't have enough free space on /dev/$usr to backup /dev/$root!"
|
||||||
|
echo "${free_space}Kb available, ${required_space} required."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir /mnt/root && mkdir /mnt/usr || exit
|
||||||
|
|
||||||
|
echo "Re-mounting your current / and /usr"
|
||||||
|
|
||||||
|
mount "/dev/$root" /mnt/root || exit
|
||||||
|
mount "/dev/$usr" /mnt/usr || exit
|
||||||
|
|
||||||
|
mkdir /mnt/usr/tmp/root_backup || exit
|
||||||
|
|
||||||
|
echo " * Copying / contents"
|
||||||
|
|
||||||
|
cp -rfp /mnt/root/* /mnt/usr/tmp/root_backup
|
||||||
|
if [ $? -ne 0 ]
|
||||||
|
then
|
||||||
|
echo ""
|
||||||
|
echo "Failed to backup root partition, aborting!"
|
||||||
|
rm -rf /mnt/usr/tmp/root_backup
|
||||||
|
# umount shouldn't fail here, but if it will, next
|
||||||
|
# "rm -rf" will serve for user's pleasure.
|
||||||
|
umount /mnt/root >/dev/null || exit
|
||||||
|
umount /mnt/usr >/dev/null || exit
|
||||||
|
rm -rf /mnt/root /mnt/usr
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo " * Copying done"
|
||||||
|
|
||||||
|
umount /mnt/root
|
||||||
|
umount /mnt/usr
|
||||||
|
|
||||||
|
add_subpart=""
|
||||||
|
minix_subparts=`echo -n "" | fdisk /dev/$primary | grep "MINIX" | wc -l`
|
||||||
|
if [ "$minix_subparts" -gt 3 ]
|
||||||
|
then
|
||||||
|
echo ""
|
||||||
|
echo "You have additional subpartition except /, /usr and /home."
|
||||||
|
echo "Partition type will be set to MINIX (81), you can change it later using part."
|
||||||
|
echo -n "Do you want to continue? [Y/n] "
|
||||||
|
read ok
|
||||||
|
[ "$ok" = "n" -o "$ok" = "N" ] && exit
|
||||||
|
add_subpart="81:exist"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo " * Repartitioning"
|
||||||
|
|
||||||
|
partition /dev/$primary $BOOTXXSECTS 81:${ROOTSECTS}* 81:exist 81:exist $add_subpart || exit
|
||||||
|
|
||||||
|
echo " * mkfs on new /"
|
||||||
|
|
||||||
|
mkfs.mfs "/dev/$root" || exit
|
||||||
|
|
||||||
|
if [ $? -ne 0 ]
|
||||||
|
then
|
||||||
|
echo "Failed to repartition /dev/$primary"
|
||||||
|
rmdir /mnt/root
|
||||||
|
rmdir /mnt/usr
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
mount "/dev/$usr" /mnt/usr || exit
|
||||||
|
mount "/dev/$root" /mnt/root || exit
|
||||||
|
|
||||||
|
echo " * Filling new / filesystem"
|
||||||
|
|
||||||
|
mv /mnt/usr/tmp/root_backup/* /mnt/root/ || exit
|
||||||
|
if [ $? -ne 0 ]
|
||||||
|
then
|
||||||
|
echo "Failed to copy old root data! It is in /tmp/root_backup/"
|
||||||
|
fi
|
||||||
|
|
||||||
|
rmdir /mnt/usr/tmp/root_backup/
|
||||||
|
|
||||||
|
umount /mnt/root
|
||||||
|
umount /mnt/usr
|
||||||
|
fi
|
||||||
|
|
||||||
|
check_mbr
|
||||||
|
installboot_nbsd -f /dev/$primary /usr/mdec/bootxx_minixfs3 >/dev/null || exit 1
|
||||||
|
|
||||||
|
if [ $? -ne 0 ]
|
||||||
|
then
|
||||||
|
echo "Warning: failed to remove /tmp/root_backup!"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "New boot installed successfully! You can reboot now."
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
rmdir $TMPMP
|
rmdir $TMPMP
|
||||||
|
|
||||||
nohome="0"
|
nohome="0"
|
||||||
|
@ -456,29 +664,7 @@ blocksizebytes="`expr $blocksize '*' 1024`"
|
||||||
|
|
||||||
bootsectors=$BOOTXXSECTS
|
bootsectors=$BOOTXXSECTS
|
||||||
|
|
||||||
# check for potential problems with old mbr.
|
check_mbr
|
||||||
# space for bootxx has been checked earlier.
|
|
||||||
minix_primaries=`echo -n "" | fdisk /dev/$primary | grep "MINIX" | wc -l`
|
|
||||||
if [ "$minix_primaries" -gt 1 ]
|
|
||||||
then
|
|
||||||
# old mbr + bootxx will not work with several partitions of
|
|
||||||
# the same type.
|
|
||||||
disk=`echo -n "/dev/$primary" | sed 's/p[0-3]//'`
|
|
||||||
dd if=/usr/mdec/mbr of=temp_mbr_netbsd bs=1 count=440 2>/dev/null
|
|
||||||
dd if="$disk" bs=1 count=440 | cmp - temp_mbr_netbsd >/dev/null
|
|
||||||
if [ "$?" -ne 0 ]
|
|
||||||
then
|
|
||||||
echo "Warning: you have MBR which doesn't support multiple MINIX 3 partitions!"
|
|
||||||
echo "You will be able to boot from the first one only!"
|
|
||||||
echo -n "Do you want to install new MBR into $disk? [Y] "
|
|
||||||
read ok
|
|
||||||
if [ "$ok" = Y -o "$ok" = y -o "$ok" = "" ]
|
|
||||||
then
|
|
||||||
installboot_nbsd -m "$disk" /usr/mdec/mbr >/dev/null
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
rm temp_mbr_netbsd
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "
|
echo "
|
||||||
You have selected to (re)install MINIX 3 in the partition /dev/$primary.
|
You have selected to (re)install MINIX 3 in the partition /dev/$primary.
|
||||||
|
|
Loading…
Reference in a new issue