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