svn commit: r298243 - head/usr.sbin/bsdinstall/scripts

Allan Jude allanjude at FreeBSD.org
Tue Apr 19 03:25:37 UTC 2016


Author: allanjude
Date: Tue Apr 19 03:25:36 2016
New Revision: 298243
URL: https://svnweb.freebsd.org/changeset/base/298243

Log:
  Add a new installation type to bsdinstall/zfsboot: BIOS+UEFI
  
  Installs both pmbr+gptzfsboot as well as boot1.efifat in separate partitions
  The resulting system can be booted with either UEFI or BIOS/CSM.
  Preference is controlled by the user's firmware boot settings.
  
  This is now the default for zfsboot installs
  
  PR:		208629
  Submitted by:	Galael LAPLANCHE <ganael.laplanche at corp.ovh.com> (original version)

Modified:
  head/usr.sbin/bsdinstall/scripts/zfsboot

Modified: head/usr.sbin/bsdinstall/scripts/zfsboot
==============================================================================
--- head/usr.sbin/bsdinstall/scripts/zfsboot	Tue Apr 19 02:06:02 2016	(r298242)
+++ head/usr.sbin/bsdinstall/scripts/zfsboot	Tue Apr 19 03:25:36 2016	(r298243)
@@ -112,7 +112,7 @@ f_include $BSDCFG_SHARE/variable.subr
 : ${ZFSBOOT_PARTITION_SCHEME:=}
 
 #
-# Default partitioning scheme to use on disks
+# Default boot type to use on disks
 #
 : ${ZFSBOOT_BOOT_TYPE:=}
 
@@ -755,6 +755,21 @@ zfs_create_diskpart()
 	esac
 
 	#
+	# Enable boot pool if encryption is desired
+	#
+	[ "$ZFSBOOT_GELI_ENCRYPTION" ] && ZFSBOOT_BOOT_POOL=1
+
+	#
+	# ZFSBOOT_BOOT_POOL and BIOS+UEFI boot type are incompatible
+	#
+	if [ "$ZFSBOOT_BOOT_POOL" -a "$ZFSBOOT_BOOT_TYPE" = "BIOS+UEFI" ]; then
+		f_dprintf "$funcname: ZFSBOOT_BOOT_POOL is incompatible with BIOS+UEFI boot type"
+		msg_error="$msg_error: $funcname" f_show_err \
+			"ZFSBOOT_BOOT_POOL is incompatible with BIOS+UEFI boot type"
+		return $FAILURE
+	fi
+
+	#
 	# Destroy whatever partition layout is currently on disk.
 	# NOTE: `-F' required to destroy if partitions still exist.
 	# NOTE: Failure is ok here, blank disk will have nothing to destroy.
@@ -769,11 +784,6 @@ zfs_create_diskpart()
 	f_eval_catch -d $funcname gpart "$GPART_DESTROY_F" $disk
 
 	#
-	# Enable boot pool if encryption is desired
-	#
-	[ "$ZFSBOOT_GELI_ENCRYPTION" ] && ZFSBOOT_BOOT_POOL=1
-
-	#
 	# Lay down the desired type of partition scheme
 	#
 	local setsize mbrindex align_small align_big
@@ -813,7 +823,7 @@ zfs_create_diskpart()
 		#
 		# 2. Add small freebsd-boot or efi partition
 		#
-		if [ "$ZFSBOOT_BOOT_TYPE" = "UEFI" ]; then
+		if [ "$ZFSBOOT_BOOT_TYPE" = "UEFI" -o "$ZFSBOOT_BOOT_TYPE" = "BIOS+UEFI" ]; then
 			f_eval_catch $funcname gpart \
 			             "$GPART_ADD_ALIGN_LABEL_WITH_SIZE" \
 			             "$align_small" efiboot$index efi 800k $disk ||
@@ -821,26 +831,49 @@ zfs_create_diskpart()
 			f_eval_catch $funcname gpart "$GPART_BOOTCODE_PARTONLY" \
 			             /boot/boot1.efifat 1 $disk ||
 			             return $FAILURE
