xref: /freebsd/usr.sbin/bsdinstall/scripts/bootconfig (revision db8b56134506840832bec2d1ce07b9e00d4d6d71)
18befcf7bSNathan Whitehorn#!/bin/sh
28befcf7bSNathan Whitehorn#-
3*db8b5613SRebecca 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
30*db8b5613SRebecca Crandie() {
31*db8b5613SRebecca Cran	echo $*
32*db8b5613SRebecca Cran	exit 1
33*db8b5613SRebecca Cran}
34*db8b5613SRebecca Cran
358befcf7bSNathan Whitehornif [ `uname -m` == powerpc ]; then
368befcf7bSNathan Whitehorn	platform=`sysctl -n hw.platform`
378befcf7bSNathan Whitehorn	if [ "$platform" == ps3 -o "$platform" == powernv ]; then
388befcf7bSNathan Whitehorn		rootpart=$(awk '{ if($2 == "/") printf("%s:%s\n", $3, $1); }' $PATH_FSTAB)
398befcf7bSNathan Whitehorn		mkdir -p $BSDINSTALL_CHROOT/boot/etc/
40fdb600afSJustin Hibbits		echo FreeBSD=\'/kernel/kernel kernelname=/boot/kernel/kernel vfs.root.mountfrom=${rootpart}\' > $BSDINSTALL_CHROOT/boot/etc/kboot.conf
418befcf7bSNathan Whitehorn	fi
428befcf7bSNathan Whitehornfi
438befcf7bSNathan Whitehorn
44*db8b5613SRebecca Cran# Update the ESP (EFI System Partition) with the new bootloader
45*db8b5613SRebecca Cranif [ "$(uname -m)" = "amd64" ] || [ "$(uname -m)" = "i386" ]; then
46*db8b5613SRebecca Cran	X86_BOOTMETHOD=$(sysctl -n machdep.bootmethod)
47*db8b5613SRebecca Cranfi
488befcf7bSNathan Whitehorn
49*db8b5613SRebecca Cranif [ "$(uname -m)" = "arm64" ] || [ "$X86_BOOTMETHOD" = "UEFI" ]; then
50*db8b5613SRebecca Cran	UFSBOOT_ESPS=$(cat /tmp/bsdinstall-esps)
51*db8b5613SRebecca Cran	num_esps=0
52*db8b5613SRebecca Cran
53*db8b5613SRebecca Cran	if [ -n "$ZFSBOOT_DISKS" ]; then
54*db8b5613SRebecca Cran		# We're in a ZFS install environment
55*db8b5613SRebecca Cran		for disk in $ZFSBOOT_DISKS; do
56*db8b5613SRebecca Cran			index=$(gpart show "$disk" | cut -w -f 4,5 | grep "efi" | cut -w -f 1)
57*db8b5613SRebecca Cran			# Check that $index is an integer
58*db8b5613SRebecca Cran			[ -n "$index" ] && [ "$index" -eq "$index" ] && [ "$index" -ge 0 ] 2> /dev/null
59*db8b5613SRebecca Cran			if [ $? -ne 0 ]; then
60*db8b5613SRebecca Cran				continue
61*db8b5613SRebecca Cran			fi
62*db8b5613SRebecca Cran
63*db8b5613SRebecca Cran			if [ -e "/dev/${disk}p${index}" ]; then
64*db8b5613SRebecca Cran				ESPS="$ESPS ${disk}p${index}"
65*db8b5613SRebecca Cran			elif [ -e "/dev/${disk}s${index}" ]; then
66*db8b5613SRebecca Cran				ESPS="$ESPS ${disk}s${index}"
67*db8b5613SRebecca Cran			else
68*db8b5613SRebecca Cran				continue
69*db8b5613SRebecca Cran			fi
70*db8b5613SRebecca Cran
71*db8b5613SRebecca Cran			num_esps=$((num_esps + 1))
72*db8b5613SRebecca Cran		done
73*db8b5613SRebecca Cran	fi
74*db8b5613SRebecca Cran
75*db8b5613SRebecca Cran	if [ -n "$UFSBOOT_ESPS" ]; then
76*db8b5613SRebecca Cran		# We're in a UFS install environment
77*db8b5613SRebecca Cran		for partition in $UFSBOOT_ESPS; do
78*db8b5613SRebecca Cran			ESPS="$ESPS $partition"
79*db8b5613SRebecca Cran			num_esps=$((num_esps + 1))
80*db8b5613SRebecca Cran		done
81*db8b5613SRebecca Cran	fi
82*db8b5613SRebecca Cran
83*db8b5613SRebecca Cran	if [ -z "$ESPS" ]; then
84*db8b5613SRebecca Cran		# The installer hasn't given us any ESPs to use.
85*db8b5613SRebecca Cran		# Try and figure out which to use by looking for an
86*db8b5613SRebecca Cran		# unformatted efi partition
87*db8b5613SRebecca Cran		for disk in $(sysctl -n kern.disks); do
88*db8b5613SRebecca Cran			hasfreebsd=$(gpart show "$disk" | cut -w -f 4,5 | grep "freebsd")
89*db8b5613SRebecca Cran			if [ -n "$hasfreebsd" ]; then
90*db8b5613SRebecca Cran				index=$(gpart show "$disk" | cut -w -f 4,5 | grep "efi" | cut -w -f 1)
91*db8b5613SRebecca Cran				# Check that $index is a valid integer
92*db8b5613SRebecca Cran				[ -n "$index" ] && [ "$index" -eq "$index" ] && [ "$index" -ge 0 ] 2> /dev/null
93*db8b5613SRebecca Cran				if [ $? -ne 0 ]; then
94*db8b5613SRebecca Cran					continue
95*db8b5613SRebecca Cran				fi
96*db8b5613SRebecca Cran
97*db8b5613SRebecca Cran				mntpt=$(mktemp -d /tmp/stand-test.XXXXXX)
98*db8b5613SRebecca Cran				if [ -e "/dev/${disk}p${index}" ]; then
99*db8b5613SRebecca Cran					dev=${disk}p${index}
100*db8b5613SRebecca Cran				elif [ -e "/dev/${disk}s${index}" ]; then
101*db8b5613SRebecca Cran					dev=/${disk}s${index}
102*db8b5613SRebecca Cran				else
103*db8b5613SRebecca Cran					continue
104*db8b5613SRebecca Cran				fi
105*db8b5613SRebecca Cran
106*db8b5613SRebecca Cran				# Try and mount it. If it fails, assume it's
107*db8b5613SRebecca Cran				# unformatted and should be used.
108*db8b5613SRebecca Cran				mount -t msdosfs "/dev/${dev}" "${mntpt}"
109*db8b5613SRebecca Cran				if [ $? -ne 0 ]; then
110*db8b5613SRebecca Cran					ESPS="$ESPS ${dev}"
111*db8b5613SRebecca Cran					num_esps=$((num_esps + 1))
112*db8b5613SRebecca Cran				else
113*db8b5613SRebecca Cran					umount "${mntpt}"
114*db8b5613SRebecca Cran				fi
115*db8b5613SRebecca Cran				rmdir "${mntpt}"
116*db8b5613SRebecca Cran			fi
117*db8b5613SRebecca Cran		done
118*db8b5613SRebecca Cran	fi
119*db8b5613SRebecca Cran
120*db8b5613SRebecca Cran	for esp in $ESPS; do
121*db8b5613SRebecca Cran		newfs_msdos -F 32 -c 1 -L EFISYS "/dev/$esp" > /dev/null 2>&1
122*db8b5613SRebecca Cran		if [ $? -ne 0 ]; then
123*db8b5613SRebecca Cran			die "Failed to format ESP $esp as FAT32"
124*db8b5613SRebecca Cran		fi
125*db8b5613SRebecca Cran
126*db8b5613SRebecca Cran		mntpt=$(mktemp -d /tmp/stand-test.XXXXXX)
127*db8b5613SRebecca Cran		mount -t msdosfs "/dev/${esp}" "${mntpt}"
128*db8b5613SRebecca Cran		if [ $? -ne 0 ]; then
129*db8b5613SRebecca Cran			die "Failed to mount ESP ${dev} on ${mntpt}"
130*db8b5613SRebecca Cran		fi
131*db8b5613SRebecca Cran
132*db8b5613SRebecca Cran		mkdir -p "$mntpt/EFI/freebsd"
133*db8b5613SRebecca Cran		cp "$BSDINSTALL_CHROOT/boot/loader.efi" "${mntpt}/EFI/freebsd/loader.efi"
134*db8b5613SRebecca Cran
135*db8b5613SRebecca Cran		if [ "$num_esps" -gt 1 ]; then
136*db8b5613SRebecca Cran			bootlabel="FreeBSD (${esp})"
137*db8b5613SRebecca Cran		else
138*db8b5613SRebecca Cran			bootlabel="FreeBSD"
139*db8b5613SRebecca Cran		fi
140*db8b5613SRebecca Cran
141*db8b5613SRebecca Cran		efibootmgr --create --label "$bootlabel" --loader "${mntpt}/EFI/freebsd/loader.efi" > /dev/null
142*db8b5613SRebecca Cran
143*db8b5613SRebecca Cran		umount "${mntpt}"
144*db8b5613SRebecca Cran		rmdir "${mntpt}"
145*db8b5613SRebecca Cran
146*db8b5613SRebecca Cran		# When creating new entries, efibootmgr doesn't mark them active, so we need to
147*db8b5613SRebecca Cran		# do so. It doesn't make it easy to find which entry it just added, so rely on
148*db8b5613SRebecca Cran		# the fact that it places the new entry first in BootOrder.
149*db8b5613SRebecca Cran		bootorder=$(efivar --name 8be4df61-93ca-11d2-aa0d-00e098032b8c-BootOrder --print --no-name --hex | head -1)
150*db8b5613SRebecca Cran		bootentry=$(echo "$bootorder" | cut -w -f 3)$(echo "$bootorder" | cut -w -f 2)
151*db8b5613SRebecca Cran		efibootmgr --activate "$bootentry" > /dev/null
152*db8b5613SRebecca Cran	done
153*db8b5613SRebecca Cranfi
154*db8b5613SRebecca Cran
155*db8b5613SRebecca Cran# Add boot0cfg for MBR BIOS booting?
156