xref: /freebsd/usr.sbin/bsdinstall/scripts/bootconfig (revision 7b08a307e88bb1abe17d13d11288392a8e4739ce)
18befcf7bSNathan Whitehorn#!/bin/sh
28befcf7bSNathan Whitehorn#-
3db8b5613SRebecca Cran# Copyright (c) 2018 Rebecca Cran
48befcf7bSNathan Whitehorn# Copyright (c) 2017 Nathan Whitehorn
58befcf7bSNathan Whitehorn# All rights reserved.
68befcf7bSNathan Whitehorn#
78befcf7bSNathan Whitehorn# Redistribution and use in source and binary forms, with or without
88befcf7bSNathan Whitehorn# modification, are permitted provided that the following conditions
98befcf7bSNathan Whitehorn# are met:
108befcf7bSNathan Whitehorn# 1. Redistributions of source code must retain the above copyright
118befcf7bSNathan Whitehorn#    notice, this list of conditions and the following disclaimer.
128befcf7bSNathan Whitehorn# 2. Redistributions in binary form must reproduce the above copyright
138befcf7bSNathan Whitehorn#    notice, this list of conditions and the following disclaimer in the
148befcf7bSNathan Whitehorn#    documentation and/or other materials provided with the distribution.
158befcf7bSNathan Whitehorn#
168befcf7bSNathan Whitehorn# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
178befcf7bSNathan Whitehorn# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
188befcf7bSNathan Whitehorn# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
198befcf7bSNathan Whitehorn# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
208befcf7bSNathan Whitehorn# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
218befcf7bSNathan Whitehorn# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
228befcf7bSNathan Whitehorn# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
238befcf7bSNathan Whitehorn# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
248befcf7bSNathan Whitehorn# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
258befcf7bSNathan Whitehorn# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
268befcf7bSNathan Whitehorn# SUCH DAMAGE.
278befcf7bSNathan Whitehorn#
288befcf7bSNathan Whitehorn# $FreeBSD$
298befcf7bSNathan Whitehorn
30a89559c2SYuri PankovBSDCFG_SHARE="/usr/share/bsdconfig"
31a89559c2SYuri Pankov. $BSDCFG_SHARE/common.subr || exit 1
32a89559c2SYuri Pankov
33a107ddbbSRebecca Cran: ${TMPDIR:="/tmp"}
34a107ddbbSRebecca Cran
35db8b5613SRebecca Crandie() {
36db8b5613SRebecca Cran	echo $*
37db8b5613SRebecca Cran	exit 1
38db8b5613SRebecca Cran}
39db8b5613SRebecca Cran
408befcf7bSNathan Whitehornif [ `uname -m` == powerpc ]; then
418befcf7bSNathan Whitehorn	platform=`sysctl -n hw.platform`
428befcf7bSNathan Whitehorn	if [ "$platform" == ps3 -o "$platform" == powernv ]; then
438befcf7bSNathan Whitehorn		rootpart=$(awk '{ if($2 == "/") printf("%s:%s\n", $3, $1); }' $PATH_FSTAB)
448befcf7bSNathan Whitehorn		mkdir -p $BSDINSTALL_CHROOT/boot/etc/
45fdb600afSJustin Hibbits		echo FreeBSD=\'/kernel/kernel kernelname=/boot/kernel/kernel vfs.root.mountfrom=${rootpart}\' > $BSDINSTALL_CHROOT/boot/etc/kboot.conf
468befcf7bSNathan Whitehorn	fi
478befcf7bSNathan Whitehornfi
488befcf7bSNathan Whitehorn
49db8b5613SRebecca Cran# Update the ESP (EFI System Partition) with the new bootloader
50db8b5613SRebecca Cranif [ "$(uname -m)" = "amd64" ] || [ "$(uname -m)" = "i386" ]; then
51db8b5613SRebecca Cran	X86_BOOTMETHOD=$(sysctl -n machdep.bootmethod)
52db8b5613SRebecca Cranfi
538befcf7bSNathan Whitehorn
54*7b08a307SMitchell Horneif [ "$(uname -m)" = "arm64" ] || [ "$(uname -m)" = "riscv" ] || [ "$X86_BOOTMETHOD" = "UEFI" ]; then
55a107ddbbSRebecca Cran	UFSBOOT_ESPS=$(cat $TMPDIR/bsdinstall-esps 2>/dev/null)
56a107ddbbSRebecca Cran	ZFSBOOT_DISKS=$(cat $TMPDIR/bsdinstall-zfsboot 2>/dev/null)
57db8b5613SRebecca Cran	num_esps=0
58db8b5613SRebecca Cran
59db8b5613SRebecca Cran	if [ -n "$ZFSBOOT_DISKS" ]; then
60db8b5613SRebecca Cran		# We're in a ZFS install environment
61db8b5613SRebecca Cran		for disk in $ZFSBOOT_DISKS; do
62db8b5613SRebecca Cran			index=$(gpart show "$disk" | cut -w -f 4,5 | grep "efi" | cut -w -f 1)
63db8b5613SRebecca Cran			# Check that $index is an integer
64db8b5613SRebecca Cran			[ -n "$index" ] && [ "$index" -eq "$index" ] && [ "$index" -ge 0 ] 2> /dev/null
65db8b5613SRebecca Cran			if [ $? -ne 0 ]; then
66db8b5613SRebecca Cran				continue
67db8b5613SRebecca Cran			fi
68db8b5613SRebecca Cran
69db8b5613SRebecca Cran			if [ -e "/dev/${disk}p${index}" ]; then
70db8b5613SRebecca Cran				ESPS="$ESPS ${disk}p${index}"
71db8b5613SRebecca Cran			elif [ -e "/dev/${disk}s${index}" ]; then
72db8b5613SRebecca Cran				ESPS="$ESPS ${disk}s${index}"
73db8b5613SRebecca Cran			else
74db8b5613SRebecca Cran				continue
75db8b5613SRebecca Cran			fi
76db8b5613SRebecca Cran
77db8b5613SRebecca Cran			num_esps=$((num_esps + 1))
78db8b5613SRebecca Cran		done
79db8b5613SRebecca Cran	fi
80db8b5613SRebecca Cran
81db8b5613SRebecca Cran	if [ -n "$UFSBOOT_ESPS" ]; then
82db8b5613SRebecca Cran		# We're in a UFS install environment
83db8b5613SRebecca Cran		for partition in $UFSBOOT_ESPS; do
84db8b5613SRebecca Cran			ESPS="$ESPS $partition"
85db8b5613SRebecca Cran			num_esps=$((num_esps + 1))
86db8b5613SRebecca Cran		done
87db8b5613SRebecca Cran	fi
88db8b5613SRebecca Cran
89db8b5613SRebecca Cran	if [ -z "$ESPS" ]; then
90db8b5613SRebecca Cran		# The installer hasn't given us any ESPs to use.
91db8b5613SRebecca Cran		# Try and figure out which to use by looking for an
92db8b5613SRebecca Cran		# unformatted efi partition
935fa62a93SRebecca Cran
945fa62a93SRebecca Cran		for geom in $(gpart status -sg | awk '{print $1}'); do
955fa62a93SRebecca Cran			hasfreebsd=$(gpart show "${geom}" | cut -w -f 4,5 | grep "freebsd")
96db8b5613SRebecca Cran			if [ -n "$hasfreebsd" ]; then
975fa62a93SRebecca Cran				index=$(gpart show "${geom}" | cut -w -f 4,5 | grep "efi" | cut -w -f 1)
98db8b5613SRebecca Cran				# Check that $index is a valid integer
99db8b5613SRebecca Cran				[ -n "$index" ] && [ "$index" -eq "$index" ] && [ "$index" -ge 0 ] 2> /dev/null
100db8b5613SRebecca Cran				if [ $? -ne 0 ]; then
101db8b5613SRebecca Cran					continue
102db8b5613SRebecca Cran				fi
103db8b5613SRebecca Cran
104a107ddbbSRebecca Cran				mntpt=$(mktemp -d $TMPDIR/stand-test.XXXXXX)
1055fa62a93SRebecca Cran				if [ -e "/dev/${geom}p${index}" ]; then
1065fa62a93SRebecca Cran					dev=${geom}p${index}
1075fa62a93SRebecca Cran				elif [ -e "/dev/${geom}s${index}" ]; then
1085fa62a93SRebecca Cran					dev=/${geom}s${index}
109db8b5613SRebecca Cran				else
110db8b5613SRebecca Cran					continue
111db8b5613SRebecca Cran				fi
112db8b5613SRebecca Cran
113db8b5613SRebecca Cran				# Try and mount it. If it fails, assume it's
114db8b5613SRebecca Cran				# unformatted and should be used.
1155fa62a93SRebecca Cran				mount -t msdosfs -o ro "/dev/${dev}" "${mntpt}"
116db8b5613SRebecca Cran				if [ $? -ne 0 ]; then
117db8b5613SRebecca Cran					ESPS="$ESPS ${dev}"
118db8b5613SRebecca Cran					num_esps=$((num_esps + 1))
119db8b5613SRebecca Cran				else
120db8b5613SRebecca Cran					umount "${mntpt}"
121db8b5613SRebecca Cran				fi
122db8b5613SRebecca Cran				rmdir "${mntpt}"
123db8b5613SRebecca Cran			fi
124db8b5613SRebecca Cran		done
125db8b5613SRebecca Cran	fi
126db8b5613SRebecca Cran
127c6d56081SWarner Losh	case $(uname -m) in
128c6d56081SWarner Losh	    arm64)	ARCHBOOTNAME=aa64 ;;
129c6d56081SWarner Losh	    amd64)	ARCHBOOTNAME=x64 ;;
130*7b08a307SMitchell Horne	    riscv)	ARCHBOOTNAME=riscv64 ;;
131c6d56081SWarner Losh    #	    arm)	ARCHBOOTNAME=arm ;; # No other support for arm install
132c6d56081SWarner Losh    #	    i386)	ARCHBOOTNAME=ia32 ;; # no support for this in i386 kernels, rare machines
133c6d56081SWarner Losh	    *)		die "Unsupported arch $(uname -m) for UEFI install"
134c6d56081SWarner Losh	esac
135676b7d07SMitchell Horne	BOOTDIR="/efi/boot"
136676b7d07SMitchell Horne	BOOTNAME="${BOOTDIR}/boot${ARCHBOOTNAME}.efi"
137676b7d07SMitchell Horne	FREEBSD_BOOTDIR="/efi/freebsd"
138676b7d07SMitchell Horne	FREEBSD_BOOTNAME="${FREEBSD_BOOTDIR}/loader.efi"
139c6d56081SWarner Losh
140db8b5613SRebecca Cran	for esp in $ESPS; do
141a89559c2SYuri Pankov		f_dprintf "Formatting /dev/${esp} as FAT32"
142db8b5613SRebecca Cran		newfs_msdos -F 32 -c 1 -L EFISYS "/dev/$esp" > /dev/null 2>&1
143db8b5613SRebecca Cran		if [ $? -ne 0 ]; then
144db8b5613SRebecca Cran			die "Failed to format ESP $esp as FAT32"
145db8b5613SRebecca Cran		fi
146db8b5613SRebecca Cran
147a107ddbbSRebecca Cran		mntpt=$(mktemp -d $TMPDIR/stand-test.XXXXXX)
148a89559c2SYuri Pankov		f_dprintf "Mounting ESP /dev/${esp}"
149db8b5613SRebecca Cran		mount -t msdosfs "/dev/${esp}" "${mntpt}"
150db8b5613SRebecca Cran		if [ $? -ne 0 ]; then
151db8b5613SRebecca Cran			die "Failed to mount ESP ${dev} on ${mntpt}"
152db8b5613SRebecca Cran		fi
153db8b5613SRebecca Cran
154a89559c2SYuri Pankov		f_dprintf "Installing loader.efi onto ESP"
155676b7d07SMitchell Horne		mkdir -p "${mntpt}/${FREEBSD_BOOTDIR}" "${mntpt}/${BOOTDIR}"
156676b7d07SMitchell Horne		cp "$BSDINSTALL_CHROOT/boot/loader.efi" "${mntpt}/${FREEBSD_BOOTNAME}"
157db8b5613SRebecca Cran
158c6d56081SWarner Losh		#
159c6d56081SWarner Losh		# The following shouldn't be necessary. UEFI defines a way to
160c6d56081SWarner Losh		# specifically select what to boot (which we do via
161c6d56081SWarner Losh		# efibootmgr). However, virtual environments often times lack
162c6d56081SWarner Losh		# support for the NV variables efibootmgr sets. In addition,
163c6d56081SWarner Losh		# some UEFI implementations have features that interfere with
164c6d56081SWarner Losh		# the setting of these variables. To combat that, we install the
165c6d56081SWarner Losh		# default removable media boot file as a fallback if it doesn't
166c6d56081SWarner Losh		# exist. We don't install it all the time since that can
167c6d56081SWarner Losh		# interfere with other installations on the drive (like rEFInd).
168c6d56081SWarner Losh		#
169c6d56081SWarner Losh		if [ ! -f "${mntpt}/${BOOTNAME}" ]; then
170c6d56081SWarner Losh			cp "$BSDINSTALL_CHROOT/boot/loader.efi" "${mntpt}/${BOOTNAME}"
171c6d56081SWarner Losh		fi
172c6d56081SWarner Losh
173db8b5613SRebecca Cran		if [ "$num_esps" -gt 1 ]; then
174db8b5613SRebecca Cran			bootlabel="FreeBSD (${esp})"
175db8b5613SRebecca Cran		else
176db8b5613SRebecca Cran			bootlabel="FreeBSD"
177db8b5613SRebecca Cran		fi
178db8b5613SRebecca Cran
179a89559c2SYuri Pankov		f_dprintf "Creating UEFI boot entry"
180676b7d07SMitchell Horne		efibootmgr --create --activate --label "$bootlabel" --loader "${mntpt}/${FREEBSD_BOOTNAME}" > /dev/null
181db8b5613SRebecca Cran
182a89559c2SYuri Pankov		f_dprintf "Unmounting ESP"
183db8b5613SRebecca Cran		umount "${mntpt}"
184db8b5613SRebecca Cran		rmdir "${mntpt}"
185db8b5613SRebecca Cran
186a89559c2SYuri Pankov		f_dprintf "Finished configuring /dev/${esp} as ESP"
187db8b5613SRebecca Cran	done
188db8b5613SRebecca Cranfi
189db8b5613SRebecca Cran
190db8b5613SRebecca Cran# Add boot0cfg for MBR BIOS booting?
191