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