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"
|
||||
}
|
||||
|
||||
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.
|
||||
while getopts '' opt; do usage; done
|
||||
shift `expr $OPTIND - 1`
|
||||
|
@ -323,13 +351,15 @@ echo " --- Step 4: Reinstall choice ------------------------------------------"
|
|||
echo "You have selected an existing MINIX 3 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 B to reinstall/upgrade bootloader (no data affected)"
|
||||
echo ""
|
||||
echo -n "(F)ull or (R)einstall? [R] "
|
||||
echo -n "(F)ull, (R)einstall or (B)ootloader install? [R] "
|
||||
read conf
|
||||
case "$conf" in
|
||||
"") confirm="ok"; auto="r"; ;;
|
||||
[Rr]*) confirm="ok"; auto="r"; ;;
|
||||
[Ff]*) confirm="ok"; auto="" ;;
|
||||
[Bb]*) confirm="ok"; bootreinstall="ok" ;;
|
||||
esac
|
||||
|
||||
else echo ""
|
||||
|
@ -340,6 +370,184 @@ echo " --- Step 4: Reinstall choice ------------------------------------------"
|
|||
|
||||
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
|
||||
|
||||
nohome="0"
|
||||
|
@ -456,29 +664,7 @@ blocksizebytes="`expr $blocksize '*' 1024`"
|
|||
|
||||
bootsectors=$BOOTXXSECTS
|
||||
|
||||
# check for potential problems with old 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
|
||||
check_mbr
|
||||
|
||||
echo "
|
||||
You have selected to (re)install MINIX 3 in the partition /dev/$primary.
|
||||
|
|
Loading…
Reference in a new issue