summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenneth R Westerback <krw@cvs.openbsd.org>2002-08-18 21:05:48 +0000
committerKenneth R Westerback <krw@cvs.openbsd.org>2002-08-18 21:05:48 +0000
commit7a583044e75aa68143c9c410026c2424ec951e89 (patch)
treea33c18ab580d39c4b2f0ddcde3c11c98bbc17d2b
parent176f029be30e6d199464ed13fe7a6b78f3bd9be3 (diff)
Fix various mount point problems:
1) Fix 'already mounted' checking so a mount point name can be the same as the leading substring of a previously specified mount point. Now you can specify /usr after /usr/obj, and since the mount points are sorted before writing to fstab, it should work. This also fixes the error message generated when a requested mount point matches the leading substring of multiple mount points. e.g. trying to mount '/' again. 2) Fix fstab sorting so that it works across all initialized disks, not just on a disk by disk basis. 3) For additional paranoia during multiple disk installs, unset _partitions, _psizes, and _mount_points before processing a disk. Eliminate individual blanking of _mount_points entries. 4) Shorten/simplify logic by storing ${DISK} in _partitions entries rather than always adding it back in when referencing _partitions. 5) Rework verbiage a bit, eliminating the duplicate display of configured devices before making new filesystems. Some code clean up, eliminating '{}'s, better loops, ifs, etc. Appox. 67 bytes net bloat.
-rw-r--r--distrib/miniroot/install.sh75
1 files changed, 38 insertions, 37 deletions
diff --git a/distrib/miniroot/install.sh b/distrib/miniroot/install.sh
index 53dd1814c16..1d2a5ae0da6 100644
--- a/distrib/miniroot/install.sh
+++ b/distrib/miniroot/install.sh
@@ -1,5 +1,5 @@
#!/bin/sh
-# $OpenBSD: install.sh,v 1.110 2002/07/31 13:46:15 krw Exp $
+# $OpenBSD: install.sh,v 1.111 2002/08/18 21:05:47 krw Exp $
# $NetBSD: install.sh,v 1.5.2.8 1996/08/27 18:15:05 gwr Exp $
#
# Copyright (c) 1997-2002 Todd Miller, Theo de Raadt, Ken Westerback
@@ -143,20 +143,21 @@ __EOT
# 'while read _pp _ps' loop, but our 'sh' runs the last
# element of a pipeline in a subshell and the required side
# effects to _partitions, etc. would be lost.
+ unset _partitions _psizes _mount_points
_i=0
for _p in $(disklabel ${DISK} 2>&1 | sed -ne '/^ *\([a-p]\): *\([0-9][0-9]*\).*BSD.*/s//\1\2/p'); do
# All characters after the initial [a-p] are the partition size
_ps=${_p#?}
# Removing the partition size leaves us with the partition name
- _pp=${_p%${_ps}}
+ _pp=${DISK}${_p%${_ps}}
- [ "${DISK}${_pp}" = "$ROOTDEV" ] && continue
+ [ "$_pp" = "$ROOTDEV" ] && continue
_partitions[$_i]=$_pp
_psizes[$_i]=$_ps
# If the user assigned a mount point, use it.
if [ -f /tmp/fstab.$DISK ]; then
- _mount_points[$_i]=`sed -n "s:^/dev/${DISK}${_pp}[ ]*\([^ ]*\).*:\1:p" < /tmp/fstab.$DISK`
+ _mount_points[$_i]=`sed -n "s:^/dev/${_pp}[ ]*\([^ ]*\).*:\1:p" < /tmp/fstab.$DISK`
fi
: $(( _i += 1 ))
done
@@ -174,7 +175,7 @@ __EOT
_mp=${_mount_points[$_i]}
# Get the mount point from the user
- ask "Mount point for ${DISK}${_pp} (size=${_ps}k), RET, none or done?" "$_mp"
+ ask "Mount point for ${_pp} (size=${_ps}k), RET, none or done?" "$_mp"
case $resp in
"") ;;
none) _mount_points[$_i]=
@@ -183,11 +184,11 @@ __EOT
;;
/*) if [ "$resp" != "$_mp" ]; then
# Try to ensure we don't mount something already mounted
- _pp=`cat $FILESYSTEMS | grep " $resp" | cutword 1`
+ _pp=`grep " $resp\$" $FILESYSTEMS | cutword 1`
_j=0
for _mp in ${_mount_points[*]}; do
[ "$_mp" = "$resp" ] && \
- _pp=${DISK}${_partitions[$_j]}
+ _pp=${_partitions[$_j]}
: $(( _j += 1 ))
done
if [ "$_pp" ]; then
@@ -206,38 +207,41 @@ __EOT
[ $_i -ge ${#_partitions[*]} ] && _i=0
done
- # Now write it out, sorted by mount point
- for _mp in `bsort ${_mount_points[*]}`; do
- _i=0
- while [ $_i -lt ${#_partitions[*]} ] ; do
- if [ $_mp = "${_mount_points[$_i]}" ]; then
- echo "${DISK}${_partitions[$_i]} ${_mount_points[$_i]}" >> ${FILESYSTEMS}
- _mount_points[$_i]=
- break
- fi
- : $(( _i += 1 ))
- done
+ # Append mount information to $FILESYSTEMS
+ _i=0
+ for _pp in ${_partitions[*]}; do
+ _mnt=${_mount_points[$_i]}
+ [ "$_mnt" ] && echo "$_pp $_mnt" >> $FILESYSTEMS
+ : $(( _i += 1 ))
+ done
+ done
+
+ # Sort $FILESYSTEMS to try and force a rational mount order.
+ _pps=`cat $FILESYSTEMS | cutword 1`
+ _mps=`cat $FILESYSTEMS | cutword 2`
+ rm -f $FILESYSTEMS
+ for _mp in `bsort $_mps`; do
+ _i=1
+ for _pp in $_pps; do
+ [ "$_mp" = "$(echo $_mps | cutword $_i)" ] && \
+ echo "$_pp $_mp" >> $FILESYSTEMS
+ : $(( _i += 1 ))
done
done
cat << __EOT
+
You have configured the following devices and mount points:
-$(<${FILESYSTEMS})
+$(<$FILESYSTEMS)
+
+The next step will destroy all existing data on these devices by
+creating a new filesystem on each of them.
-============================================================
-The next step will overwrite any existing data on:
__EOT
- (
- echo -n " "
- while read _device_name _junk; do
- echo -n "$_device_name "
- done
- echo
- ) < ${FILESYSTEMS}
- ask "\nAre you really sure that you're ready to proceed?" n
+ ask "Are you really sure that you're ready to proceed?" n
case $resp in
y*|Y*) ;;
*) echo "ok, try again later..."
@@ -245,13 +249,10 @@ __EOT
;;
esac
- # Loop though the file, place filesystems on each device.
- echo "Creating filesystems..."
- (
- while read _device_name _junk; do
- newfs -q /dev/r${_device_name}
- done
- ) < ${FILESYSTEMS}
+ # Create a new filesystem on each device.
+ for _pp in $_pps; do
+ newfs -q /dev/r$_pp
+ done
fi
# Get network configuration information, and store it for placement in the
@@ -281,7 +282,7 @@ if [ ! -f /etc/fstab ]; then
*) echo /dev/$_dev $_mp ffs rw 1 2;;
esac
done
- ) < ${FILESYSTEMS} > /tmp/fstab
+ ) < $FILESYSTEMS > /tmp/fstab
munge_fstab
fi