Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 30 Jan 2016 15:53:28 +0000 (UTC)
From:      Allan Jude <allanjude@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r295074 - head/usr.sbin/bsdinstall/scripts
Message-ID:  <201601301553.u0UFrSYY073863@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: allanjude
Date: Sat Jan 30 15:53:28 2016
New Revision: 295074
URL: https://svnweb.freebsd.org/changeset/base/295074

Log:
  The zfsboot automated part of bsdinstall now supports UEFI
  
  MFC after:	3 days
  Sponsored by:	ScaleEngine Inc.
  Differential Revision:	https://reviews.freebsd.org/D4960

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

Modified: head/usr.sbin/bsdinstall/scripts/zfsboot
==============================================================================
--- head/usr.sbin/bsdinstall/scripts/zfsboot	Sat Jan 30 13:11:13 2016	(r295073)
+++ head/usr.sbin/bsdinstall/scripts/zfsboot	Sat Jan 30 15:53:28 2016	(r295074)
@@ -109,7 +109,12 @@ f_include $BSDCFG_SHARE/variable.subr
 #
 # Default partitioning scheme to use on disks
 #
-: ${ZFSBOOT_PARTITION_SCHEME:=GPT}
+: ${ZFSBOOT_PARTITION_SCHEME:=}
+
+#
+# Default partitioning scheme to use on disks
+#
+: ${ZFSBOOT_BOOT_TYPE:=}
 
 #
 # How much swap to put on each block device in the boot zpool
@@ -193,6 +198,7 @@ GPART_ADD_ALIGN_LABEL='gpart add %s -l %
 GPART_ADD_ALIGN_LABEL_WITH_SIZE='gpart add %s -l %s -t %s -s %s "%s"'
 GPART_BOOTCODE='gpart bootcode -b "%s" "%s"'
 GPART_BOOTCODE_PART='gpart bootcode -b "%s" -p "%s" -i %s "%s"'
+GPART_BOOTCODE_PARTONLY='gpart bootcode -p "%s" -i %s "%s"'
 GPART_CREATE='gpart create -s %s "%s"'
 GPART_DESTROY_F='gpart destroy -F "%s"'
 GPART_SET_ACTIVE='gpart set -a active -i %s "%s"'
@@ -297,7 +303,6 @@ msg_swap_size="Swap Size"
 msg_swap_size_help="Customize how much swap space is allocated to each selected disk"
 msg_swap_toosmall="The selected swap size (%s) is to small. Please enter a value greater than 100MB or enter 0 for no swap"
 msg_these_disks_are_too_small="These disks are too small given the amount of requested\nswap (%s) and/or geli(8) (%s) partitions, which would\ntake 50%% or more of each of the following selected disk\ndevices (not recommended):\n\n  %s\n\nRecommend changing partition size(s) and/or selecting a\ndifferent set of devices."
-msg_uefi_not_supported="The FreeBSD UEFI loader does not currently support booting root-on-ZFS. Your system will need to boot in legacy (CSM) mode.\nDo you want to continue?"
 msg_unable_to_get_disk_capacity="Unable to get disk capacity of \`%s'"
 msg_unsupported_partition_scheme="%s is an unsupported partition scheme"
 msg_user_cancelled="User Cancelled."
@@ -345,7 +350,7 @@ dialog_menu_main()
 		'E $msg_encrypt_disks'  '$usegeli'
 		                        '$msg_encrypt_disks_help'
 		'P $msg_partition_scheme'
-		                        '$ZFSBOOT_PARTITION_SCHEME'
+		                        '$ZFSBOOT_PARTITION_SCHEME ($ZFSBOOT_BOOT_TYPE)'
 		                        '$msg_partition_scheme_help'
 		'S $msg_swap_size'      '$ZFSBOOT_SWAP_SIZE'
 		                        '$msg_swap_size_help'
@@ -695,48 +700,6 @@ dialog_menu_layout()
 	return $DIALOG_OK
 }
 
