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