1#!/bin/sh 2 3# $FreeBSD$ 4 5# 6# Installs/updates the necessary boot blocks for the desired boot environment 7# 8# Lightly tested.. Intended to be installed, but until it matures, it will just 9# be a boot tool for regression testing. 10 11# insert code here to guess what you have -- yikes! 12 13die() { 14 echo $* 15 exit 1 16} 17 18find-part() { 19 dev=$1 20 part=$2 21 22 gpart show $dev | tail +2 | awk '$4 == "'$part'" { print $3; }' 23} 24 25boot_nogeli_gpt_zfs_legacy() { 26 dev=$1 27 dst=$2 28 29 idx=$(find-part $dev "freebsd-boot") 30 if [ -z "$idx" ] ; then 31 die "No freebsd-boot partition found" 32 fi 33 gpart bootcode -b ${gpt0} -p ${gpt2} -i $idx $dev 34 exit 0 35} 36 37boot_nogeli_gpt_ufs_legacy() { 38 dev=$1 39 dst=$2 40 41 idx=$(find-part $dev "freebsd-boot") 42 if [ -z "$idx" ] ; then 43 die "No freebsd-boot partition found" 44 fi 45 gpart bootcode -b ${gpt0} -p ${gpt2} -i $idx $dev 46 exit 0 47} 48 49boot_nogeli_mbr_zfs_legacy() { 50 dev=$1 51 dst=$2 52 53 # search to find the BSD slice 54 s=$(findpart $dev "freebsd-zfs") 55 if [ -z "$s" ] ; then 56 die "No freebsd-zfs slice found" 57 fi 58 # search to find the freebsd-zfs partition within the slice 59 # Or just assume it is 'a' because it has to be since it fails otherwise 60 dd if=${dst}/boot/zfsboot of=/tmp/zfsboot1 count=1 61 gpart bootcode -b /tmp/zfsboo1 ${dev}s${s} # Put boot1 into the start of part 62 sysctl kern.geom.debugflags=0x10 63 dd if=${dst}/boot/zfsboot iseek=1 seek=1024 # Put boot2 into ZFS boot slot 64 sysctl kern.geom.debugflags=0x0 65 66 exit 0 67} 68 69boot_nogeli_mbr_ufs_legacy() { 70 dev=$1 71 dst=$2 72 73 gpart bootcode -b ${mbr0} ${dev} 74 s=$(findpart $dev "freebsd-ufs") 75 if [ -z "$s" ] ; then 76 die "No freebsd-zfs slice found" 77 fi 78 gpart bootcode -p ${mbr2} ${dev}s${s} 79 exit 0 80} 81 82DESTDIR=/ 83 84# Note: we really don't support geli boot in this script yet. 85geli=nogeli 86 87while getopts "b:d:f:g:o:s:" opt; do 88 case "$opt" in 89 b) 90 bios=${OPTARG} 91 ;; 92 d) 93 DESTDIR=${OPTARG} 94 ;; 95 f) 96 fs=${OPTARG} 97 ;; 98 g) 99 case ${OPTARG} in 100 [Yy][Ee][Ss]|geli) geli=geli ;; 101 *) geli=nogeli ;; 102 esac 103 ;; 104 o) 105 opts=${OPTARG} 106 ;; 107 s) 108 scheme=${OPTARG} 109 ;; 110 esac 111done 112 113shift $((OPTIND-1)) 114dev=$1 115 116# For gpt, we need to install pmbr as the primary boot loader 117# it knows about 118gpt0=${DESTDIR}/boot/pmbr 119gpt2=${DESTDIR}/boot/gptboot 120gptzfs2=${DESTDIR}/boot/gptzfsboot 121 122# For MBR, we have lots of choices, but select boot0 123mbr0=${DESTDIR}/boot/boot0 124mbr2=${DESTDIR}/boot/boot 125 126# sanity check here 127 128eval boot_${geli}_${scheme}_${fs}_${bios} $dev $DESTDIR $opts || echo "Unsupported boot env: ${geli}-${scheme}-${fs}-${bios}" 129