xref: /freebsd/tools/boot/install-boot.sh (revision 17160f21efe8e8ccaebe6f887624e4faab55f6c7)
1cfc94828SWarner Losh#!/bin/sh
2cfc94828SWarner Losh
3cfc94828SWarner Losh# $FreeBSD$
4cfc94828SWarner Losh
5cfc94828SWarner Losh#
6cfc94828SWarner Losh# Installs/updates the necessary boot blocks for the desired boot environment
7cfc94828SWarner Losh#
8cfc94828SWarner Losh# Lightly tested.. Intended to be installed, but until it matures, it will just
9cfc94828SWarner Losh# be a boot tool for regression testing.
10cfc94828SWarner Losh
11cfc94828SWarner Losh# insert code here to guess what you have -- yikes!
12cfc94828SWarner Losh
13db8b5613SRebecca Cran# Minimum size of FAT filesystems, in KB.
14db8b5613SRebecca Cranfat32min=33292
15db8b5613SRebecca Cranfat16min=2100
16db8b5613SRebecca Cran
17cfc94828SWarner Loshdie() {
18cfc94828SWarner Losh    echo $*
19cfc94828SWarner Losh    exit 1
20cfc94828SWarner Losh}
21cfc94828SWarner Losh
229b544478SWarner Loshdoit() {
239b544478SWarner Losh    echo $*
249b544478SWarner Losh    eval $*
259b544478SWarner Losh}
269b544478SWarner Losh
27*17160f21SJessica Clarkefind_part() {
28cfc94828SWarner Losh    dev=$1
29cfc94828SWarner Losh    part=$2
30cfc94828SWarner Losh
31cfc94828SWarner Losh    gpart show $dev | tail +2 | awk '$4 == "'$part'" { print $3; }'
32cfc94828SWarner Losh}
33cfc94828SWarner Losh
34db8b5613SRebecca Cranget_uefi_bootname() {
35c89deb8fSWarner Losh
36db8b5613SRebecca Cran    case ${TARGET:-$(uname -m)} in
37db8b5613SRebecca Cran        amd64) echo bootx64 ;;
38db8b5613SRebecca Cran        arm64) echo bootaa64 ;;
39db8b5613SRebecca Cran        i386) echo bootia32 ;;
40db8b5613SRebecca Cran        arm) echo bootarm ;;
41d46a2a00SMitchell Horne        riscv) echo bootriscv64 ;;
42db8b5613SRebecca Cran        *) die "machine type $(uname -m) doesn't support UEFI" ;;
43db8b5613SRebecca Cran    esac
44db8b5613SRebecca Cran}
45c89deb8fSWarner Losh
46db8b5613SRebecca Cranmake_esp_file() {
4714113f12SMatt Macy    local file sizekb loader device stagedir fatbits efibootname
48db8b5613SRebecca Cran
49db8b5613SRebecca Cran    file=$1
50db8b5613SRebecca Cran    sizekb=$2
51db8b5613SRebecca Cran    loader=$3
52db8b5613SRebecca Cran
53db8b5613SRebecca Cran    if [ "$sizekb" -ge "$fat32min" ]; then
54db8b5613SRebecca Cran        fatbits=32
55db8b5613SRebecca Cran    elif [ "$sizekb" -ge "$fat16min" ]; then
56db8b5613SRebecca Cran        fatbits=16
57db8b5613SRebecca Cran    else
58db8b5613SRebecca Cran        fatbits=12
59db8b5613SRebecca Cran    fi
60db8b5613SRebecca Cran
6114113f12SMatt Macy    stagedir=$(mktemp -d /tmp/stand-test.XXXXXX)
6214113f12SMatt Macy    mkdir -p "${stagedir}/EFI/BOOT"
63db8b5613SRebecca Cran    efibootname=$(get_uefi_bootname)
6414113f12SMatt Macy    cp "${loader}" "${stagedir}/EFI/BOOT/${efibootname}.efi"
6514113f12SMatt Macy    makefs -t msdos \
6614113f12SMatt Macy	-o fat_type=${fatbits} \
6714113f12SMatt Macy	-o sectors_per_cluster=1 \
6814113f12SMatt Macy	-o volume_label=EFISYS \
6914113f12SMatt Macy	-s ${sizekb}k \
7014113f12SMatt Macy	"${file}" "${stagedir}"
7114113f12SMatt Macy    rm -rf "${stagedir}"
72db8b5613SRebecca Cran}
73db8b5613SRebecca Cran
74db8b5613SRebecca Cranmake_esp_device() {
75db8b5613SRebecca Cran    local dev file mntpt fstype efibootname kbfree loadersize efibootfile
76db8b5613SRebecca Cran    local isboot1 existingbootentryloaderfile bootorder bootentry
77db8b5613SRebecca Cran
78db8b5613SRebecca Cran    # ESP device node
79db8b5613SRebecca Cran    dev=$1
80db8b5613SRebecca Cran    file=$2
81db8b5613SRebecca Cran
82db8b5613SRebecca Cran    mntpt=$(mktemp -d /tmp/stand-test.XXXXXX)
83db8b5613SRebecca Cran
84db8b5613SRebecca Cran    # See if we're using an existing (formatted) ESP
85db8b5613SRebecca Cran    fstype=$(fstyp "${dev}")
86db8b5613SRebecca Cran
87db8b5613SRebecca Cran    if [ "${fstype}" != "msdosfs" ]; then
88db8b5613SRebecca Cran        newfs_msdos -F 32 -c 1 -L EFISYS "${dev}" > /dev/null 2>&1
89db8b5613SRebecca Cran    fi
90db8b5613SRebecca Cran
91db8b5613SRebecca Cran    mount -t msdosfs "${dev}" "${mntpt}"
92db8b5613SRebecca Cran    if [ $? -ne 0 ]; then
93db8b5613SRebecca Cran        die "Failed to mount ${dev} as an msdosfs filesystem"
94db8b5613SRebecca Cran    fi
95db8b5613SRebecca Cran
96db8b5613SRebecca Cran    echo "Mounted ESP ${dev} on ${mntpt}"
97db8b5613SRebecca Cran
98db8b5613SRebecca Cran    efibootname=$(get_uefi_bootname)
99db8b5613SRebecca Cran    kbfree=$(df -k "${mntpt}" | tail -1 | cut -w -f 4)
100db8b5613SRebecca Cran    loadersize=$(stat -f %z "${file}")
101db8b5613SRebecca Cran    loadersize=$((loadersize / 1024))
102db8b5613SRebecca Cran
103db8b5613SRebecca Cran    # Check if /EFI/BOOT/BOOTxx.EFI is the FreeBSD boot1.efi
104db8b5613SRebecca Cran    # If it is, remove it to avoid leaving stale files around
105db8b5613SRebecca Cran    efibootfile="${mntpt}/EFI/BOOT/${efibootname}.efi"
106db8b5613SRebecca Cran    if [ -f "${efibootfile}" ]; then
107db8b5613SRebecca Cran        isboot1=$(strings "${efibootfile}" | grep "FreeBSD EFI boot block")
108db8b5613SRebecca Cran
109db8b5613SRebecca Cran        if [ -n "${isboot1}" ] && [ "$kbfree" -lt "${loadersize}" ]; then
110db8b5613SRebecca Cran            echo "Only ${kbfree}KB space remaining: removing old FreeBSD boot1.efi file /EFI/BOOT/${efibootname}.efi"
111db8b5613SRebecca Cran            rm "${efibootfile}"
112db8b5613SRebecca Cran            rmdir "${mntpt}/EFI/BOOT"
113db8b5613SRebecca Cran        else
114db8b5613SRebecca Cran            echo "${kbfree}KB space remaining on ESP: renaming old boot1.efi file /EFI/BOOT/${efibootname}.efi /EFI/BOOT/${efibootname}-old.efi"
115db8b5613SRebecca Cran            mv "${efibootfile}" "${mntpt}/EFI/BOOT/${efibootname}-old.efi"
116db8b5613SRebecca Cran        fi
117db8b5613SRebecca Cran    fi
118db8b5613SRebecca Cran
119db8b5613SRebecca Cran    if [ ! -f "${mntpt}/EFI/freebsd/loader.efi" ] && [ "$kbfree" -lt "$loadersize" ]; then
120db8b5613SRebecca Cran        umount "${mntpt}"
121db8b5613SRebecca Cran	rmdir "${mntpt}"
122db8b5613SRebecca Cran        echo "Failed to update the EFI System Partition ${dev}"
123db8b5613SRebecca Cran        echo "Insufficient space remaining for ${file}"
124db8b5613SRebecca Cran        echo "Run e.g \"mount -t msdosfs ${dev} /mnt\" to inspect it for files that can be removed."
125db8b5613SRebecca Cran        die
126db8b5613SRebecca Cran    fi
127db8b5613SRebecca Cran
128db8b5613SRebecca Cran    mkdir -p "${mntpt}/EFI/freebsd"
129db8b5613SRebecca Cran
130db8b5613SRebecca Cran    # Keep a copy of the existing loader.efi in case there's a problem with the new one
131db8b5613SRebecca Cran    if [ -f "${mntpt}/EFI/freebsd/loader.efi" ] && [ "$kbfree" -gt "$((loadersize * 2))" ]; then
132db8b5613SRebecca Cran        cp "${mntpt}/EFI/freebsd/loader.efi" "${mntpt}/EFI/freebsd/loader-old.efi"
133db8b5613SRebecca Cran    fi
134db8b5613SRebecca Cran
135db8b5613SRebecca Cran    echo "Copying loader to /EFI/freebsd on ESP"
136db8b5613SRebecca Cran    cp "${file}" "${mntpt}/EFI/freebsd/loader.efi"
137db8b5613SRebecca Cran
1380661cd79SRebecca Cran    if [ -n "${updatesystem}" ]; then
139db8b5613SRebecca Cran        existingbootentryloaderfile=$(efibootmgr -v | grep "${mntpt}//EFI/freebsd/loader.efi")
140db8b5613SRebecca Cran
141db8b5613SRebecca Cran        if [ -z "$existingbootentryloaderfile" ]; then
142db8b5613SRebecca Cran            # Try again without the double forward-slash in the path
143db8b5613SRebecca Cran            existingbootentryloaderfile=$(efibootmgr -v | grep "${mntpt}/EFI/freebsd/loader.efi")
144db8b5613SRebecca Cran        fi
145db8b5613SRebecca Cran
146db8b5613SRebecca Cran        if [ -z "$existingbootentryloaderfile" ]; then
147db8b5613SRebecca Cran            echo "Creating UEFI boot entry for FreeBSD"
148db8b5613SRebecca Cran            efibootmgr --create --label FreeBSD --loader "${mntpt}/EFI/freebsd/loader.efi" > /dev/null
149db8b5613SRebecca Cran            if [ $? -ne 0 ]; then
150db8b5613SRebecca Cran                die "Failed to create new boot entry"
151db8b5613SRebecca Cran            fi
152db8b5613SRebecca Cran
153db8b5613SRebecca Cran            # When creating new entries, efibootmgr doesn't mark them active, so we need to
154db8b5613SRebecca Cran            # do so. It doesn't make it easy to find which entry it just added, so rely on
155db8b5613SRebecca Cran            # the fact that it places the new entry first in BootOrder.
156db8b5613SRebecca Cran            bootorder=$(efivar --name 8be4df61-93ca-11d2-aa0d-00e098032b8c-BootOrder --print --no-name --hex | head -1)
157db8b5613SRebecca Cran            bootentry=$(echo "${bootorder}" | cut -w -f 3)$(echo "${bootorder}" | cut -w -f 2)
158db8b5613SRebecca Cran            echo "Marking UEFI boot entry ${bootentry} active"
159db8b5613SRebecca Cran            efibootmgr --activate "${bootentry}" > /dev/null
160db8b5613SRebecca Cran        else
161db8b5613SRebecca Cran            echo "Existing UEFI FreeBSD boot entry found: not creating a new one"
162db8b5613SRebecca Cran        fi
1630661cd79SRebecca Cran    else
1640661cd79SRebecca Cran	# Configure for booting from removable media
1650661cd79SRebecca Cran	if [ ! -d "${mntpt}/EFI/BOOT" ]; then
1660661cd79SRebecca Cran		mkdir -p "${mntpt}/EFI/BOOT"
1670661cd79SRebecca Cran	fi
1680661cd79SRebecca Cran	cp "${file}" "${mntpt}/EFI/BOOT/${efibootname}.efi"
1690661cd79SRebecca Cran    fi
170db8b5613SRebecca Cran
171db8b5613SRebecca Cran    umount "${mntpt}"
172db8b5613SRebecca Cran    rmdir "${mntpt}"
173db8b5613SRebecca Cran    echo "Finished updating ESP"
174db8b5613SRebecca Cran}
175db8b5613SRebecca Cran
176db8b5613SRebecca Cranmake_esp() {
177db8b5613SRebecca Cran    local file loaderfile
178db8b5613SRebecca Cran
179db8b5613SRebecca Cran    file=$1
180db8b5613SRebecca Cran    loaderfile=$2
181db8b5613SRebecca Cran
182db8b5613SRebecca Cran    if [ -f "$file" ]; then
183db8b5613SRebecca Cran        make_esp_file ${file} ${fat32min} ${loaderfile}
184db8b5613SRebecca Cran    else
185db8b5613SRebecca Cran        make_esp_device ${file} ${loaderfile}
186db8b5613SRebecca Cran    fi
187c89deb8fSWarner Losh}
188c89deb8fSWarner Losh
189c89deb8fSWarner Loshmake_esp_mbr() {
190c89deb8fSWarner Losh    dev=$1
191c89deb8fSWarner Losh    dst=$2
192c89deb8fSWarner Losh
193*17160f21SJessica Clarke    s=$(find_part $dev "!239")
194c89deb8fSWarner Losh    if [ -z "$s" ] ; then
195*17160f21SJessica Clarke	s=$(find_part $dev "efi")
196394641cfSIan Lepore	if [ -z "$s" ] ; then
197c89deb8fSWarner Losh	    die "No ESP slice found"
198c89deb8fSWarner Losh    	fi
199394641cfSIan Lepore    fi
200db8b5613SRebecca Cran    make_esp /dev/${dev}s${s} ${dst}/boot/loader.efi
201c89deb8fSWarner Losh}
202c89deb8fSWarner Losh
203c89deb8fSWarner Loshmake_esp_gpt() {
204c89deb8fSWarner Losh    dev=$1
205c89deb8fSWarner Losh    dst=$2
206c89deb8fSWarner Losh
207*17160f21SJessica Clarke    idx=$(find_part $dev "efi")
208c89deb8fSWarner Losh    if [ -z "$idx" ] ; then
209c89deb8fSWarner Losh	die "No ESP partition found"
210c89deb8fSWarner Losh    fi
211db8b5613SRebecca Cran    make_esp /dev/${dev}p${idx} ${dst}/boot/loader.efi
212c89deb8fSWarner Losh}
213c89deb8fSWarner Losh
214cfc94828SWarner Loshboot_nogeli_gpt_ufs_legacy() {
215cfc94828SWarner Losh    dev=$1
216cfc94828SWarner Losh    dst=$2
217cfc94828SWarner Losh
218*17160f21SJessica Clarke    idx=$(find_part $dev "freebsd-boot")
219cfc94828SWarner Losh    if [ -z "$idx" ] ; then
220cfc94828SWarner Losh	die "No freebsd-boot partition found"
221cfc94828SWarner Losh    fi
2229b544478SWarner Losh    doit gpart bootcode -b ${gpt0} -p ${gpt2} -i $idx $dev
223f438a143SAllan Jude}
224f438a143SAllan Jude
225f438a143SAllan Judeboot_nogeli_gpt_ufs_uefi() {
226c89deb8fSWarner Losh    make_esp_gpt $1 $2
227f438a143SAllan Jude}
228f438a143SAllan Jude
229f438a143SAllan Judeboot_nogeli_gpt_ufs_both() {
230f438a143SAllan Jude    boot_nogeli_gpt_ufs_legacy $1 $2 $3
231f438a143SAllan Jude    boot_nogeli_gpt_ufs_uefi $1 $2 $3
232f438a143SAllan Jude}
233f438a143SAllan Jude
234f438a143SAllan Judeboot_nogeli_gpt_zfs_legacy() {
235f438a143SAllan Jude    dev=$1
236f438a143SAllan Jude    dst=$2
237f438a143SAllan Jude
238*17160f21SJessica Clarke    idx=$(find_part $dev "freebsd-boot")
239f438a143SAllan Jude    if [ -z "$idx" ] ; then
240f438a143SAllan Jude	die "No freebsd-boot partition found"
241f438a143SAllan Jude    fi
242f438a143SAllan Jude    doit gpart bootcode -b ${gpt0} -p ${gptzfs2} -i $idx $dev
243cfc94828SWarner Losh}
244cfc94828SWarner Losh
245712b4ca9SAllan Judeboot_nogeli_gpt_zfs_uefi() {
246c89deb8fSWarner Losh    make_esp_gpt $1 $2
247712b4ca9SAllan Jude}
248712b4ca9SAllan Jude
249712b4ca9SAllan Judeboot_nogeli_gpt_zfs_both() {
250f438a143SAllan Jude    boot_nogeli_gpt_zfs_legacy $1 $2 $3
251f438a143SAllan Jude    boot_nogeli_gpt_zfs_uefi $1 $2 $3
252cfc94828SWarner Losh}
253cfc94828SWarner Losh
254cfc94828SWarner Loshboot_nogeli_mbr_ufs_legacy() {
255cfc94828SWarner Losh    dev=$1
256cfc94828SWarner Losh    dst=$2
257cfc94828SWarner Losh
2589b544478SWarner Losh    doit gpart bootcode -b ${mbr0} ${dev}
259*17160f21SJessica Clarke    s=$(find_part $dev "freebsd")
260cfc94828SWarner Losh    if [ -z "$s" ] ; then
261f438a143SAllan Jude	die "No freebsd slice found"
262cfc94828SWarner Losh    fi
2639b544478SWarner Losh    doit gpart bootcode -p ${mbr2} ${dev}s${s}
264f438a143SAllan Jude}
265f438a143SAllan Jude
266f438a143SAllan Judeboot_nogeli_mbr_ufs_uefi() {
267c89deb8fSWarner Losh    make_esp_mbr $1 $2
268f438a143SAllan Jude}
269f438a143SAllan Jude
270f438a143SAllan Judeboot_nogeli_mbr_ufs_both() {
271f438a143SAllan Jude    boot_nogeli_mbr_ufs_legacy $1 $2 $3
272f438a143SAllan Jude    boot_nogeli_mbr_ufs_uefi $1 $2 $3
273f438a143SAllan Jude}
274f438a143SAllan Jude
275f438a143SAllan Judeboot_nogeli_mbr_zfs_legacy() {
276f438a143SAllan Jude    dev=$1
277f438a143SAllan Jude    dst=$2
278f438a143SAllan Jude
279f438a143SAllan Jude    # search to find the BSD slice
280*17160f21SJessica Clarke    s=$(find_part $dev "freebsd")
281f438a143SAllan Jude    if [ -z "$s" ] ; then
282f438a143SAllan Jude	die "No BSD slice found"
283f438a143SAllan Jude    fi
284*17160f21SJessica Clarke    idx=$(find_part ${dev}s${s} "freebsd-zfs")
285f438a143SAllan Jude    if [ -z "$idx" ] ; then
286f438a143SAllan Jude	die "No freebsd-zfs slice found"
287f438a143SAllan Jude    fi
288f438a143SAllan Jude    # search to find the freebsd-zfs partition within the slice
289f438a143SAllan Jude    # Or just assume it is 'a' because it has to be since it fails otherwise
290f438a143SAllan Jude    doit gpart bootcode -b ${dst}/boot/mbr ${dev}
291f438a143SAllan Jude    dd if=${dst}/boot/zfsboot of=/tmp/zfsboot1 count=1
292f438a143SAllan Jude    doit gpart bootcode -b /tmp/zfsboot1 ${dev}s${s}	# Put boot1 into the start of part
293f438a143SAllan Jude    sysctl kern.geom.debugflags=0x10		# Put boot2 into ZFS boot slot
294f438a143SAllan Jude    doit dd if=${dst}/boot/zfsboot of=/dev/${dev}s${s}a skip=1 seek=1024
295f438a143SAllan Jude    sysctl kern.geom.debugflags=0x0
296f438a143SAllan Jude}
297f438a143SAllan Jude
298f438a143SAllan Judeboot_nogeli_mbr_zfs_uefi() {
299394641cfSIan Lepore    make_esp_mbr $1 $2
300f438a143SAllan Jude}
301f438a143SAllan Jude
302f438a143SAllan Judeboot_nogeli_mbr_zfs_both() {
303f438a143SAllan Jude    boot_nogeli_mbr_zfs_legacy $1 $2 $3
304f438a143SAllan Jude    boot_nogeli_mbr_zfs_uefi $1 $2 $3
305f438a143SAllan Jude}
306f438a143SAllan Jude
307f438a143SAllan Judeboot_geli_gpt_ufs_legacy() {
308f438a143SAllan Jude    boot_nogeli_gpt_ufs_legacy $1 $2 $3
309f438a143SAllan Jude}
310f438a143SAllan Jude
311f438a143SAllan Judeboot_geli_gpt_ufs_uefi() {
312f438a143SAllan Jude    boot_nogeli_gpt_ufs_uefi $1 $2 $3
313f438a143SAllan Jude}
314f438a143SAllan Jude
315f438a143SAllan Judeboot_geli_gpt_ufs_both() {
316f438a143SAllan Jude    boot_nogeli_gpt_ufs_both $1 $2 $3
317f438a143SAllan Jude}
318f438a143SAllan Jude
319f438a143SAllan Judeboot_geli_gpt_zfs_legacy() {
320f438a143SAllan Jude    boot_nogeli_gpt_zfs_legacy $1 $2 $3
321f438a143SAllan Jude}
322f438a143SAllan Jude
323f438a143SAllan Judeboot_geli_gpt_zfs_uefi() {
324f438a143SAllan Jude    boot_nogeli_gpt_zfs_uefi $1 $2 $3
325f438a143SAllan Jude}
326f438a143SAllan Jude
327f438a143SAllan Judeboot_geli_gpt_zfs_both() {
328f438a143SAllan Jude    boot_nogeli_gpt_zfs_both $1 $2 $3
329f438a143SAllan Jude}
330f438a143SAllan Jude
331f438a143SAllan Jude# GELI+MBR is not a valid configuration
332f438a143SAllan Judeboot_geli_mbr_ufs_legacy() {
333f438a143SAllan Jude    exit 1
334f438a143SAllan Jude}
335f438a143SAllan Jude
336f438a143SAllan Judeboot_geli_mbr_ufs_uefi() {
337f438a143SAllan Jude    exit 1
338f438a143SAllan Jude}
339f438a143SAllan Jude
340f438a143SAllan Judeboot_geli_mbr_ufs_both() {
341f438a143SAllan Jude    exit 1
342f438a143SAllan Jude}
343f438a143SAllan Jude
344f438a143SAllan Judeboot_geli_mbr_zfs_legacy() {
345f438a143SAllan Jude    exit 1
346f438a143SAllan Jude}
347f438a143SAllan Jude
348f438a143SAllan Judeboot_geli_mbr_zfs_uefi() {
349f438a143SAllan Jude    exit 1
350f438a143SAllan Jude}
351f438a143SAllan Jude
352f438a143SAllan Judeboot_geli_mbr_zfs_both() {
353f438a143SAllan Jude    exit 1
354cfc94828SWarner Losh}
355cfc94828SWarner Losh
356ba8d50d0SMarius Stroblboot_nogeli_vtoc8_ufs_ofw() {
357ba8d50d0SMarius Strobl    dev=$1
358ba8d50d0SMarius Strobl    dst=$2
359ba8d50d0SMarius Strobl
360ba8d50d0SMarius Strobl    # For non-native builds, ensure that geom_part(4) supports VTOC8.
361ba8d50d0SMarius Strobl    kldload geom_part_vtoc8.ko
362ba8d50d0SMarius Strobl    doit gpart bootcode -p ${vtoc8} ${dev}
363ba8d50d0SMarius Strobl}
364ba8d50d0SMarius Strobl
365db8b5613SRebecca Cranusage() {
366db8b5613SRebecca Cran	printf 'Usage: %s -b bios [-d destdir] -f fs [-g geli] [-h] [-o optargs] -s scheme <bootdev>\n' "$0"
367db8b5613SRebecca Cran	printf 'Options:\n'
368db8b5613SRebecca Cran	printf ' bootdev       device to install the boot code on\n'
369db8b5613SRebecca Cran	printf ' -b bios       bios type: legacy, uefi or both\n'
370db8b5613SRebecca Cran	printf ' -d destdir    destination filesystem root\n'
371db8b5613SRebecca Cran	printf ' -f fs         filesystem type: ufs or zfs\n'
372db8b5613SRebecca Cran	printf ' -g geli       yes or no\n'
373db8b5613SRebecca Cran	printf ' -h            this help/usage text\n'
3740661cd79SRebecca Cran	printf ' -u            Run commands such as efibootmgr to update the\n'
3750661cd79SRebecca Cran	printf '               currently running system\n'
376db8b5613SRebecca Cran	printf ' -o optargs    optional arguments\n'
377db8b5613SRebecca Cran	printf ' -s scheme     mbr or gpt\n'
378db8b5613SRebecca Cran	exit 0
379db8b5613SRebecca Cran}
380db8b5613SRebecca Cran
381db8b5613SRebecca Cransrcroot=/
382cfc94828SWarner Losh
383cfc94828SWarner Losh# Note: we really don't support geli boot in this script yet.
384cfc94828SWarner Loshgeli=nogeli
385cfc94828SWarner Losh
3860661cd79SRebecca Cranwhile getopts "b:d:f:g:ho:s:u" opt; do
387cfc94828SWarner Losh    case "$opt" in
388cfc94828SWarner Losh	b)
389cfc94828SWarner Losh	    bios=${OPTARG}
390cfc94828SWarner Losh	    ;;
391cfc94828SWarner Losh	d)
392db8b5613SRebecca Cran	    srcroot=${OPTARG}
393cfc94828SWarner Losh	    ;;
394cfc94828SWarner Losh	f)
395cfc94828SWarner Losh	    fs=${OPTARG}
396cfc94828SWarner Losh	    ;;
397cfc94828SWarner Losh	g)
398cfc94828SWarner Losh	    case ${OPTARG} in
399cfc94828SWarner Losh		[Yy][Ee][Ss]|geli) geli=geli ;;
400cfc94828SWarner Losh		*) geli=nogeli ;;
401cfc94828SWarner Losh	    esac
402cfc94828SWarner Losh	    ;;
4030661cd79SRebecca Cran	u)
4040661cd79SRebecca Cran	    updatesystem=1
4050661cd79SRebecca Cran	    ;;
406cfc94828SWarner Losh	o)
407cfc94828SWarner Losh	    opts=${OPTARG}
408cfc94828SWarner Losh	    ;;
409cfc94828SWarner Losh	s)
410cfc94828SWarner Losh	    scheme=${OPTARG}
411cfc94828SWarner Losh	    ;;
412db8b5613SRebecca Cran
413db8b5613SRebecca Cran	?|h)
414db8b5613SRebecca Cran            usage
415db8b5613SRebecca Cran            ;;
416cfc94828SWarner Losh    esac
417cfc94828SWarner Loshdone
418cfc94828SWarner Losh
419db8b5613SRebecca Cranif [ -n "${scheme}" ] && [ -n "${fs}" ] && [ -n "${bios}" ]; then
420cfc94828SWarner Losh    shift $((OPTIND-1))
421cfc94828SWarner Losh    dev=$1
422db8b5613SRebecca Cranfi
423cfc94828SWarner Losh
424cfc94828SWarner Losh# For gpt, we need to install pmbr as the primary boot loader
425cfc94828SWarner Losh# it knows about
426db8b5613SRebecca Crangpt0=${srcroot}/boot/pmbr
427db8b5613SRebecca Crangpt2=${srcroot}/boot/gptboot
428db8b5613SRebecca Crangptzfs2=${srcroot}/boot/gptzfsboot
429cfc94828SWarner Losh
430f438a143SAllan Jude# For MBR, we have lots of choices, but select mbr, boot0 has issues with UEFI
431db8b5613SRebecca Cranmbr0=${srcroot}/boot/mbr
432db8b5613SRebecca Cranmbr2=${srcroot}/boot/boot
433cfc94828SWarner Losh
434ba8d50d0SMarius Strobl# VTOC8
435db8b5613SRebecca Cranvtoc8=${srcroot}/boot/boot1
436ba8d50d0SMarius Strobl
437cfc94828SWarner Losh# sanity check here
438cfc94828SWarner Losh
439db8b5613SRebecca Cran# Check if we've been given arguments. If not, this script is probably being
440db8b5613SRebecca Cran# sourced, so we shouldn't run anything.
441db8b5613SRebecca Cranif [ -n "${dev}" ]; then
442db8b5613SRebecca Cran	eval boot_${geli}_${scheme}_${fs}_${bios} $dev $srcroot $opts || echo "Unsupported boot env: ${geli}-${scheme}-${fs}-${bios}"
443db8b5613SRebecca Cranfi
444