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