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