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