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