summaryrefslogtreecommitdiff
path: root/distrib/miniroot
diff options
context:
space:
mode:
authorAlexander Hall <halex@cvs.openbsd.org>2016-09-04 10:15:05 +0000
committerAlexander Hall <halex@cvs.openbsd.org>2016-09-04 10:15:05 +0000
commite992ddaa6d59cb686fab87d735aea8b626946a8e (patch)
treea944c631c8f2a435dff3a60e368dcd32af9ffecc /distrib/miniroot
parent00c16539441033e7af9a53f246ef9393a173b511 (diff)
Improve the auto disk selection and also apply it for installs as well
as for upgrades. - For installs, find all and any disks available. - For upgrades, look for 'a' partitions with the typical root filesystem directories in them. In both cases, if one and only one match is found, it will be selected. If no disk or multiple disks are found, the installer will require you to specify a disk, be it by hand or by auto{install,upgrade}.conf. ok rpe@ krw@ "Innovative." deraadt@
Diffstat (limited to 'distrib/miniroot')
-rw-r--r--distrib/miniroot/install.sub58
1 files changed, 43 insertions, 15 deletions
diff --git a/distrib/miniroot/install.sub b/distrib/miniroot/install.sub
index be8ee2ad3a6..3d4f97deee3 100644
--- a/distrib/miniroot/install.sub
+++ b/distrib/miniroot/install.sub
@@ -1,5 +1,5 @@
#!/bin/ksh
-# $OpenBSD: install.sub,v 1.910 2016/09/04 09:56:46 rpe Exp $
+# $OpenBSD: install.sub,v 1.911 2016/09/04 10:15:04 halex Exp $
#
# Copyright (c) 1997-2015 Todd Miller, Theo de Raadt, Ken Westerback
# Copyright (c) 2015, Robert Peichaer <rpe@openbsd.org>
@@ -1912,39 +1912,67 @@ set_timezone() {
done
}
-# Scan supplied disks and print the first one having a 4.2BSD 'a' partition.
-# If none is found, prints nothing and returns nonzero.
+# Determine if the supplied disk is a potential root disk, by:
+# - Check the disklabel if there is an 'a' partition of type 4.2BSD
+# - Mount the partition (read-only) and look for typical root filesystem layout
+is_rootdisk() {
+ local _d=$1 _rc=1
+
+ (
+ makedev $_d
+ if disklabel $_d | grep -q '^ a: .*4\.2BSD ' &&
+ mount -t ffs -r /dev/${_d}a /mnt; then
+ ls -d /mnt/{bin,dev,etc,home,mnt,root,sbin,tmp,usr,var}
+ _rc=$?
+ umount -f /mnt
+ fi
+ rm -f /dev/{r,}$_d?
+ return $_rc
+ ) >/dev/null 2>&1
+}
+
+# From the supplied list of devices, determine a single device suitable
+# for $MODE.
+# On success, prints the device name and returns 0
+# On failure, prints an error message and returns 1
find_root() {
local _d
for _d; do
- makedev $_d
- disklabel "$_d" | grep -q '^ a: .*4\.2BSD ' &&
- echo $_d && return
- rm -f /dev/{r,}$_d?
- done
- return 1
+ [[ $MODE == upgrade ]] && ! is_rootdisk $_d && continue
+ echo $_d
+ done |
+ (
+ ! read first && echo "No root disk found" && exit 1
+
+ ! read second && echo $first && exit
+
+ echo "Multiple potential root devices found:" \
+ $(echo $first $second; cat)"."
+ echo "Please specify one."
+ exit 1
+ )
}
# Get global root information. ie. ROOTDISK, ROOTDEV and SWAPDEV.
get_rootinfo() {
- local _auto
- [[ $MODE == upgrade ]] && _auto=auto
while :; do
echo "Available disks are: $(get_dkdevs | sed 's/^$/none/')."
_ask "Which disk is the root disk? ('?' for details)" \
- $_auto $(get_dkdevs) || continue
+ auto || continue
case $resp in
"?") diskinfo $(get_dkdevs);;
'') ;;
- "$_auto")
- resp=$(find_root $(get_dkdevs)) && break
- echo "no disk found"
+ auto) echo "Scanning disks"
+ resp=$(find_root $(get_dkdevs)) &&
+ echo "Using $resp as root disk" && break
+ echo "$resp"
;;
*) isin "$resp" $(get_dkdevs) && break
echo "no such disk"
;;
esac
+ $AUTO && exit 1
done
makedev $resp || exit