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