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