-		else
+		fi
+
+		if [ "$ZFSBOOT_BOOT_TYPE" = "BIOS" -o "$ZFSBOOT_BOOT_TYPE" = "BIOS+UEFI" ]; then
 			f_eval_catch $funcname gpart \
 			             "$GPART_ADD_ALIGN_LABEL_WITH_SIZE" \
 			             "$align_small" gptboot$index freebsd-boot \
 			             512k $disk || return $FAILURE
-			f_eval_catch $funcname gpart "$GPART_BOOTCODE_PART" \
-			             /boot/pmbr /boot/gptzfsboot 1 $disk ||
-			             return $FAILURE
+			if [ "$ZFSBOOT_BOOT_TYPE" = "BIOS" ]; then
+				f_eval_catch $funcname gpart "$GPART_BOOTCODE_PART" \
+				             /boot/pmbr /boot/gptzfsboot 1 $disk ||
+				             return $FAILURE
+			else
+				f_eval_catch $funcname gpart "$GPART_BOOTCODE_PART" \
+				             /boot/pmbr /boot/gptzfsboot 2 $disk ||
+				             return $FAILURE
+			fi
 		fi
 
 		# NB: zpool will use the `zfs#' GPT labels
-		bootpart=p2 swappart=p2 targetpart=p2
-		[ ${swapsize:-0} -gt 0 ] && targetpart=p3
+		if [ "$ZFSBOOT_BOOT_TYPE" = "BIOS+UEFI" ]; then
+			if [ "$ZFSBOOT_BOOT_POOL" ]; then
+				bootpart=p3 swappart=p4 targetpart=p4
+				[ ${swapsize:-0} -gt 0 ] && targetpart=p5
+			else
+				# Bootpart unused
+				bootpart=p3 swappart=p3 targetpart=p3
+				[ ${swapsize:-0} -gt 0 ] && targetpart=p4
+			fi
+		else
+			if [ "$ZFSBOOT_BOOT_POOL" ]; then
+				bootpart=p2 swappart=p3 targetpart=p3
+				[ ${swapsize:-0} -gt 0 ] && targetpart=p4
+			else
+				# Bootpart unused
+				bootpart=p2 swappart=p2 targetpart=p2
+				[ ${swapsize:-0} -gt 0 ] && targetpart=p3
+			fi
+		fi
 
 		#
 		# Prepare boot pool if enabled (e.g., for geli(8))
 		#
 		if [ "$ZFSBOOT_BOOT_POOL" ]; then
-			bootpart=p2 swappart=p3 targetpart=p3
-			[ ${swapsize:-0} -gt 0 ] && targetpart=p4
 			f_eval_catch $funcname gpart \
 			             "$GPART_ADD_ALIGN_LABEL_WITH_SIZE" \
 			             "$align_big" boot$index freebsd-zfs \
@@ -1444,7 +1477,7 @@ f_dprintf "FSTAB_FMT=[%s]" "$FSTAB_FMT"
 bootmethod=$( sysctl -n machdep.bootmethod )
 f_dprintf "machdep.bootmethod=[%s]" "$bootmethod"
 if [ "$bootmethod" = "UEFI" ]; then
-	: ${ZFSBOOT_BOOT_TYPE:=UEFI}
+	: ${ZFSBOOT_BOOT_TYPE:=BIOS+UEFI}
 	: ${ZFSBOOT_PARTITION_SCHEME:=GPT}
 else
 	: ${ZFSBOOT_BOOT_TYPE:=BIOS}
@@ -1574,6 +1607,9 @@ while :; do
 		if [ "$ZFSBOOT_PARTITION_SCHEME" = "GPT" -a "$ZFSBOOT_BOOT_TYPE" = "BIOS" ]; then
 			ZFSBOOT_PARTITION_SCHEME="GPT"
 			ZFSBOOT_BOOT_TYPE="UEFI"
+		elif [ "$ZFSBOOT_PARTITION_SCHEME" = "GPT" -a "$ZFSBOOT_BOOT_TYPE" = "UEFI" ]; then
+			ZFSBOOT_PARTITION_SCHEME="GPT"
+			ZFSBOOT_BOOT_TYPE="BIOS+UEFI"
 		elif [ "$ZFSBOOT_PARTITION_SCHEME" = "GPT" ]; then
 			ZFSBOOT_PARTITION_SCHEME="MBR"
 			ZFSBOOT_BOOT_TYPE="BIOS"


More information about the svn-src-all mailing list