-# dialog_uefi_prompt
-#
-# Confirm that the user wants to continue with the installation on a BIOS
-# system when they have booted with UEFI
-#
-dialog_uefi_prompt()
-{
-	local title="$DIALOG_TITLE"
-	local btitle="$DIALOG_BACKTITLE"
-	local prompt # Calculated below
-	local hline="$hline_arrows_tab_enter"
-
-	local height=8 width=50 prefix="   "
-	local plen=${#prefix} list= line=
-	local max_width=$(( $width - 3 - $plen ))
-
-	local yes no defaultno extra_args format
-	if [ "$USE_XDIALOG" ]; then
-		yes=ok no=cancel defaultno=default-no
-		extra_args="--wrap --left"
-		format="$msg_uefi_not_supported"
-	else
-		yes=yes no=no defaultno=defaultno
-		extra_args="--cr-wrap"
-		format="$msg_uefi_not_supported"
-	fi
-
-	# Add height for Xdialog(1)
-	[ "$USE_XDIALOG" ] && height=$(( $height + $height / 5 + 3 ))
-
-	prompt=$( printf "$format" )
-	f_dprintf "%s: UEFI prompt" "$0"
-	$DIALOG \
-		--title "$title"        \
-		--backtitle "$btitle"   \
-		--hline "$hline"        \
-		--$yes-label "$msg_yes" \
-		--$no-label "$msg_no"   \
-		$extra_args             \
-		--yesno "$prompt" $height $width
-}
-
 # zfs_create_diskpart $disk $index
 #
 # For each block device to be used in the zpool, rather than just create the
@@ -848,14 +811,25 @@ zfs_create_diskpart()
 		fi
 
 		#
-		# 2. Add small freebsd-boot partition labeled `boot#'
+		# 2. Add small freebsd-boot or efi partition
 		#
-		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" = "UEFI" ]; then
+			f_eval_catch $funcname gpart \
+			             "$GPART_ADD_ALIGN_LABEL_WITH_SIZE" \
+			             "$align_small" efiboot$index efi 800k $disk ||
+			             return $FAILURE
+			f_eval_catch $funcname gpart "$GPART_BOOTCODE_PARTONLY" \
+			             /boot/boot1.efifat 1 $disk ||
+			             return $FAILURE
+		else
+			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
+		fi
 
 		# NB: zpool will use the `zfs#' GPT labels
 		bootpart=p2 swappart=p2 targetpart=p2
@@ -1463,18 +1437,16 @@ f_dprintf "BSDINSTALL_TMPETC=[%s]" "$BSD
 f_dprintf "FSTAB_FMT=[%s]" "$FSTAB_FMT"
 
 #
-# If the system was booted with UEFI, warn the user that FreeBSD can't do
-# ZFS with UEFI yet
+# If the system was booted with UEFI, set the default boot type to UEFI
 #
-if f_interactive; then
-	bootmethod=$( sysctl -n machdep.bootmethod )
-	f_dprintf "machdep.bootmethod=[%s]" "$bootmethod"
-	if [ "$bootmethod" != "BIOS" ]; then
-		dialog_uefi_prompt
-		retval=$?
-		f_dprintf "uefi_prompt=[%s]" "$retval"
-		[ $retval -eq $DIALOG_OK ] || f_die
-	fi
+bootmethod=$( sysctl -n machdep.bootmethod )
+f_dprintf "machdep.bootmethod=[%s]" "$bootmethod"
+if [ "$bootmethod" = "UEFI" ]; then
+	: ${ZFSBOOT_BOOT_TYPE:=UEFI}
+	: ${ZFSBOOT_PARTITION_SCHEME:=GPT}
+else
+	: ${ZFSBOOT_BOOT_TYPE:=BIOS}
+	: ${ZFSBOOT_PARTITION_SCHEME:=GPT}
 fi
 
 #
@@ -1596,15 +1568,22 @@ while :; do
 		fi
 		;;
 	?" $msg_partition_scheme")
-		# Toggle between GPT and MBR
-		if [ "$ZFSBOOT_PARTITION_SCHEME" = GPT ]; then
-			ZFSBOOT_PARTITION_SCHEME=MBR
-		elif [ "$ZFSBOOT_PARTITION_SCHEME" = MBR ]; then
+		# Toggle between GPT (BIOS), GPT (UEFI) and MBR
+		if [ "$ZFSBOOT_PARTITION_SCHEME" = "GPT" -a "$ZFSBOOT_BOOT_TYPE" = "BIOS" ]; then
+			ZFSBOOT_PARTITION_SCHEME="GPT"
+			ZFSBOOT_BOOT_TYPE="UEFI"
+		elif [ "$ZFSBOOT_PARTITION_SCHEME" = "GPT" ]; then
+			ZFSBOOT_PARTITION_SCHEME="MBR"
+			ZFSBOOT_BOOT_TYPE="BIOS"
+		elif [ "$ZFSBOOT_PARTITION_SCHEME" = "MBR" ]; then
 			ZFSBOOT_PARTITION_SCHEME="GPT + Active"
+			ZFSBOOT_BOOT_TYPE="BIOS"
 		elif [ "$ZFSBOOT_PARTITION_SCHEME" = "GPT + Active" ]; then
 			ZFSBOOT_PARTITION_SCHEME="GPT + Lenovo Fix"
+			ZFSBOOT_BOOT_TYPE="BIOS"
 		else
-			ZFSBOOT_PARTITION_SCHEME=GPT
+			ZFSBOOT_PARTITION_SCHEME="GPT"
+			ZFSBOOT_BOOT_TYPE="BIOS"
 		fi
 		;;
 	?" $msg_swap_size")



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201601301553.u0UFrSYY073863>