xref: /freebsd/tools/boot/install-boot.sh (revision cfc948287d6fa5f2cf0539e4c69d4af0fdd1986f)
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