xref: /src/usr.sbin/bsdinstall/scripts/bootconfig (revision a89559c269387701fec645c7f621c7536fd9d8f3)
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
33db8b5613SRebecca Crandie() {
34db8b5613SRebecca Cran	echo $*
35db8b5613SRebecca Cran	exit 1
36db8b5613SRebecca Cran}
37db8b5613SRebecca Cran
388befcf7bSNathan Whitehornif [ `uname -m` == powerpc ]; then
398befcf7bSNathan Whitehorn	platform=`sysctl -n hw.platform`
408befcf7bSNathan Whitehorn	if [ "$platform" == ps3 -o "$platform" == powernv ]; then
418befcf7bSNathan Whitehorn		rootpart=$(awk '{ if($2 == "/") printf("%s:%s\n", $3, $1); }' $PATH_FSTAB)
428befcf7bSNathan Whitehorn		mkdir -p $BSDINSTALL_CHROOT/boot/etc/
43fdb600afSJustin Hibbits		echo FreeBSD=\'/kernel/kernel kernelname=/boot/kernel/kernel vfs.root.mountfrom=${rootpart}\' > $BSDINSTALL_CHROOT/boot/etc/kboot.conf
448befcf7bSNathan Whitehorn	fi
458befcf7bSNathan Whitehornfi
468befcf7bSNathan Whitehorn
47db8b5613SRebecca Cran# Update the ESP (EFI System Partition) with the new bootloader
48db8b5613SRebecca Cranif [ "$(uname -m)" = "amd64" ] || [ "$(uname -m)" = "i386" ]; then
49db8b5613SRebecca Cran	X86_BOOTMETHOD=$(sysctl -n machdep.bootmethod)
50db8b5613SRebecca Cranfi
518befcf7bSNathan Whitehorn
52db8b5613SRebecca Cranif [ "$(uname -m)" = "arm64" ] || [ "$X86_BOOTMETHOD" = "UEFI" ]; then
53a89559c2SYuri Pankov	UFSBOOT_ESPS=$(cat /tmp/bsdinstall-esps 2>/dev/null)
54a89559c2SYuri Pankov	ZFSBOOT_DISKS=$(cat /tmp/bsdinstall-zfsboot 2>/dev/null)
55db8b5613SRebecca Cran	num_esps=0
56db8b5613SRebecca Cran
57db8b5613SRebecca Cran	if [ -n "$ZFSBOOT_DISKS" ]; then
58db8b5613SRebecca Cran		# We're in a ZFS install environment
59db8b5613SRebecca Cran		for disk in $ZFSBOOT_DISKS; do
60db8b5613SRebecca Cran			index=$(gpart show "$disk" | cut -w -f 4,5 | grep "efi" | cut -w -f 1)
61db8b5613SRebecca Cran			# Check that $index is an integer
62db8b5613SRebecca Cran			[ -n "$index" ] && [ "$index" -eq "$index" ] && [ "$index" -ge 0 ] 2> /dev/null
63db8b5613SRebecca Cran			if [ $? -ne 0 ]; then
64db8b5613SRebecca Cran				continue
65db8b5613SRebecca Cran			fi
66db8b5613SRebecca Cran
67db8b5613SRebecca Cran			if [ -e "/dev/${disk}p${index}" ]; then
68db8b5613SRebecca Cran				ESPS="$ESPS ${disk}p${index}"
69db8b5613SRebecca Cran			elif [ -e "/dev/${disk}s${index}" ]; then
70db8b5613SRebecca Cran				ESPS="$ESPS ${disk}s${index}"
71db8b5613SRebecca Cran			else
72db8b5613SRebecca Cran				continue
73db8b5613SRebecca Cran			fi
74db8b5613SRebecca Cran
75db8b5613SRebecca Cran			num_esps=$((num_esps + 1))
76db8b5613SRebecca Cran		done
77db8b5613SRebecca Cran	fi
78db8b5613SRebecca Cran
79db8b5613SRebecca Cran	if [ -n "$UFSBOOT_ESPS" ]; then
80db8b5613SRebecca Cran		# We're in a UFS install environment
81db8b5613SRebecca Cran		for partition in $UFSBOOT_ESPS; do
82db8b5613SRebecca Cran			ESPS="$ESPS $partition"
83db8b5613SRebecca Cran			num_esps=$((num_esps + 1))
84db8b5613SRebecca Cran		done
85db8b5613SRebecca Cran	fi
86db8b5613SRebecca Cran
87db8b5613SRebecca Cran	if [ -z "$ESPS" ]; then
88db8b5613SRebecca Cran		# The installer hasn't given us any ESPs to use.
89db8b5613SRebecca Cran		# Try and figure out which to use by looking for an
90db8b5613SRebecca Cran		# unformatted efi partition
915fa62a93SRebecca Cran
925fa62a93SRebecca Cran		for geom in $(gpart status -sg | awk '{print $1}'); do
935fa62a93SRebecca Cran			hasfreebsd=$(gpart show "${geom}" | cut -w -f 4,5 | grep "freebsd")
94db8b5613SRebecca Cran			if [ -n "$hasfreebsd" ]; then
955fa62a93SRebecca Cran				index=$(gpart show "${geom}" | cut -w -f 4,5 | grep "efi" | cut -w -f 1)
96db8b5613SRebecca Cran				# Check that $index is a valid integer
97db8b5613SRebecca Cran				[ -n "$index" ] && [ "$index" -eq "$index" ] && [ "$index" -ge 0 ] 2> /dev/null
98db8b5613SRebecca Cran				if [ $? -ne 0 ]; then
99db8b5613SRebecca Cran					continue
100db8b5613SRebecca Cran				fi
101db8b5613SRebecca Cran
102db8b5613SRebecca Cran				mntpt=$(mktemp -d /tmp/stand-test.XXXXXX)
1035fa62a93SRebecca Cran				if [ -e "/dev/${geom}p${index}" ]; then
1045fa62a93SRebecca Cran					dev=${geom}p${index}
1055fa62a93SRebecca Cran				elif [ -e "/dev/${geom}s${index}" ]; then
1065fa62a93SRebecca Cran					dev=/${geom}s${index}
107db8b5613SRebecca Cran				else
108db8b5613SRebecca Cran					continue
109db8b5613SRebecca Cran				fi
110db8b5613SRebecca Cran
111db8b5613SRebecca Cran				# Try and mount it. If it fails, assume it's
112db8b5613SRebecca Cran				# unformatted and should be used.
1135fa62a93SRebecca Cran				mount -t msdosfs -o ro "/dev/${dev}" "${mntpt}"
114db8b5613SRebecca Cran				if [ $? -ne 0 ]; then
115db8b5613SRebecca Cran					ESPS="$ESPS ${dev}"
116db8b5613SRebecca Cran					num_esps=$((num_esps + 1))
117db8b5613SRebecca Cran				else
118db8b5613SRebecca Cran					umount "${mntpt}"
119db8b5613SRebecca Cran				fi
120db8b5613SRebecca Cran				rmdir "${mntpt}"
121db8b5613SRebecca Cran			fi
122db8b5613SRebecca Cran		done
123db8b5613SRebecca Cran	fi
124db8b5613SRebecca Cran
125db8b5613SRebecca Cran	for esp in $ESPS; do
126a89559c2SYuri Pankov		f_dprintf "Formatting /dev/${esp} as FAT32"
127db8b5613SRebecca Cran		newfs_msdos -F 32 -c 1 -L EFISYS "/dev/$esp" > /dev/null 2>&1
128db8b5613SRebecca Cran		if [ $? -ne 0 ]; then
129db8b5613SRebecca Cran			die "Failed to format ESP $esp as FAT32"
130db8b5613SRebecca Cran		fi
131db8b5613SRebecca Cran
132db8b5613SRebecca Cran		mntpt=$(mktemp -d /tmp/stand-test.XXXXXX)
133a89559c2SYuri Pankov		f_dprintf "Mounting ESP /dev/${esp}"
134db8b5613SRebecca Cran		mount -t msdosfs "/dev/${esp}" "${mntpt}"
135db8b5613SRebecca Cran		if [ $? -ne 0 ]; then
136db8b5613SRebecca Cran			die "Failed to mount ESP ${dev} on ${mntpt}"
137db8b5613SRebecca Cran		fi
138db8b5613SRebecca Cran
139a89559c2SYuri Pankov		f_dprintf "Installing loader.efi onto ESP"
140db8b5613SRebecca Cran		mkdir -p "$mntpt/EFI/freebsd"
141db8b5613SRebecca Cran		cp "$BSDINSTALL_CHROOT/boot/loader.efi" "${mntpt}/EFI/freebsd/loader.efi"
142db8b5613SRebecca Cran
143db8b5613SRebecca Cran		if [ "$num_esps" -gt 1 ]; then
144db8b5613SRebecca Cran			bootlabel="FreeBSD (${esp})"
145db8b5613SRebecca Cran		else
146db8b5613SRebecca Cran			bootlabel="FreeBSD"
147db8b5613SRebecca Cran		fi
148db8b5613SRebecca Cran
149a89559c2SYuri Pankov		f_dprintf "Creating UEFI boot entry"
1507e02f8b3SRebecca Cran		efibootmgr --create --activate --label "$bootlabel" --loader "${mntpt}/EFI/freebsd/loader.efi" > /dev/null
151db8b5613SRebecca Cran
152a89559c2SYuri Pankov		f_dprintf "Unmounting ESP"
153db8b5613SRebecca Cran		umount "${mntpt}"
154db8b5613SRebecca Cran		rmdir "${mntpt}"
155db8b5613SRebecca Cran
156a89559c2SYuri Pankov		f_dprintf "Finished configuring /dev/${esp} as ESP"
157db8b5613SRebecca Cran	done
158db8b5613SRebecca Cranfi
159db8b5613SRebecca Cran
160db8b5613SRebecca Cran# Add boot0cfg for MBR BIOS booting?
161