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