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