summaryrefslogtreecommitdiffstats
path: root/usr.sbin/pc-sysinstall
diff options
context:
space:
mode:
authorimp <imp@FreeBSD.org>2010-08-19 06:11:06 +0000
committerimp <imp@FreeBSD.org>2010-08-19 06:11:06 +0000
commit73299bcc055a36025bbe3f6c52243e4404abe3e3 (patch)
treec0b4e7181eec503a42c75c54a9c27aa5cf9494c8 /usr.sbin/pc-sysinstall
parentf8dbfee9a2b610cc9256feb35d8ef196203535d9 (diff)
downloadFreeBSD-src-73299bcc055a36025bbe3f6c52243e4404abe3e3.zip
FreeBSD-src-73299bcc055a36025bbe3f6c52243e4404abe3e3.tar.gz
This patch to pc-sysinstall allows the setting of a new config
variable for installation, which lets the user/front-end select between MBR or GPT partitioning schemes when doing a dedicated disk installation. PR: 149772 Submitted by: Kris Moore
Diffstat (limited to 'usr.sbin/pc-sysinstall')
-rwxr-xr-xusr.sbin/pc-sysinstall/backend/functions-disk.sh99
-rw-r--r--usr.sbin/pc-sysinstall/examples/README5
2 files changed, 97 insertions, 7 deletions
diff --git a/usr.sbin/pc-sysinstall/backend/functions-disk.sh b/usr.sbin/pc-sysinstall/backend/functions-disk.sh
index 48a77b3..bcce58e 100755
--- a/usr.sbin/pc-sysinstall/backend/functions-disk.sh
+++ b/usr.sbin/pc-sysinstall/backend/functions-disk.sh
@@ -406,6 +406,18 @@ setup_disk_slice()
fi
fi
+ # Check if we have a partscheme specified
+ echo $line | grep "^partscheme=" >/dev/null 2>/dev/null
+ if [ "$?" = "0" ] ; then
+ # Found a partscheme= entry, lets read / set it
+ get_value_from_string "${line}"
+ strip_white_space "$VAL"
+ PSCHEME="$VAL"
+ if [ "$PSCHEME" != "GPT" -a "$PSCHEME" != "MBR" ] ; then
+ exit_err "Unknown partition scheme: $PSCHEME"
+ fi
+ fi
+
echo $line | grep "^bootManager=" >/dev/null 2>/dev/null
if [ "$?" = "0" ]
then
@@ -422,8 +434,13 @@ setup_disk_slice()
if [ ! -z "${DISK}" -a ! -z "${PTYPE}" ]
then
case ${PTYPE} in
- all|ALL) tmpSLICE="${DISK}p1"
- run_gpart_full "${DISK}" "${BMANAGER}" ;;
+ all|ALL) if [ "$PSCHEME" = "MBR" -o -z "$PSCHEME" ] ; then
+ PSCHEME="MBR"
+ tmpSLICE="${DISK}s1"
+ else
+ tmpSLICE="${DISK}p1"
+ fi
+ run_gpart_full "${DISK}" "${BMANAGER}" "${PSCHEME}" ;;
s1|s2|s3|s4) tmpSLICE="${DISK}${PTYPE}"
# Get the number of the slice we are working on
s="`echo ${PTYPE} | awk '{print substr($0,length,1)}'`"
@@ -449,7 +466,7 @@ setup_disk_slice()
# Increment our disk counter to look for next disk and unset
- unset BMANAGER PTYPE DISK MIRRORDISK MIRRORBAL
+ unset BMANAGER PTYPE DISK MIRRORDISK MIRRORBAL PSCHEME
disknum="`expr $disknum + 1`"
else
exit_err "ERROR: commitDiskPart was called without procceding disk<num>= and partition= entries!!!"
@@ -477,7 +494,7 @@ stop_gjournal() {
fi
} ;
-# Function which runs gpart and creates a single large slice
+# Function which runs gpart and creates a single large GPT partition scheme
init_gpt_full_disk()
{
_intDISK=$1
@@ -506,14 +523,82 @@ init_gpt_full_disk()
}
+# Function which runs gpart and creates a single large MBR partition scheme
+init_mbr_full_disk()
+{
+ _intDISK=$1
+ _intBOOT=$2
+
+ startblock="63"
+
+ # Set our sysctl so we can overwrite any geom using drives
+ sysctl kern.geom.debugflags=16 >>${LOGOUT} 2>>${LOGOUT}
+
+ # Stop any journaling
+ stop_gjournal "${_intDISK}"
+
+ # Remove any existing partitions
+ delete_all_gpart "${_intDISK}"
+
+ #Erase any existing bootloader
+ echo_log "Cleaning up ${_intDISK}"
+ rc_halt "dd if=/dev/zero of=/dev/${_intDISK} count=2048"
+
+ sleep 2
+
+ echo_log "Running gpart on ${_intDISK}"
+ rc_halt "gpart create -s mbr ${_intDISK}"
+
+ # Lets figure out disk size in blocks
+ # Get the cyl of this disk
+ get_disk_cyl "${_intDISK}"
+ cyl="${VAL}"
+
+ # Get the heads of this disk
+ get_disk_heads "${_intDISK}"
+ head="${VAL}"
+
+ # Get the tracks/sectors of this disk
+ get_disk_sectors "${_intDISK}"
+ sec="${VAL}"
+
+ # Multiply them all together to get our total blocks
+ totalblocks="`expr ${cyl} \* ${head}`"
+ totalblocks="`expr ${totalblocks} \* ${sec}`"
+
+
+ # Now set the ending block to the total disk block size
+ sizeblock="`expr ${totalblocks} - ${startblock}`"
+
+ # Install new partition setup
+ echo_log "Running gpart add on ${_intDISK}"
+ rc_halt "gpart add -b ${startblock} -s ${sizeblock} -t freebsd -i 1 ${_intDISK}"
+ sleep 2
+
+ echo_log "Cleaning up ${_intDISK}s1"
+ rc_halt "dd if=/dev/zero of=/dev/${_intDISK}s1 count=1024"
+
+ if [ "$_intBOOT" = "bsd" ] ; then
+ echo_log "Stamping boot sector on ${_intDISK}"
+ rc_halt "gpart bootcode -b /boot/boot0 ${_intDISK}"
+ fi
+
+}
+
# Function which runs gpart and creates a single large slice
run_gpart_full()
{
DISK=$1
+ BOOT=$2
+ SCHEME=$3
- init_gpt_full_disk "$DISK"
-
- slice="${DISK}-1-gpt"
+ if [ "$SCHEME" = "MBR" ] ; then
+ init_mbr_full_disk "$DISK" "$BOOT"
+ slice="${DISK}-1-mbr"
+ else
+ init_gpt_full_disk "$DISK"
+ slice="${DISK}-1-gpt"
+ fi
# Lets save our slice, so we know what to look for in the config file later on
if [ -z "$WORKINGSLICES" ]
diff --git a/usr.sbin/pc-sysinstall/examples/README b/usr.sbin/pc-sysinstall/examples/README
index 55d78e4..eeb96d0 100644
--- a/usr.sbin/pc-sysinstall/examples/README
+++ b/usr.sbin/pc-sysinstall/examples/README
@@ -128,6 +128,11 @@ Setting this to "s1, s2, s3 or s4" will use the specified MBR slice
(This tag is unused for upgrades)
+# partscheme=(MBR/GPT)
+
+When performing a "full" disk (partition=all), the partscheme= variable is used
+to determine the partition scheme type gpart will be using on the disk. Valid
+choices are MBR or GPT.
# mirror=(disk device such as ad1)
OpenPOWER on IntegriCloud