xref: /freebsd/usr.sbin/bsdinstall/scripts/bootconfig (revision a107ddbb83a7a93d3c4e40f5355e158d6976bf90)
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
33*a107ddbbSRebecca Cran: ${TMPDIR:="/tmp"}
34*a107ddbbSRebecca 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
54db8b5613SRebecca Cranif [ "$(uname -m)" = "arm64" ] || [ "$X86_BOOTMETHOD" = "UEFI" ]; then
55*a107ddbbSRebecca Cran	UFSBOOT_ESPS=$(cat $TMPDIR/bsdinstall-esps 2>/dev/null)
56*a107ddbbSRebecca 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
104*a107ddbbSRebecca 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
127db8b5613SRebecca Cran	for esp in $ESPS; do
128a89559c2SYuri Pankov		f_dprintf "Formatting /dev/${esp} as FAT32"
129db8b5613SRebecca Cran		newfs_msdos -F 32 -c 1 -L EFISYS "/dev/$esp" > /dev/null 2>&1
130db8b5613SRebecca Cran		if [ $? -ne 0 ]; then
131db8b5613SRebecca Cran			die "Failed to format ESP $esp as FAT32"
132db8b5613SRebecca Cran		fi
133db8b5613SRebecca Cran
134*a107ddbbSRebecca Cran		mntpt=$(mktemp -d $TMPDIR/stand-test.XXXXXX)
135a89559c2SYuri Pankov		f_dprintf "Mounting ESP /dev/${esp}"
136db8b5613SRebecca Cran		mount -t msdosfs "/dev/${esp}" "${mntpt}"
137db8b5613SRebecca Cran		if [ $? -ne 0 ]; then
138db8b5613SRebecca Cran			die "Failed to mount ESP ${dev} on ${mntpt}"
139db8b5613SRebecca Cran		fi
140db8b5613SRebecca Cran
141a89559c2SYuri Pankov		f_dprintf "Installing loader.efi onto ESP"
142db8b5613SRebecca Cran		mkdir -p "$mntpt/EFI/freebsd"
143db8b5613SRebecca Cran		cp "$BSDINSTALL_CHROOT/boot/loader.efi" "${mntpt}/EFI/freebsd/loader.efi"
144db8b5613SRebecca Cran
145db8b5613SRebecca Cran		if [ "$num_esps" -gt 1 ]; then
146db8b5613SRebecca Cran			bootlabel="FreeBSD (${esp})"
147db8b5613SRebecca Cran		else
148db8b5613SRebecca Cran			bootlabel="FreeBSD"
149db8b5613SRebecca Cran		fi
150db8b5613SRebecca Cran
151a89559c2SYuri Pankov		f_dprintf "Creating UEFI boot entry"
1527e02f8b3SRebecca Cran		efibootmgr --create --activate --label "$bootlabel" --loader "${mntpt}/EFI/freebsd/loader.efi" > /dev/null
153db8b5613SRebecca Cran
154a89559c2SYuri Pankov		f_dprintf "Unmounting ESP"
155db8b5613SRebecca Cran		umount "${mntpt}"
156db8b5613SRebecca Cran		rmdir "${mntpt}"
157db8b5613SRebecca Cran
158a89559c2SYuri Pankov		f_dprintf "Finished configuring /dev/${esp} as ESP"
159db8b5613SRebecca Cran	done
160db8b5613SRebecca Cranfi
161db8b5613SRebecca Cran
162db8b5613SRebecca Cran# Add boot0cfg for MBR BIOS booting?
163