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 13cfc94828SWarner Loshdie() { 14cfc94828SWarner Losh echo $* 15cfc94828SWarner Losh exit 1 16cfc94828SWarner Losh} 17cfc94828SWarner Losh 189b544478SWarner Loshdoit() { 199b544478SWarner Losh echo $* 209b544478SWarner Losh eval $* 219b544478SWarner Losh} 229b544478SWarner Losh 23cfc94828SWarner Loshfind-part() { 24cfc94828SWarner Losh dev=$1 25cfc94828SWarner Losh part=$2 26cfc94828SWarner Losh 27cfc94828SWarner Losh gpart show $dev | tail +2 | awk '$4 == "'$part'" { print $3; }' 28cfc94828SWarner Losh} 29cfc94828SWarner Losh 30c89deb8fSWarner Loshmake_esp() { 31c89deb8fSWarner Losh local dev dst mntpt 32c89deb8fSWarner Losh 33c89deb8fSWarner Losh dev=$1 34c89deb8fSWarner Losh dst=$2 35c89deb8fSWarner Losh 36e74c8ac8SIan Lepore newfs_msdos -a 32 ${dev} 37c89deb8fSWarner Losh mntpt=$(mktemp -d /tmp/stand-test.XXXXXX) 38e74c8ac8SIan Lepore mount -t msdos ${dev} ${mntpt} 39c89deb8fSWarner Losh mkdir -p ${mntpt}/efi/boot 40c89deb8fSWarner Losh cp ${dst}/boot/loader.efi ${mntpt}/efi/boot/bootx64.efi 41c89deb8fSWarner Losh umount ${mntpt} 42c89deb8fSWarner Losh rmdir ${mntpt} 43c89deb8fSWarner Losh} 44c89deb8fSWarner Losh 45c89deb8fSWarner Loshmake_esp_mbr() { 46c89deb8fSWarner Losh dev=$1 47c89deb8fSWarner Losh dst=$2 48c89deb8fSWarner Losh 49c89deb8fSWarner Losh s=$(find-part $dev "!239") 50c89deb8fSWarner Losh if [ -z "$s" ] ; then 51*394641cfSIan Lepore s=$(find-part $dev "efi") 52*394641cfSIan Lepore if [ -z "$s" ] ; then 53c89deb8fSWarner Losh die "No ESP slice found" 54c89deb8fSWarner Losh fi 55*394641cfSIan Lepore fi 56c89deb8fSWarner Losh make_esp /dev/${dev}s${s} ${dst} 57c89deb8fSWarner Losh} 58c89deb8fSWarner Losh 59c89deb8fSWarner Loshmake_esp_gpt() { 60c89deb8fSWarner Losh dev=$1 61c89deb8fSWarner Losh dst=$2 62c89deb8fSWarner Losh 63c89deb8fSWarner Losh idx=$(find-part $dev "efi") 64c89deb8fSWarner Losh if [ -z "$idx" ] ; then 65c89deb8fSWarner Losh die "No ESP partition found" 66c89deb8fSWarner Losh fi 67c89deb8fSWarner Losh make_esp /dev/${dev}p${idx} ${dst} 68c89deb8fSWarner Losh} 69c89deb8fSWarner Losh 70cfc94828SWarner Loshboot_nogeli_gpt_ufs_legacy() { 71cfc94828SWarner Losh dev=$1 72cfc94828SWarner Losh dst=$2 73cfc94828SWarner Losh 74cfc94828SWarner Losh idx=$(find-part $dev "freebsd-boot") 75cfc94828SWarner Losh if [ -z "$idx" ] ; then 76cfc94828SWarner Losh die "No freebsd-boot partition found" 77cfc94828SWarner Losh fi 789b544478SWarner Losh doit gpart bootcode -b ${gpt0} -p ${gpt2} -i $idx $dev 79f438a143SAllan Jude} 80f438a143SAllan Jude 81f438a143SAllan Judeboot_nogeli_gpt_ufs_uefi() { 82c89deb8fSWarner Losh make_esp_gpt $1 $2 83f438a143SAllan Jude} 84f438a143SAllan Jude 85f438a143SAllan Judeboot_nogeli_gpt_ufs_both() { 86f438a143SAllan Jude boot_nogeli_gpt_ufs_legacy $1 $2 $3 87f438a143SAllan Jude boot_nogeli_gpt_ufs_uefi $1 $2 $3 88f438a143SAllan Jude} 89f438a143SAllan Jude 90f438a143SAllan Judeboot_nogeli_gpt_zfs_legacy() { 91f438a143SAllan Jude dev=$1 92f438a143SAllan Jude dst=$2 93f438a143SAllan Jude 94f438a143SAllan Jude idx=$(find-part $dev "freebsd-boot") 95f438a143SAllan Jude if [ -z "$idx" ] ; then 96f438a143SAllan Jude die "No freebsd-boot partition found" 97f438a143SAllan Jude fi 98f438a143SAllan Jude doit gpart bootcode -b ${gpt0} -p ${gptzfs2} -i $idx $dev 99cfc94828SWarner Losh} 100cfc94828SWarner Losh 101712b4ca9SAllan Judeboot_nogeli_gpt_zfs_uefi() { 102c89deb8fSWarner Losh make_esp_gpt $1 $2 103712b4ca9SAllan Jude} 104712b4ca9SAllan Jude 105712b4ca9SAllan Judeboot_nogeli_gpt_zfs_both() { 106f438a143SAllan Jude boot_nogeli_gpt_zfs_legacy $1 $2 $3 107f438a143SAllan Jude boot_nogeli_gpt_zfs_uefi $1 $2 $3 108cfc94828SWarner Losh} 109cfc94828SWarner Losh 110cfc94828SWarner Loshboot_nogeli_mbr_ufs_legacy() { 111cfc94828SWarner Losh dev=$1 112cfc94828SWarner Losh dst=$2 113cfc94828SWarner Losh 1149b544478SWarner Losh doit gpart bootcode -b ${mbr0} ${dev} 115f438a143SAllan Jude s=$(find-part $dev "freebsd") 116cfc94828SWarner Losh if [ -z "$s" ] ; then 117f438a143SAllan Jude die "No freebsd slice found" 118cfc94828SWarner Losh fi 1199b544478SWarner Losh doit gpart bootcode -p ${mbr2} ${dev}s${s} 120f438a143SAllan Jude} 121f438a143SAllan Jude 122f438a143SAllan Judeboot_nogeli_mbr_ufs_uefi() { 123c89deb8fSWarner Losh make_esp_mbr $1 $2 124f438a143SAllan Jude} 125f438a143SAllan Jude 126f438a143SAllan Judeboot_nogeli_mbr_ufs_both() { 127f438a143SAllan Jude boot_nogeli_mbr_ufs_legacy $1 $2 $3 128f438a143SAllan Jude boot_nogeli_mbr_ufs_uefi $1 $2 $3 129f438a143SAllan Jude} 130f438a143SAllan Jude 131f438a143SAllan Judeboot_nogeli_mbr_zfs_legacy() { 132f438a143SAllan Jude dev=$1 133f438a143SAllan Jude dst=$2 134f438a143SAllan Jude 135f438a143SAllan Jude # search to find the BSD slice 136f438a143SAllan Jude s=$(find-part $dev "freebsd") 137f438a143SAllan Jude if [ -z "$s" ] ; then 138f438a143SAllan Jude die "No BSD slice found" 139f438a143SAllan Jude fi 140f438a143SAllan Jude idx=$(find-part ${dev}s${s} "freebsd-zfs") 141f438a143SAllan Jude if [ -z "$idx" ] ; then 142f438a143SAllan Jude die "No freebsd-zfs slice found" 143f438a143SAllan Jude fi 144f438a143SAllan Jude # search to find the freebsd-zfs partition within the slice 145f438a143SAllan Jude # Or just assume it is 'a' because it has to be since it fails otherwise 146f438a143SAllan Jude doit gpart bootcode -b ${dst}/boot/mbr ${dev} 147f438a143SAllan Jude dd if=${dst}/boot/zfsboot of=/tmp/zfsboot1 count=1 148f438a143SAllan Jude doit gpart bootcode -b /tmp/zfsboot1 ${dev}s${s} # Put boot1 into the start of part 149f438a143SAllan Jude sysctl kern.geom.debugflags=0x10 # Put boot2 into ZFS boot slot 150f438a143SAllan Jude doit dd if=${dst}/boot/zfsboot of=/dev/${dev}s${s}a skip=1 seek=1024 151f438a143SAllan Jude sysctl kern.geom.debugflags=0x0 152f438a143SAllan Jude} 153f438a143SAllan Jude 154f438a143SAllan Judeboot_nogeli_mbr_zfs_uefi() { 155*394641cfSIan Lepore make_esp_mbr $1 $2 156f438a143SAllan Jude} 157f438a143SAllan Jude 158f438a143SAllan Judeboot_nogeli_mbr_zfs_both() { 159f438a143SAllan Jude boot_nogeli_mbr_zfs_legacy $1 $2 $3 160f438a143SAllan Jude boot_nogeli_mbr_zfs_uefi $1 $2 $3 161f438a143SAllan Jude} 162f438a143SAllan Jude 163f438a143SAllan Judeboot_geli_gpt_ufs_legacy() { 164f438a143SAllan Jude boot_nogeli_gpt_ufs_legacy $1 $2 $3 165f438a143SAllan Jude} 166f438a143SAllan Jude 167f438a143SAllan Judeboot_geli_gpt_ufs_uefi() { 168f438a143SAllan Jude boot_nogeli_gpt_ufs_uefi $1 $2 $3 169f438a143SAllan Jude} 170f438a143SAllan Jude 171f438a143SAllan Judeboot_geli_gpt_ufs_both() { 172f438a143SAllan Jude boot_nogeli_gpt_ufs_both $1 $2 $3 173f438a143SAllan Jude} 174f438a143SAllan Jude 175f438a143SAllan Judeboot_geli_gpt_zfs_legacy() { 176f438a143SAllan Jude boot_nogeli_gpt_zfs_legacy $1 $2 $3 177f438a143SAllan Jude} 178f438a143SAllan Jude 179f438a143SAllan Judeboot_geli_gpt_zfs_uefi() { 180f438a143SAllan Jude boot_nogeli_gpt_zfs_uefi $1 $2 $3 181f438a143SAllan Jude} 182f438a143SAllan Jude 183f438a143SAllan Judeboot_geli_gpt_zfs_both() { 184f438a143SAllan Jude boot_nogeli_gpt_zfs_both $1 $2 $3 185f438a143SAllan Jude} 186f438a143SAllan Jude 187f438a143SAllan Jude# GELI+MBR is not a valid configuration 188f438a143SAllan Judeboot_geli_mbr_ufs_legacy() { 189f438a143SAllan Jude exit 1 190f438a143SAllan Jude} 191f438a143SAllan Jude 192f438a143SAllan Judeboot_geli_mbr_ufs_uefi() { 193f438a143SAllan Jude exit 1 194f438a143SAllan Jude} 195f438a143SAllan Jude 196f438a143SAllan Judeboot_geli_mbr_ufs_both() { 197f438a143SAllan Jude exit 1 198f438a143SAllan Jude} 199f438a143SAllan Jude 200f438a143SAllan Judeboot_geli_mbr_zfs_legacy() { 201f438a143SAllan Jude exit 1 202f438a143SAllan Jude} 203f438a143SAllan Jude 204f438a143SAllan Judeboot_geli_mbr_zfs_uefi() { 205f438a143SAllan Jude exit 1 206f438a143SAllan Jude} 207f438a143SAllan Jude 208f438a143SAllan Judeboot_geli_mbr_zfs_both() { 209f438a143SAllan Jude exit 1 210cfc94828SWarner Losh} 211cfc94828SWarner Losh 212ba8d50d0SMarius Stroblboot_nogeli_vtoc8_ufs_ofw() { 213ba8d50d0SMarius Strobl dev=$1 214ba8d50d0SMarius Strobl dst=$2 215ba8d50d0SMarius Strobl 216ba8d50d0SMarius Strobl # For non-native builds, ensure that geom_part(4) supports VTOC8. 217ba8d50d0SMarius Strobl kldload geom_part_vtoc8.ko 218ba8d50d0SMarius Strobl doit gpart bootcode -p ${vtoc8} ${dev} 219ba8d50d0SMarius Strobl} 220ba8d50d0SMarius Strobl 221cfc94828SWarner LoshDESTDIR=/ 222cfc94828SWarner Losh 223cfc94828SWarner Losh# Note: we really don't support geli boot in this script yet. 224cfc94828SWarner Loshgeli=nogeli 225cfc94828SWarner Losh 226cfc94828SWarner Loshwhile getopts "b:d:f:g:o:s:" opt; do 227cfc94828SWarner Losh case "$opt" in 228cfc94828SWarner Losh b) 229cfc94828SWarner Losh bios=${OPTARG} 230cfc94828SWarner Losh ;; 231cfc94828SWarner Losh d) 232cfc94828SWarner Losh DESTDIR=${OPTARG} 233cfc94828SWarner Losh ;; 234cfc94828SWarner Losh f) 235cfc94828SWarner Losh fs=${OPTARG} 236cfc94828SWarner Losh ;; 237cfc94828SWarner Losh g) 238cfc94828SWarner Losh case ${OPTARG} in 239cfc94828SWarner Losh [Yy][Ee][Ss]|geli) geli=geli ;; 240cfc94828SWarner Losh *) geli=nogeli ;; 241cfc94828SWarner Losh esac 242cfc94828SWarner Losh ;; 243cfc94828SWarner Losh o) 244cfc94828SWarner Losh opts=${OPTARG} 245cfc94828SWarner Losh ;; 246cfc94828SWarner Losh s) 247cfc94828SWarner Losh scheme=${OPTARG} 248cfc94828SWarner Losh ;; 249cfc94828SWarner Losh esac 250cfc94828SWarner Loshdone 251cfc94828SWarner Losh 252cfc94828SWarner Loshshift $((OPTIND-1)) 253cfc94828SWarner Loshdev=$1 254cfc94828SWarner Losh 255cfc94828SWarner Losh# For gpt, we need to install pmbr as the primary boot loader 256cfc94828SWarner Losh# it knows about 257cfc94828SWarner Loshgpt0=${DESTDIR}/boot/pmbr 258cfc94828SWarner Loshgpt2=${DESTDIR}/boot/gptboot 259cfc94828SWarner Loshgptzfs2=${DESTDIR}/boot/gptzfsboot 260cfc94828SWarner Losh 261f438a143SAllan Jude# For MBR, we have lots of choices, but select mbr, boot0 has issues with UEFI 262f438a143SAllan Judembr0=${DESTDIR}/boot/mbr 263cfc94828SWarner Loshmbr2=${DESTDIR}/boot/boot 264cfc94828SWarner Losh 265ba8d50d0SMarius Strobl# VTOC8 266ba8d50d0SMarius Stroblvtoc8=${DESTDIR}/boot/boot1 267ba8d50d0SMarius Strobl 268cfc94828SWarner Losh# sanity check here 269cfc94828SWarner Losh 270cfc94828SWarner Losheval boot_${geli}_${scheme}_${fs}_${bios} $dev $DESTDIR $opts || echo "Unsupported boot env: ${geli}-${scheme}-${fs}-${bios}" 271