xref: /freebsd/tools/boot/install-boot.sh (revision c89deb8fcc68be0cdf9f2c94a3ec2d60eae220ea)
1cfc94828SWarner Losh#!/bin/sh
2cfc94828SWarner Losh
3cfc94828SWarner Losh# $FreeBSD$
4cfc94828SWarner Losh
5cfc94828SWarner Losh#
6cfc94828SWarner Losh# Installs/updates the necessary boot blocks for the desired boot environment
7cfc94828SWarner Losh#
8cfc94828SWarner Losh# Lightly tested.. Intended to be installed, but until it matures, it will just
9cfc94828SWarner Losh# be a boot tool for regression testing.
10cfc94828SWarner Losh
11cfc94828SWarner Losh# insert code here to guess what you have -- yikes!
12cfc94828SWarner Losh
13cfc94828SWarner Loshdie() {
14cfc94828SWarner Losh    echo $*
15cfc94828SWarner Losh    exit 1
16cfc94828SWarner Losh}
17cfc94828SWarner Losh
189b544478SWarner Loshdoit() {
199b544478SWarner Losh    echo $*
209b544478SWarner Losh    eval $*
219b544478SWarner Losh}
229b544478SWarner Losh
23cfc94828SWarner Loshfind-part() {
24cfc94828SWarner Losh    dev=$1
25cfc94828SWarner Losh    part=$2
26cfc94828SWarner Losh
27cfc94828SWarner Losh    gpart show $dev | tail +2 | awk '$4 == "'$part'" { print $3; }'
28cfc94828SWarner Losh}
29cfc94828SWarner Losh
30*c89deb8fSWarner Loshmake_esp() {
31*c89deb8fSWarner Losh    local dev dst mntpt
32*c89deb8fSWarner Losh
33*c89deb8fSWarner Losh    dev=$1
34*c89deb8fSWarner Losh    dst=$2
35*c89deb8fSWarner Losh
36*c89deb8fSWarner Losh    newfs_msdos -a 32 /dev/${dev}
37*c89deb8fSWarner Losh    mntpt=$(mktemp -d /tmp/stand-test.XXXXXX)
38*c89deb8fSWarner Losh    mount -t msdos /dev/${md} ${mntpt}
39*c89deb8fSWarner Losh    mkdir -p ${mntpt}/efi/boot
40*c89deb8fSWarner Losh    cp ${dst}/boot/loader.efi ${mntpt}/efi/boot/bootx64.efi
41*c89deb8fSWarner Losh    umount ${mntpt}
42*c89deb8fSWarner Losh    rmdir ${mntpt}
43*c89deb8fSWarner Losh}
44*c89deb8fSWarner Losh
45*c89deb8fSWarner Loshmake_esp_mbr() {
46*c89deb8fSWarner Losh    dev=$1
47*c89deb8fSWarner Losh    dst=$2
48*c89deb8fSWarner Losh
49*c89deb8fSWarner Losh    s=$(find-part $dev "!239")
50*c89deb8fSWarner Losh    if [ -z "$s" ] ; then
51*c89deb8fSWarner Losh	die "No ESP slice found"
52*c89deb8fSWarner Losh    fi
53*c89deb8fSWarner Losh    make_esp /dev/${dev}s${s} ${dst}
54*c89deb8fSWarner Losh}
55*c89deb8fSWarner Losh
56*c89deb8fSWarner Loshmake_esp_gpt() {
57*c89deb8fSWarner Losh    dev=$1
58*c89deb8fSWarner Losh    dst=$2
59*c89deb8fSWarner Losh
60*c89deb8fSWarner Losh    idx=$(find-part $dev "efi")
61*c89deb8fSWarner Losh    if [ -z "$idx" ] ; then
62*c89deb8fSWarner Losh	die "No ESP partition found"
63*c89deb8fSWarner Losh    fi
64*c89deb8fSWarner Losh    make_esp /dev/${dev}p${idx} ${dst}
65*c89deb8fSWarner Losh}
66*c89deb8fSWarner Losh
67cfc94828SWarner Loshboot_nogeli_gpt_ufs_legacy() {
68cfc94828SWarner Losh    dev=$1
69cfc94828SWarner Losh    dst=$2
70cfc94828SWarner Losh
71cfc94828SWarner Losh    idx=$(find-part $dev "freebsd-boot")
72cfc94828SWarner Losh    if [ -z "$idx" ] ; then
73cfc94828SWarner Losh	die "No freebsd-boot partition found"
74cfc94828SWarner Losh    fi
759b544478SWarner Losh    doit gpart bootcode -b ${gpt0} -p ${gpt2} -i $idx $dev
76f438a143SAllan Jude}
77f438a143SAllan Jude
78f438a143SAllan Judeboot_nogeli_gpt_ufs_uefi() {
79*c89deb8fSWarner Losh    make_esp_gpt $1 $2
80f438a143SAllan Jude}
81f438a143SAllan Jude
82f438a143SAllan Judeboot_nogeli_gpt_ufs_both() {
83f438a143SAllan Jude    boot_nogeli_gpt_ufs_legacy $1 $2 $3
84f438a143SAllan Jude    boot_nogeli_gpt_ufs_uefi $1 $2 $3
85f438a143SAllan Jude}
86f438a143SAllan Jude
87f438a143SAllan Judeboot_nogeli_gpt_zfs_legacy() {
88f438a143SAllan Jude    dev=$1
89f438a143SAllan Jude    dst=$2
90f438a143SAllan Jude
91f438a143SAllan Jude    idx=$(find-part $dev "freebsd-boot")
92f438a143SAllan Jude    if [ -z "$idx" ] ; then
93f438a143SAllan Jude	die "No freebsd-boot partition found"
94f438a143SAllan Jude    fi
95f438a143SAllan Jude    doit gpart bootcode -b ${gpt0} -p ${gptzfs2} -i $idx $dev
96cfc94828SWarner Losh}
97cfc94828SWarner Losh
98712b4ca9SAllan Judeboot_nogeli_gpt_zfs_uefi() {
99*c89deb8fSWarner Losh    make_esp_gpt $1 $2
100712b4ca9SAllan Jude}
101712b4ca9SAllan Jude
102712b4ca9SAllan Judeboot_nogeli_gpt_zfs_both() {
103f438a143SAllan Jude    boot_nogeli_gpt_zfs_legacy $1 $2 $3
104f438a143SAllan Jude    boot_nogeli_gpt_zfs_uefi $1 $2 $3
105cfc94828SWarner Losh}
106cfc94828SWarner Losh
107cfc94828SWarner Loshboot_nogeli_mbr_ufs_legacy() {
108cfc94828SWarner Losh    dev=$1
109cfc94828SWarner Losh    dst=$2
110cfc94828SWarner Losh
1119b544478SWarner Losh    doit gpart bootcode -b ${mbr0} ${dev}
112f438a143SAllan Jude    s=$(find-part $dev "freebsd")
113cfc94828SWarner Losh    if [ -z "$s" ] ; then
114f438a143SAllan Jude	die "No freebsd slice found"
115cfc94828SWarner Losh    fi
1169b544478SWarner Losh    doit gpart bootcode -p ${mbr2} ${dev}s${s}
117f438a143SAllan Jude}
118f438a143SAllan Jude
119f438a143SAllan Judeboot_nogeli_mbr_ufs_uefi() {
120*c89deb8fSWarner Losh    make_esp_mbr $1 $2
121f438a143SAllan Jude}
122f438a143SAllan Jude
123f438a143SAllan Judeboot_nogeli_mbr_ufs_both() {
124f438a143SAllan Jude    boot_nogeli_mbr_ufs_legacy $1 $2 $3
125f438a143SAllan Jude    boot_nogeli_mbr_ufs_uefi $1 $2 $3
126f438a143SAllan Jude}
127f438a143SAllan Jude
128f438a143SAllan Judeboot_nogeli_mbr_zfs_legacy() {
129f438a143SAllan Jude    dev=$1
130f438a143SAllan Jude    dst=$2
131f438a143SAllan Jude
132f438a143SAllan Jude    # search to find the BSD slice
133f438a143SAllan Jude    s=$(find-part $dev "freebsd")
134f438a143SAllan Jude    if [ -z "$s" ] ; then
135f438a143SAllan Jude	die "No BSD slice found"
136f438a143SAllan Jude    fi
137f438a143SAllan Jude    idx=$(find-part ${dev}s${s} "freebsd-zfs")
138f438a143SAllan Jude    if [ -z "$idx" ] ; then
139f438a143SAllan Jude	die "No freebsd-zfs slice found"
140f438a143SAllan Jude    fi
141f438a143SAllan Jude    # search to find the freebsd-zfs partition within the slice
142f438a143SAllan Jude    # Or just assume it is 'a' because it has to be since it fails otherwise
143f438a143SAllan Jude    doit gpart bootcode -b ${dst}/boot/mbr ${dev}
144f438a143SAllan Jude    dd if=${dst}/boot/zfsboot of=/tmp/zfsboot1 count=1
145f438a143SAllan Jude    doit gpart bootcode -b /tmp/zfsboot1 ${dev}s${s}	# Put boot1 into the start of part
146f438a143SAllan Jude    sysctl kern.geom.debugflags=0x10		# Put boot2 into ZFS boot slot
147f438a143SAllan Jude    doit dd if=${dst}/boot/zfsboot of=/dev/${dev}s${s}a skip=1 seek=1024
148f438a143SAllan Jude    sysctl kern.geom.debugflags=0x0
149f438a143SAllan Jude}
150f438a143SAllan Jude
151f438a143SAllan Judeboot_nogeli_mbr_zfs_uefi() {
152*c89deb8fSWarner Losh    make_eps_mbr $1 $2
153f438a143SAllan Jude}
154f438a143SAllan Jude
155f438a143SAllan Judeboot_nogeli_mbr_zfs_both() {
156f438a143SAllan Jude    boot_nogeli_mbr_zfs_legacy $1 $2 $3
157f438a143SAllan Jude    boot_nogeli_mbr_zfs_uefi $1 $2 $3
158f438a143SAllan Jude}
159f438a143SAllan Jude
160f438a143SAllan Judeboot_geli_gpt_ufs_legacy() {
161f438a143SAllan Jude    boot_nogeli_gpt_ufs_legacy $1 $2 $3
162f438a143SAllan Jude}
163f438a143SAllan Jude
164f438a143SAllan Judeboot_geli_gpt_ufs_uefi() {
165f438a143SAllan Jude    boot_nogeli_gpt_ufs_uefi $1 $2 $3
166f438a143SAllan Jude}
167f438a143SAllan Jude
168f438a143SAllan Judeboot_geli_gpt_ufs_both() {
169f438a143SAllan Jude    boot_nogeli_gpt_ufs_both $1 $2 $3
170f438a143SAllan Jude}
171f438a143SAllan Jude
172f438a143SAllan Judeboot_geli_gpt_zfs_legacy() {
173f438a143SAllan Jude    boot_nogeli_gpt_zfs_legacy $1 $2 $3
174f438a143SAllan Jude}
175f438a143SAllan Jude
176f438a143SAllan Judeboot_geli_gpt_zfs_uefi() {
177f438a143SAllan Jude    boot_nogeli_gpt_zfs_uefi $1 $2 $3
178f438a143SAllan Jude}
179f438a143SAllan Jude
180f438a143SAllan Judeboot_geli_gpt_zfs_both() {
181f438a143SAllan Jude    boot_nogeli_gpt_zfs_both $1 $2 $3
182f438a143SAllan Jude}
183f438a143SAllan Jude
184f438a143SAllan Jude# GELI+MBR is not a valid configuration
185f438a143SAllan Judeboot_geli_mbr_ufs_legacy() {
186f438a143SAllan Jude    exit 1
187f438a143SAllan Jude}
188f438a143SAllan Jude
189f438a143SAllan Judeboot_geli_mbr_ufs_uefi() {
190f438a143SAllan Jude    exit 1
191f438a143SAllan Jude}
192f438a143SAllan Jude
193f438a143SAllan Judeboot_geli_mbr_ufs_both() {
194f438a143SAllan Jude    exit 1
195f438a143SAllan Jude}
196f438a143SAllan Jude
197f438a143SAllan Judeboot_geli_mbr_zfs_legacy() {
198f438a143SAllan Jude    exit 1
199f438a143SAllan Jude}
200f438a143SAllan Jude
201f438a143SAllan Judeboot_geli_mbr_zfs_uefi() {
202f438a143SAllan Jude    exit 1
203f438a143SAllan Jude}
204f438a143SAllan Jude
205f438a143SAllan Judeboot_geli_mbr_zfs_both() {
206f438a143SAllan Jude    exit 1
207cfc94828SWarner Losh}
208cfc94828SWarner Losh
209ba8d50d0SMarius Stroblboot_nogeli_vtoc8_ufs_ofw() {
210ba8d50d0SMarius Strobl    dev=$1
211ba8d50d0SMarius Strobl    dst=$2
212ba8d50d0SMarius Strobl
213ba8d50d0SMarius Strobl    # For non-native builds, ensure that geom_part(4) supports VTOC8.
214ba8d50d0SMarius Strobl    kldload geom_part_vtoc8.ko
215ba8d50d0SMarius Strobl    doit gpart bootcode -p ${vtoc8} ${dev}
216ba8d50d0SMarius Strobl}
217ba8d50d0SMarius Strobl
218cfc94828SWarner LoshDESTDIR=/
219cfc94828SWarner Losh
220cfc94828SWarner Losh# Note: we really don't support geli boot in this script yet.
221cfc94828SWarner Loshgeli=nogeli
222cfc94828SWarner Losh
223cfc94828SWarner Loshwhile getopts "b:d:f:g:o:s:" opt; do
224cfc94828SWarner Losh    case "$opt" in
225cfc94828SWarner Losh	b)
226cfc94828SWarner Losh	    bios=${OPTARG}
227cfc94828SWarner Losh	    ;;
228cfc94828SWarner Losh	d)
229cfc94828SWarner Losh	    DESTDIR=${OPTARG}
230cfc94828SWarner Losh	    ;;
231cfc94828SWarner Losh	f)
232cfc94828SWarner Losh	    fs=${OPTARG}
233cfc94828SWarner Losh	    ;;
234cfc94828SWarner Losh	g)
235cfc94828SWarner Losh	    case ${OPTARG} in
236cfc94828SWarner Losh		[Yy][Ee][Ss]|geli) geli=geli ;;
237cfc94828SWarner Losh		*) geli=nogeli ;;
238cfc94828SWarner Losh	    esac
239cfc94828SWarner Losh	    ;;
240cfc94828SWarner Losh	o)
241cfc94828SWarner Losh	    opts=${OPTARG}
242cfc94828SWarner Losh	    ;;
243cfc94828SWarner Losh	s)
244cfc94828SWarner Losh	    scheme=${OPTARG}
245cfc94828SWarner Losh	    ;;
246cfc94828SWarner Losh    esac
247cfc94828SWarner Loshdone
248cfc94828SWarner Losh
249cfc94828SWarner Loshshift $((OPTIND-1))
250cfc94828SWarner Loshdev=$1
251cfc94828SWarner Losh
252cfc94828SWarner Losh# For gpt, we need to install pmbr as the primary boot loader
253cfc94828SWarner Losh# it knows about
254cfc94828SWarner Loshgpt0=${DESTDIR}/boot/pmbr
255cfc94828SWarner Loshgpt2=${DESTDIR}/boot/gptboot
256cfc94828SWarner Loshgptzfs2=${DESTDIR}/boot/gptzfsboot
257cfc94828SWarner Losh
258f438a143SAllan Jude# For MBR, we have lots of choices, but select mbr, boot0 has issues with UEFI
259f438a143SAllan Judembr0=${DESTDIR}/boot/mbr
260cfc94828SWarner Loshmbr2=${DESTDIR}/boot/boot
261cfc94828SWarner Losh
262ba8d50d0SMarius Strobl# VTOC8
263ba8d50d0SMarius Stroblvtoc8=${DESTDIR}/boot/boot1
264ba8d50d0SMarius Strobl
265cfc94828SWarner Losh# sanity check here
266cfc94828SWarner Losh
267cfc94828SWarner Losheval boot_${geli}_${scheme}_${fs}_${bios} $dev $DESTDIR $opts || echo "Unsupported boot env: ${geli}-${scheme}-${fs}-${bios}"
268