6 # Installs/updates the necessary boot blocks for the desired boot environment
8 # Lightly tested.. Intended to be installed, but until it matures, it will just
9 # be a boot tool for regression testing.
11 # insert code here to guess what you have -- yikes!
27 gpart show $dev | tail +2 | awk '$4 == "'$part'" { print $3; }'
36 newfs_msdos -a 32 ${dev}
37 mntpt=$(mktemp -d /tmp/stand-test.XXXXXX)
38 mount -t msdos ${dev} ${mntpt}
39 mkdir -p ${mntpt}/efi/boot
40 cp ${dst}/boot/loader.efi ${mntpt}/efi/boot/bootx64.efi
49 s=$(find-part $dev "!239")
51 s=$(find-part $dev "efi")
53 die "No ESP slice found"
56 make_esp /dev/${dev}s${s} ${dst}
63 idx=$(find-part $dev "efi")
64 if [ -z "$idx" ] ; then
65 die "No ESP partition found"
67 make_esp /dev/${dev}p${idx} ${dst}
70 boot_nogeli_gpt_ufs_legacy() {
74 idx=$(find-part $dev "freebsd-boot")
75 if [ -z "$idx" ] ; then
76 die "No freebsd-boot partition found"
78 doit gpart bootcode -b ${gpt0} -p ${gpt2} -i $idx $dev
81 boot_nogeli_gpt_ufs_uefi() {
85 boot_nogeli_gpt_ufs_both() {
86 boot_nogeli_gpt_ufs_legacy $1 $2 $3
87 boot_nogeli_gpt_ufs_uefi $1 $2 $3
90 boot_nogeli_gpt_zfs_legacy() {
94 idx=$(find-part $dev "freebsd-boot")
95 if [ -z "$idx" ] ; then
96 die "No freebsd-boot partition found"
98 doit gpart bootcode -b ${gpt0} -p ${gptzfs2} -i $idx $dev
101 boot_nogeli_gpt_zfs_uefi() {
105 boot_nogeli_gpt_zfs_both() {
106 boot_nogeli_gpt_zfs_legacy $1 $2 $3
107 boot_nogeli_gpt_zfs_uefi $1 $2 $3
110 boot_nogeli_mbr_ufs_legacy() {
114 doit gpart bootcode -b ${mbr0} ${dev}
115 s=$(find-part $dev "freebsd")
116 if [ -z "$s" ] ; then
117 die "No freebsd slice found"
119 doit gpart bootcode -p ${mbr2} ${dev}s${s}
122 boot_nogeli_mbr_ufs_uefi() {
126 boot_nogeli_mbr_ufs_both() {
127 boot_nogeli_mbr_ufs_legacy $1 $2 $3
128 boot_nogeli_mbr_ufs_uefi $1 $2 $3
131 boot_nogeli_mbr_zfs_legacy() {
135 # search to find the BSD slice
136 s=$(find-part $dev "freebsd")
137 if [ -z "$s" ] ; then
138 die "No BSD slice found"
140 idx=$(find-part ${dev}s${s} "freebsd-zfs")
141 if [ -z "$idx" ] ; then
142 die "No freebsd-zfs slice found"
144 # search to find the freebsd-zfs partition within the slice
145 # Or just assume it is 'a' because it has to be since it fails otherwise
146 doit gpart bootcode -b ${dst}/boot/mbr ${dev}
147 dd if=${dst}/boot/zfsboot of=/tmp/zfsboot1 count=1
148 doit gpart bootcode -b /tmp/zfsboot1 ${dev}s${s} # Put boot1 into the start of part
149 sysctl kern.geom.debugflags=0x10 # Put boot2 into ZFS boot slot
150 doit dd if=${dst}/boot/zfsboot of=/dev/${dev}s${s}a skip=1 seek=1024
151 sysctl kern.geom.debugflags=0x0
154 boot_nogeli_mbr_zfs_uefi() {
158 boot_nogeli_mbr_zfs_both() {
159 boot_nogeli_mbr_zfs_legacy $1 $2 $3
160 boot_nogeli_mbr_zfs_uefi $1 $2 $3
163 boot_geli_gpt_ufs_legacy() {
164 boot_nogeli_gpt_ufs_legacy $1 $2 $3
167 boot_geli_gpt_ufs_uefi() {
168 boot_nogeli_gpt_ufs_uefi $1 $2 $3
171 boot_geli_gpt_ufs_both() {
172 boot_nogeli_gpt_ufs_both $1 $2 $3
175 boot_geli_gpt_zfs_legacy() {
176 boot_nogeli_gpt_zfs_legacy $1 $2 $3
179 boot_geli_gpt_zfs_uefi() {
180 boot_nogeli_gpt_zfs_uefi $1 $2 $3
183 boot_geli_gpt_zfs_both() {
184 boot_nogeli_gpt_zfs_both $1 $2 $3
187 # GELI+MBR is not a valid configuration
188 boot_geli_mbr_ufs_legacy() {
192 boot_geli_mbr_ufs_uefi() {
196 boot_geli_mbr_ufs_both() {
200 boot_geli_mbr_zfs_legacy() {
204 boot_geli_mbr_zfs_uefi() {
208 boot_geli_mbr_zfs_both() {
212 boot_nogeli_vtoc8_ufs_ofw() {
216 # For non-native builds, ensure that geom_part(4) supports VTOC8.
217 kldload geom_part_vtoc8.ko
218 doit gpart bootcode -p ${vtoc8} ${dev}
223 # Note: we really don't support geli boot in this script yet.
226 while getopts "b:d:f:g:o:s:" opt; do
239 [Yy][Ee][Ss]|geli) geli=geli ;;
255 # For gpt, we need to install pmbr as the primary boot loader
257 gpt0=${DESTDIR}/boot/pmbr
258 gpt2=${DESTDIR}/boot/gptboot
259 gptzfs2=${DESTDIR}/boot/gptzfsboot
261 # For MBR, we have lots of choices, but select mbr, boot0 has issues with UEFI
262 mbr0=${DESTDIR}/boot/mbr
263 mbr2=${DESTDIR}/boot/boot
266 vtoc8=${DESTDIR}/boot/boot1
270 eval boot_${geli}_${scheme}_${fs}_${bios} $dev $DESTDIR $opts || echo "Unsupported boot env: ${geli}-${scheme}-${fs}-${bios}"