xref: /freebsd/tools/boot/rootgen.sh (revision e674ddec0b4138274539587fe9336b577ff1242a)
1#!/bin/sh
2
3# $FreeBSD$
4
5passphrase=passphrase
6iterations=50000
7
8# The smallest FAT32 filesystem is 33292 KB
9espsize=33292
10
11#
12# Builds all the bat-shit crazy combinations we support booting from,
13# at least for amd64. It assume you have a ~sane kernel in /boot/kernel
14# and copies that into the ~150MB root images we create (we create the du
15# size of the kernel + 20MB).
16#
17# Sad panda sez: this runs as root, but could be any user if someone
18# creates userland geli.
19#
20# This assumes an external program install-boot.sh which will install
21# the appropriate boot files in the appropriate locations.
22#
23# Assumes you've already rebuilt... maybe bad? Also maybe bad: the env
24# vars should likely be conditionally set to allow better automation.
25#
26
27. $(dirname $0)/install-boot.sh
28
29cpsys() {
30    src=$1
31    dst=$2
32
33    # Copy kernel + boot loader
34    (cd $src ; tar cf - .) | (cd $dst; tar xf -)
35}
36
37ufs_fstab() {
38    dir=$1
39
40    cat > ${dir}/etc/fstab <<EOF
41/dev/ufs/root	/		ufs	rw	1	1
42EOF
43}
44
45mk_nogeli_gpt_ufs_legacy() {
46    src=$1
47    img=$2
48
49    ufs_fstab ${src}
50    makefs -t ffs -B little -s 200m -o label=root ${img}.p2 ${src}
51    mkimg -s gpt -b ${src}/boot/pmbr \
52	  -p freebsd-boot:=${src}/boot/gptboot \
53	  -p freebsd-ufs:=${img}.p2 -o ${img}
54    rm -f ${src}/etc/fstab
55}
56
57mk_nogeli_gpt_ufs_uefi() {
58    src=$1
59    img=$2
60
61    ufs_fstab ${src}
62    make_esp_file ${img}.p1 ${espsize} ${src}/boot/loader.efi
63    makefs -t ffs -B little -s 200m -o label=root ${img}.p2 ${src}
64    mkimg -s gpt \
65	  -p efi:=${img}.p1 \
66	  -p freebsd-ufs:=${img}.p2 -o ${img}
67    rm -f ${src}/etc/fstab
68}
69
70mk_nogeli_gpt_ufs_both() {
71    src=$1
72    img=$2
73
74    ufs_fstab ${src}
75    make_esp_file ${img}.p1 ${espsize} ${src}/boot/loader.efi
76    makefs -t ffs -B little -s 200m -o label=root ${img}.p3 ${src}
77    # p1 is boot for uefi, p2 is boot for gpt, p3 is /
78    mkimg -b ${src}/boot/pmbr -s gpt \
79	  -p efi:=${img}.p1 \
80	  -p freebsd-boot:=${src}/boot/gptboot \
81	  -p freebsd-ufs:=${img}.p3 \
82	  -o ${img}
83    rm -f ${src}/etc/fstab
84}
85
86# XXX should not assume host == target
87zfs_extra()
88{
89    src=$1
90    dst=$2
91
92    mkdir -p $dst
93    mkdir -p $dst/boot/kernel
94    cat > ${dst}/boot/loader.conf.local <<EOF
95cryptodev_load=YES
96zfs_load=YES
97EOF
98    cp /boot/kernel/acl_nfs4.ko ${dst}/boot/kernel/acl_nfs4.ko
99    cp /boot/kernel/cryptodev.ko ${dst}/boot/kernel/cryptodev.ko
100    cp /boot/kernel/zfs.ko ${dst}/boot/kernel/zfs.ko
101}
102
103mk_nogeli_gpt_zfs_legacy() {
104    src=$1
105    img=$2
106    mntpt=$3
107    geli=$4
108    scheme=$5
109    fs=$6
110    bios=$7
111    pool=nogeli-gpt-zfs-legacy
112    dst=$img.extra
113
114    zfs_extra $src $dst
115    makefs -t zfs -s 200m \
116	-o poolname=${pool} -o bootfs=${pool} -o rootpath=/ \
117	${img}.p2 ${src} ${dst}
118    mkimg -b ${src}/boot/pmbr -s gpt \
119	  -p freebsd-boot:=/boot/gptzfsboot \
120	  -p freebsd-zfs:=${img}.p2 \
121	  -o ${img}
122    rm -rf ${dst}
123}
124
125mk_nogeli_gpt_zfs_uefi() {
126    src=$1
127    img=$2
128    mntpt=$3
129    geli=$4
130    scheme=$5
131    fs=$6
132    bios=$7
133    pool=nogeli-gpt-zfs-uefi
134    dst=$img.extra
135
136    zfs_extra $src $dst
137    make_esp_file ${img}.p1 ${espsize} ${src}/boot/loader.efi
138    makefs -t zfs -s 200m \
139	-o poolname=${pool} -o bootfs=${pool} -o rootpath=/ \
140	${img}.p2 ${src} ${dst}
141    mkimg -b ${src}/boot/pmbr -s gpt \
142	  -p efi:=${img}.p1 \
143	  -p freebsd-zfs:=${img}.p2 \
144	  -o ${img}
145    rm -rf ${dst}
146}
147
148mk_nogeli_gpt_zfs_both() {
149    src=$1
150    img=$2
151    mntpt=$3
152    geli=$4
153    scheme=$5
154    fs=$6
155    bios=$7
156    pool=nogeli-gpt-zfs-both
157    dst=$img.extra
158
159    zfs_extra $src $dst
160    make_esp_file ${img}.p2 ${espsize} ${src}/boot/loader.efi
161    makefs -t zfs -s 200m \
162	-o poolname=${pool} -o bootfs=${pool} -o rootpath=/ \
163	${img}.p3 ${src} ${dst}
164    mkimg -b ${src}/boot/pmbr -s gpt \
165	  -p freebsd-boot:=/boot/gptzfsboot \
166	  -p efi:=${img}.p2 \
167	  -p freebsd-zfs:=${img}.p3 \
168	  -o ${img}
169    rm -rf ${dst}
170}
171
172mk_nogeli_mbr_ufs_legacy() {
173    src=$1
174    img=$2
175
176    ufs_fstab ${src}
177    makefs -t ffs -B little -s 200m -o label=root ${img}.s1a ${src}
178    mkimg -s bsd -b ${src}/boot/boot -p freebsd-ufs:=${img}.s1a -o ${img}.s1
179    mkimg -a 1 -s mbr -b ${src}/boot/boot0sio -p freebsd:=${img}.s1 -o ${img}
180    rm -f ${src}/etc/fstab
181}
182
183mk_nogeli_mbr_ufs_uefi() {
184    src=$1
185    img=$2
186
187    ufs_fstab ${src}
188    make_esp_file ${img}.s1 ${espsize} ${src}/boot/loader.efi
189    makefs -t ffs -B little -s 200m -o label=root ${img}.s2a ${src}
190    mkimg -s bsd -p freebsd-ufs:=${img}.s2a -o ${img}.s2
191    mkimg -a 1 -s mbr -p efi:=${img}.s1 -p freebsd:=${img}.s2 -o ${img}
192    rm -f ${src}/etc/fstab
193}
194
195mk_nogeli_mbr_ufs_both() {
196    src=$1
197    img=$2
198
199    ufs_fstab ${src}
200    make_esp_file ${img}.s1 ${espsize} ${src}/boot/loader.efi
201    makefs -t ffs -B little -s 200m -o label=root ${img}.s2a ${src}
202    mkimg -s bsd -b ${src}/boot/boot -p freebsd-ufs:=${img}.s2a -o ${img}.s2
203    mkimg -a 2 -s mbr -b ${src}/boot/mbr -p efi:=${img}.s1 -p freebsd:=${img}.s2 -o ${img}
204    rm -f ${src}/etc/fstab
205}
206
207mk_nogeli_mbr_zfs_legacy() {
208    src=$1
209    img=$2
210    mntpt=$3
211    geli=$4
212    scheme=$5
213    fs=$6
214    bios=$7
215    pool=nogeli-mbr-zfs-legacy
216
217    dd if=/dev/zero of=${img} count=1 seek=$((200 * 1024 * 1024 / 512))
218    md=$(mdconfig -f ${img})
219    gpart create -s mbr ${md}
220    gpart add -t freebsd ${md}
221    gpart set -a active -i 1 ${md}
222    gpart create -s bsd ${md}s1
223    gpart add -t freebsd-zfs ${md}s1
224    # install-boot will make this bootable
225    zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}s1a
226    zpool set bootfs=${pool} ${pool}
227    zfs create -po mountpoint=/ ${pool}/ROOT/default
228    # NB: The online guides go nuts customizing /var and other mountpoints here, no need
229    cpsys ${src} ${mntpt}
230    # need to make a couple of tweaks
231    cat >> ${mntpt}/boot/loader.conf <<EOF
232cryptodev_load=YES
233zfs_load=YES
234EOF
235    cp /boot/kernel/acl_nfs4.ko ${mntpt}/boot/kernel/acl_nfs4.ko
236    cp /boot/kernel/cryptodev.ko ${mntpt}/boot/kernel/cryptodev.ko
237    cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko
238    # end tweaks
239    zfs umount -f ${pool}/ROOT/default
240    zfs set mountpoint=none ${pool}/ROOT/default
241    zpool set bootfs=${pool}/ROOT/default ${pool}
242    zpool set autoexpand=on ${pool}
243    zpool export ${pool}
244    ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
245    mdconfig -d -u ${md}
246}
247
248mk_nogeli_mbr_zfs_uefi() {
249    src=$1
250    img=$2
251    mntpt=$3
252    geli=$4
253    scheme=$5
254    fs=$6
255    bios=$7
256    pool=nogeli-mbr-zfs-uefi
257
258    dd if=/dev/zero of=${img} count=1 seek=$((200 * 1024 * 1024 / 512))
259    md=$(mdconfig -f ${img})
260    gpart create -s mbr ${md}
261    gpart add -t efi -s ${espsize}k ${md}
262    gpart add -t freebsd ${md}
263    gpart set -a active -i 2 ${md}
264    gpart create -s bsd ${md}s2
265    gpart add -t freebsd-zfs ${md}s2
266    # install-boot will make this bootable
267    zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}s2a
268    zpool set bootfs=${pool} ${pool}
269    zfs create -po mountpoint=/ ${pool}/ROOT/default
270    # NB: The online guides go nuts customizing /var and other mountpoints here, no need
271    cpsys ${src} ${mntpt}
272    # need to make a couple of tweaks
273    cat >> ${mntpt}/boot/loader.conf <<EOF
274cryptodev_load=YES
275zfs_load=YES
276EOF
277    cp /boot/kernel/acl_nfs4.ko ${mntpt}/boot/kernel/acl_nfs4.ko
278    cp /boot/kernel/cryptodev.ko ${mntpt}/boot/kernel/cryptodev.ko
279    cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko
280    # end tweaks
281    zfs umount -f ${pool}/ROOT/default
282    zfs set mountpoint=none ${pool}/ROOT/default
283    zpool set bootfs=${pool}/ROOT/default ${pool}
284    zpool set autoexpand=on ${pool}
285    zpool export ${pool}
286    ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
287    mdconfig -d -u ${md}
288}
289
290mk_nogeli_mbr_zfs_both() {
291    src=$1
292    img=$2
293    mntpt=$3
294    geli=$4
295    scheme=$5
296    fs=$6
297    bios=$7
298    pool=nogeli-mbr-zfs-both
299
300    dd if=/dev/zero of=${img} count=1 seek=$((200 * 1024 * 1024 / 512))
301    md=$(mdconfig -f ${img})
302    gpart create -s mbr ${md}
303    gpart add -t efi -s  ${espsize}k ${md}
304    gpart add -t freebsd ${md}
305    gpart set -a active -i 2 ${md}
306    gpart create -s bsd ${md}s2
307    gpart add -t freebsd-zfs ${md}s2
308    # install-boot will make this bootable
309    zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}s2a
310    zpool set bootfs=${pool} ${pool}
311    zfs create -po mountpoint=/ ${pool}/ROOT/default
312    # NB: The online guides go nuts customizing /var and other mountpoints here, no need
313    cpsys ${src} ${mntpt}
314    # need to make a couple of tweaks
315    cat >> ${mntpt}/boot/loader.conf <<EOF
316cryptodev_load=YES
317zfs_load=YES
318EOF
319    cp /boot/kernel/acl_nfs4.ko ${mntpt}/boot/kernel/acl_nfs4.ko
320    cp /boot/kernel/cryptodev.ko ${mntpt}/boot/kernel/cryptodev.ko
321    cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko
322    # end tweaks
323    zfs umount -f ${pool}/ROOT/default
324    zfs set mountpoint=none ${pool}/ROOT/default
325    zpool set bootfs=${pool}/ROOT/default ${pool}
326    zpool set autoexpand=on ${pool}
327    zpool export ${pool}
328    ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
329    mdconfig -d -u ${md}
330}
331
332mk_geli_gpt_ufs_legacy() {
333    src=$1
334    img=$2
335    mntpt=$3
336    geli=$4
337    scheme=$5
338    fs=$6
339    bios=$7
340
341    dd if=/dev/zero of=${img} count=1 seek=$(( 200 * 1024 * 1024 / 512 ))
342    md=$(mdconfig -f ${img})
343    gpart create -s gpt ${md}
344    gpart add -t freebsd-boot -s 400k -a 4k	${md}	# <= ~540k
345    gpart add -t freebsd-ufs -l root $md
346    # install-boot will make this bootable
347    echo ${passphrase} | geli init -bg -e AES-XTS -i ${iterations} -J - -l 256 -s 4096 ${md}p2
348    echo ${passphrase} | geli attach -j - ${md}p2
349    newfs -L root /dev/${md}p2.eli
350    mount /dev/${md}p2.eli ${mntpt}
351    cpsys ${src} ${mntpt}
352    # need to make a couple of tweaks
353    cat > ${mntpt}/boot/loader.conf <<EOF
354geom_eli_load=YES
355EOF
356    ufs_fstab ${mntpt}
357
358    cp /boot/kernel/geom_eli.ko ${mntpt}/boot/kernel/geom_eli.ko
359    # end tweaks
360    umount -f ${mntpt}
361    geli detach ${md}p2
362    ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
363    mdconfig -d -u ${md}
364}
365
366mk_geli_gpt_ufs_uefi() {
367    src=$1
368    img=$2
369    mntpt=$3
370    geli=$4
371    scheme=$5
372    fs=$6
373    bios=$7
374
375    dd if=/dev/zero of=${img} count=1 seek=$(( 200 * 1024 * 1024 / 512 ))
376    md=$(mdconfig -f ${img})
377    gpart create -s gpt ${md}
378    gpart add -t efi -s ${espsize}k -a 4k ${md}
379    gpart add -t freebsd-ufs -l root $md
380    # install-boot will make this bootable
381    echo ${passphrase} | geli init -bg -e AES-XTS -i ${iterations} -J - -l 256 -s 4096 ${md}p2
382    echo ${passphrase} | geli attach -j - ${md}p2
383    newfs -L root /dev/${md}p2.eli
384    mount /dev/${md}p2.eli ${mntpt}
385    cpsys ${src} ${mntpt}
386    # need to make a couple of tweaks
387    cat > ${mntpt}/boot/loader.conf <<EOF
388geom_eli_load=YES
389EOF
390    ufs_fstab ${mntpt}
391
392    cp /boot/kernel/geom_eli.ko ${mntpt}/boot/kernel/geom_eli.ko
393    # end tweaks
394    umount -f ${mntpt}
395    geli detach ${md}p2
396    ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
397    mdconfig -d -u ${md}
398}
399
400mk_geli_gpt_ufs_both() {
401    src=$1
402    img=$2
403    mntpt=$3
404    geli=$4
405    scheme=$5
406    fs=$6
407    bios=$7
408
409    dd if=/dev/zero of=${img} count=1 seek=$(( 200 * 1024 * 1024 / 512 ))
410    md=$(mdconfig -f ${img})
411    gpart create -s gpt ${md}
412    gpart add -t efi -s ${espsize}k -a 4k ${md}
413    gpart add -t freebsd-boot -s 400k -a 4k	${md}	# <= ~540k
414    gpart add -t freebsd-ufs -l root $md
415    # install-boot will make this bootable
416    echo ${passphrase} | geli init -bg -e AES-XTS -i ${iterations} -J - -l 256 -s 4096 ${md}p3
417    echo ${passphrase} | geli attach -j - ${md}p3
418    newfs -L root /dev/${md}p3.eli
419    mount /dev/${md}p3.eli ${mntpt}
420    cpsys ${src} ${mntpt}
421    # need to make a couple of tweaks
422    cat > ${mntpt}/boot/loader.conf <<EOF
423geom_eli_load=YES
424EOF
425    ufs_fstab ${mntpt}
426
427    cp /boot/kernel/geom_eli.ko ${mntpt}/boot/kernel/geom_eli.ko
428    # end tweaks
429    umount -f ${mntpt}
430    geli detach ${md}p3
431    ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
432    mdconfig -d -u ${md}
433}
434
435mk_geli_gpt_zfs_legacy() {
436    src=$1
437    img=$2
438    mntpt=$3
439    geli=$4
440    scheme=$5
441    fs=$6
442    bios=$7
443    pool=geli-gpt-zfs-legacy
444
445    # Note that in this flavor we create an empty p2 ufs partition, and put
446    # the bootable zfs stuff on p3, just to test the ability of the zfs probe
447    # probe routines to find a pool on a partition other than the first one.
448
449    dd if=/dev/zero of=${img} count=1 seek=$(( 300 * 1024 * 1024 / 512 ))
450    md=$(mdconfig -f ${img})
451    gpart create -s gpt ${md}
452    gpart add -t freebsd-boot -s 400k -a 4k	${md}	# <= ~540k
453    gpart add -t freebsd-ufs -s 100m ${md}
454    gpart add -t freebsd-zfs -l root $md
455    # install-boot will make this bootable
456    echo ${passphrase} | geli init -bg -e AES-XTS -i ${iterations} -J - -l 256 -s 4096 ${md}p3
457    echo ${passphrase} | geli attach -j - ${md}p3
458    zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}p3.eli
459    zpool set bootfs=${pool} ${pool}
460    zfs create -po mountpoint=/ ${pool}/ROOT/default
461    # NB: The online guides go nuts customizing /var and other mountpoints here, no need
462    cpsys ${src} ${mntpt}
463    # need to make a couple of tweaks
464    cat >> ${mntpt}/boot/loader.conf <<EOF
465cryptodev_load=YES
466zfs_load=YES
467geom_eli_load=YES
468EOF
469    cp /boot/kernel/acl_nfs4.ko ${mntpt}/boot/kernel/acl_nfs4.ko
470    cp /boot/kernel/cryptodev.ko ${mntpt}/boot/kernel/cryptodev.ko
471    cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko
472    cp /boot/kernel/geom_eli.ko ${mntpt}/boot/kernel/geom_eli.ko
473    # end tweaks
474    zfs umount -f ${pool}/ROOT/default
475    zfs set mountpoint=none ${pool}/ROOT/default
476    zpool set bootfs=${pool}/ROOT/default ${pool}
477    zpool set autoexpand=on ${pool}
478    zpool export ${pool}
479    geli detach ${md}p3
480    ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
481    mdconfig -d -u ${md}
482}
483
484mk_geli_gpt_zfs_uefi() {
485    src=$1
486    img=$2
487    mntpt=$3
488    geli=$4
489    scheme=$5
490    fs=$6
491    bios=$7
492    pool=geli-gpt-zfs-uefi
493
494    # Note that in this flavor we create an empty p2 ufs partition, and put
495    # the bootable zfs stuff on p3, just to test the ability of the zfs probe
496    # probe routines to find a pool on a partition other than the first one.
497
498    dd if=/dev/zero of=${img} count=1 seek=$(( 300 * 1024 * 1024 / 512 ))
499    md=$(mdconfig -f ${img})
500    gpart create -s gpt ${md}
501    gpart add -t efi -s ${espsize}k -a 4k ${md}
502    gpart add -t freebsd-ufs -s 100m ${md}
503    gpart add -t freebsd-zfs -l root $md
504    # install-boot will make this bootable
505    echo ${passphrase} | geli init -bg -e AES-XTS -i ${iterations} -J - -l 256 -s 4096 ${md}p3
506    echo ${passphrase} | geli attach -j - ${md}p3
507    zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}p3.eli
508    zpool set bootfs=${pool} ${pool}
509    zfs create -po mountpoint=/ ${pool}/ROOT/default
510    # NB: The online guides go nuts customizing /var and other mountpoints here, no need
511    cpsys ${src} ${mntpt}
512    # need to make a couple of tweaks
513    cat >> ${mntpt}/boot/loader.conf <<EOF
514cryptodev_load=YES
515zfs_load=YES
516geom_eli_load=YES
517EOF
518    cp /boot/kernel/acl_nfs4.ko ${mntpt}/boot/kernel/acl_nfs4.ko
519    cp /boot/kernel/cryptodev.ko ${mntpt}/boot/kernel/cryptodev.ko
520    cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko
521    cp /boot/kernel/geom_eli.ko ${mntpt}/boot/kernel/geom_eli.ko
522    # end tweaks
523    zfs umount -f ${pool}/ROOT/default
524    zfs set mountpoint=none ${pool}/ROOT/default
525    zpool set bootfs=${pool}/ROOT/default ${pool}
526    zpool set autoexpand=on ${pool}
527    zpool export ${pool}
528    geli detach ${md}p3
529    ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
530    mdconfig -d -u ${md}
531}
532
533mk_geli_gpt_zfs_both() {
534    src=$1
535    img=$2
536    mntpt=$3
537    geli=$4
538    scheme=$5
539    fs=$6
540    bios=$7
541    pool=geli-gpt-zfs-both
542
543    dd if=/dev/zero of=${img} count=1 seek=$(( 200 * 1024 * 1024 / 512 ))
544    md=$(mdconfig -f ${img})
545    gpart create -s gpt ${md}
546    gpart add -t efi -s ${espsize}k -a 4k ${md}
547    gpart add -t freebsd-boot -s 400k -a 4k	${md}	# <= ~540k
548    gpart add -t freebsd-zfs -l root $md
549    # install-boot will make this bootable
550    echo ${passphrase} | geli init -bg -e AES-XTS -i ${iterations} -J - -l 256 -s 4096 ${md}p3
551    echo ${passphrase} | geli attach -j - ${md}p3
552    zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}p3.eli
553    zpool set bootfs=${pool} ${pool}
554    zfs create -po mountpoint=/ ${pool}/ROOT/default
555    # NB: The online guides go nuts customizing /var and other mountpoints here, no need
556    cpsys ${src} ${mntpt}
557    # need to make a couple of tweaks
558    cat > ${mntpt}/boot/loader.conf <<EOF
559cryptodev_load=YES
560zfs_load=YES
561geom_eli_load=YES
562EOF
563    cp /boot/kernel/acl_nfs4.ko ${mntpt}/boot/kernel/acl_nfs4.ko
564    cp /boot/kernel/cryptodev.ko ${mntpt}/boot/kernel/cryptodev.ko
565    cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko
566    cp /boot/kernel/geom_eli.ko ${mntpt}/boot/kernel/geom_eli.ko
567    # end tweaks
568    zfs umount -f ${pool}/ROOT/default
569    zfs set mountpoint=none ${pool}/ROOT/default
570    zpool set bootfs=${pool}/ROOT/default ${pool}
571    zpool set autoexpand=on ${pool}
572    zpool export ${pool}
573    geli detach ${md}p3
574    ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
575    mdconfig -d -u ${md}
576}
577
578# GELI+MBR is not a valid configuration
579mk_geli_mbr_ufs_legacy() {
580}
581
582mk_geli_mbr_ufs_uefi() {
583}
584
585mk_geli_mbr_ufs_both() {
586}
587
588mk_geli_mbr_zfs_legacy() {
589}
590
591mk_geli_mbr_zfs_uefi() {
592}
593
594mk_geli_mbr_zfs_both() {
595}
596
597# iso
598# pxeldr
599# u-boot
600# powerpc
601
602qser="-monitor telnet::4444,server,nowait -serial stdio -nographic"
603
604# https://wiki.freebsd.org/QemuRecipes
605# aarch64
606qemu_aarch64_uefi()
607{
608    img=$1
609    sh=$2
610
611    echo "qemu-system-aarch64 -m 4096M -cpu cortex-a57 -M virt  \
612        -bios QEMU_EFI.fd ${qser} \
613        -drive if=none,file=${img},id=hd0 \
614        -device virtio-blk-device,drive=hd0" > $sh
615    chmod 755 $sh
616# https://wiki.freebsd.org/arm64/QEMU also has
617#       -device virtio-net-device,netdev=net0
618#       -netdev user,id=net0
619}
620
621log_for()
622{
623    dir=$(dirname $1)
624    fn=$(basename $1 .sh)
625    echo $dir/$fn.log
626}
627
628# Amd64 qemu
629qemu_amd64_legacy()
630{
631    img=$1
632    sh=$2
633    log=$(log_for $2)
634
635    echo "echo -n $(basename $sh .sh):' '" > $sh
636    echo "(qemu-system-x86_64 -m 256m --drive file=${img},format=raw ${qser} | tee $log 2>&1 | grep -q SUCCESS) && echo legacy pass || echo legacy fail" >> $sh
637    chmod 755 $sh
638}
639
640qemu_amd64_uefi()
641{
642    img=$1
643    sh=$2
644    log=$(log_for $2)
645
646    echo "echo -n $(basename $sh .sh):' '" > $sh
647    echo "(qemu-system-x86_64 -m 256m -bios ~/bios/OVMF-X64.fd --drive file=${img},format=raw ${qser} | tee $log 2>&1 | grep -q SUCCESS) && echo uefi pass || echo uefi fail" >> $sh
648    chmod 755 $sh
649}
650
651qemu_amd64_both()
652{
653    img=$1
654    sh=$2
655    log=$(log_for $2)
656
657    echo "echo -n $(basename $sh .sh):' '" > $sh
658    echo "(qemu-system-x86_64 -m 256m --drive file=${img},format=raw ${qser} | tee $log 2>&1 | grep -q SUCCESS) && echo legacy pass || echo legacy fail" >> $sh
659    echo "echo -n $(basename $sh .sh):' '" >> $sh
660    echo "(qemu-system-x86_64 -m 256m -bios ~/bios/OVMF-X64.fd --drive file=${img},format=raw ${qser} | tee -a $log 2>&1 | grep -q SUCCESS) && echo uefi pass || echo uefi fail" >> $sh
661    chmod 755 $sh
662}
663
664# arm
665# nothing listed?
666
667# i386
668qemu_i386_legacy()
669{
670    img=$1
671    sh=$2
672
673    echo "qemu-system-i386 --drive file=${img},format=raw ${qser}" > $sh
674    chmod 755 $sh
675}
676
677# Not yet supported
678qemu_i386_uefi()
679{
680    img=$1
681    sh=$2
682
683    echo "qemu-system-i386 -bios ~/bios/OVMF-X32.fd --drive file=${img},format=raw ${qser}" > $sh
684    chmod 755 $sh
685}
686
687# Needs UEFI to be supported
688qemu_i386_both()
689{
690    img=$1
691    sh=$2
692
693    echo "qemu-system-i386 --drive file=${img},format=raw ${qser}" > $sh
694    echo "qemu-system-i386 -bios ~/bios/OVMF-X32.fd --drive file=${img},format=raw ${qser}" >> $sh
695    chmod 755 $sh
696}
697
698make_one_image()
699{
700    local arch=${1?}
701    local geli=${2?}
702    local scheme=${3?}
703    local fs=${4?}
704    local bios=${5?}
705
706    # Create sparse file and mount newly created filesystem(s) on it
707    img=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.img
708    sh=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.sh
709    echo "$sh" >> ${IMGDIR}/all.sh
710    echo date >> ${IMGDIR}/all.sh
711    echo "vvvvvvvvvvvvvv   Creating $img  vvvvvvvvvvvvvvv"
712    rm -f ${img}*
713    eval mk_${geli}_${scheme}_${fs}_${bios} ${DESTDIR} ${img} ${MNTPT} ${geli} ${scheme} ${fs} ${bios}
714    eval qemu_${arch}_${bios} ${img} ${sh}
715    [ -n "${SUDO_USER}" ] && chown ${SUDO_USER} ${img}*
716    echo "^^^^^^^^^^^^^^   Created $img   ^^^^^^^^^^^^^^^"
717}
718
719# Powerpc -- doesn't work but maybe it would enough for testing -- needs details
720# powerpc64
721# qemu-system-ppc64 -drive file=/path/to/disk.img,format=raw
722
723# Misc variables
724SRCTOP=$(make -v SRCTOP)
725cd ${SRCTOP}/stand
726OBJDIR=$(make -v .OBJDIR)
727IMGDIR=${OBJDIR}/boot-images
728mkdir -p ${IMGDIR}
729MNTPT=$(mktemp -d /tmp/stand-test.XXXXXX)
730
731# Setup the installed tree...
732DESTDIR=${OBJDIR}/boot-tree
733rm -rf ${DESTDIR}
734mkdir -p ${DESTDIR}/boot/defaults
735mkdir -p ${DESTDIR}/boot/kernel
736cp /boot/kernel/kernel ${DESTDIR}/boot/kernel
737echo -h -D -S115200 > ${DESTDIR}/boot.config
738cat > ${DESTDIR}/boot/loader.conf <<EOF
739comconsole_speed=115200
740autoboot_delay=0
741EOF
742# XXX
743cp /boot/device.hints ${DESTDIR}/boot/device.hints
744# Assume we're already built
745make install DESTDIR=${DESTDIR} MK_MAN=no MK_INSTALL_AS_USER=yes WITHOUT_DEBUG_FILES=yes
746if [ $? -ne 0 ]; then
747        echo "make install failed"
748        exit 1
749fi
750# Copy init, /bin/sh, minimal libraries and testing /etc/rc
751mkdir -p ${DESTDIR}/sbin ${DESTDIR}/bin \
752      ${DESTDIR}/lib ${DESTDIR}/libexec \
753      ${DESTDIR}/etc ${DESTDIR}/dev
754for f in /sbin/halt /sbin/init /bin/sh /sbin/sysctl $(ldd /bin/sh | awk 'NF == 4 { print $3; }') /libexec/ld-elf.so.1; do
755    cp $f ${DESTDIR}/$f
756done
757cat > ${DESTDIR}/etc/rc <<EOF
758#!/bin/sh
759
760sysctl machdep.bootmethod
761echo "RC COMMAND RUNNING -- SUCCESS!!!!!"
762halt -p
763EOF
764
765# If we were given exactly 5 args, go make that one image.
766
767rm -f ${IMGDIR}/all.sh
768echo date > ${IMGDIR}/all.sh
769chmod +x  ${IMGDIR}/all.sh
770
771if [ $# -eq 5 ]; then
772    make_one_image $*
773    echo ${IMGDIR}/all.sh
774    exit
775fi
776
777# OK. Let the games begin
778
779for arch in amd64; do
780    for geli in nogeli; do # geli
781	for scheme in gpt mbr; do
782	    for fs in ufs ; do # zfs
783		for bios in legacy uefi both; do
784		    make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
785		done
786	    done
787	done
788    done
789done
790echo ${IMGDIR}/all.sh
791
792rmdir ${MNTPT}
793
794exit 0
795
796# Notes for the future
797
798for arch in i386; do
799    for geli in nogeli geli; do
800	for scheme in gpt mbr; do
801	    for fs in ufs zfs; do
802		for bios in legacy; do
803		    make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
804		done
805	    done
806	done
807    done
808done
809
810for arch in arm aarch64; do
811    for scheme in gpt mbr; do
812	fs=ufs
813	bios=efi
814	make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
815    done
816done
817
818for arch in powerpc powerpc64; do
819    for scheme in ppc-wtf; do
820	fs=ufs
821	for bios in ofw uboot chrp; do
822	    make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
823	done
824    done
825done
826
827for arch in riscv; do
828    geli=nogeli
829    fs=ufs
830    scheme=gpt
831    bios=efi
832    make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
833done
834