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