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