]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - tools/boot/rootgen.sh
Allow making just one flavor of boot-test image based on cmdline args.
[FreeBSD/FreeBSD.git] / tools / boot / rootgen.sh
1 #!/bin/sh
2
3 # $FreeBSD$
4
5 do_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
26 cpsys() {
27     src=$1
28     dst=$2
29
30     # Copy kernel + boot loader
31     (cd $src ; tar cf - .) | (cd $dst; tar xf -)
32 }
33
34 make_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
57 mk_nogeli_gpt_ufs_legacy() {
58     src=$1
59     img=$2
60
61     cat > ${src}/etc/fstab <<EOF
62 /dev/ada0p2     /               ufs     rw      1       1
63 EOF
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
71 mk_nogeli_gpt_ufs_uefi() {
72     src=$1
73     img=$2
74
75     cat > ${src}/etc/fstab <<EOF
76 /dev/ada0p2     /               ufs     rw      1       1
77 EOF
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
86 mk_nogeli_gpt_ufs_both() {
87     src=$1
88     img=$2
89
90     cat > ${src}/etc/fstab <<EOF
91 /dev/ada0p3     /               ufs     rw      1       1
92 EOF
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
104 mk_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
127 zfs_load=YES
128 opensolaris_load=YES
129 EOF
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
142 mk_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
165 zfs_load=YES
166 opensolaris_load=YES
167 EOF
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
180 mk_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
204 zfs_load=YES
205 opensolaris_load=YES
206 EOF
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
219 mk_nogeli_mbr_ufs_legacy() {
220     src=$1
221     img=$2
222
223     cat > ${src}/etc/fstab <<EOF
224 /dev/ada0s1a    /               ufs     rw      1       1
225 EOF
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
232 mk_nogeli_mbr_ufs_uefi() {
233     src=$1
234     img=$2
235
236     cat > ${src}/etc/fstab <<EOF
237 /dev/ada0s1a    /               ufs     rw      1       1
238 EOF
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
246 mk_nogeli_mbr_ufs_both() {
247     src=$1
248     img=$2
249
250     cat > ${src}/etc/fstab <<EOF
251 /dev/ada0s1a    /               ufs     rw      1       1
252 EOF
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
260 mk_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
285 zfs_load=YES
286 opensolaris_load=YES
287 EOF
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
300 mk_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
326 zfs_load=YES
327 opensolaris_load=YES
328 EOF
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
341 mk_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
367 zfs_load=YES
368 opensolaris_load=YES
369 EOF
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
382 mk_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
404 geom_eli_load=YES
405 EOF
406     cat > ${mntpt}/etc/fstab <<EOF
407 /dev/ada0p2.eli /               ufs     rw      1       1
408 EOF
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
418 mk_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
440 geom_eli_load=YES
441 EOF
442     cat > ${mntpt}/etc/fstab <<EOF
443 /dev/ada0p2.eli /               ufs     rw      1       1
444 EOF
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
454 mk_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
477 geom_eli_load=YES
478 EOF
479     cat > ${mntpt}/etc/fstab <<EOF
480 /dev/ada0p3.eli /               ufs     rw      1       1
481 EOF
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
491 mk_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
516 zfs_load=YES
517 opensolaris_load=YES
518 geom_eli_load=YES
519 EOF
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
534 mk_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
559 zfs_load=YES
560 opensolaris_load=YES
561 geom_eli_load=YES
562 EOF
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
577 mk_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
603 zfs_load=YES
604 opensolaris_load=YES
605 geom_eli_load=YES
606 EOF
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
622 mk_geli_mbr_ufs_legacy() {
623 }
624
625 mk_geli_mbr_ufs_uefi() {
626 }
627
628 mk_geli_mbr_ufs_both() {
629 }
630
631 mk_geli_mbr_zfs_legacy() {
632 }
633
634 mk_geli_mbr_zfs_uefi() {
635 }
636
637 mk_geli_mbr_zfs_both() {
638 }
639
640 # iso
641 # pxeldr
642 # u-boot
643 # powerpc
644
645 mk_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
656 EOF
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
668 qser="-serial telnet::4444,server -nographic"
669
670 # https://wiki.freebsd.org/QemuRecipes
671 # aarch64
672 qemu_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
687 qemu_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
695 qemu_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
703 qemu_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
716 qemu_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
725 qemu_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
734 qemu_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 make_one_image()
744 {
745     local arch=${1?}
746     local geli=${2?}
747     local scheme=${3?}
748     local fs=${4?}
749     local bios=${5?}
750
751     # Create sparse file and mount newly created filesystem(s) on it
752     img=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.img
753     sh=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.sh
754     echo "vvvvvvvvvvvvvv   Creating $img  vvvvvvvvvvvvvvv"
755     rm -f ${img}*
756     eval mk_${geli}_${scheme}_${fs}_${bios} ${DESTDIR} ${img} ${MNTPT} ${geli} ${scheme} ${fs} ${bios}
757     eval qemu_${arch}_${bios} ${img} ${sh}
758     [ -n "${SUDO_USER}" ] && chown ${SUDO_USER} ${img}*
759     echo "^^^^^^^^^^^^^^   Created $img   ^^^^^^^^^^^^^^^"
760 }
761
762 # mips
763 # qemu-system-mips -kernel /path/to/rootfs/boot/kernel/kernel -nographic -hda /path/to/disk.img -m 2048
764
765 # Powerpc -- doesn't work but maybe it would enough for testing -- needs details
766 # powerpc64
767 # qemu-system-ppc64 -drive file=/path/to/disk.img,format=raw
768
769 # sparc64
770 # qemu-system-sparc64 -drive file=/path/to/disk.img,format=raw
771
772 # Misc variables
773 SRCTOP=$(make -v SRCTOP)
774 cd ${SRCTOP}/stand
775 OBJDIR=$(make -v .OBJDIR)
776 IMGDIR=${OBJDIR}/boot-images
777 mkdir -p ${IMGDIR}
778 MNTPT=$(mktemp -d /tmp/stand-test.XXXXXX)
779
780 # Setup the installed tree...
781 DESTDIR=${OBJDIR}/boot-tree
782 rm -rf ${DESTDIR}
783 mkdir -p ${DESTDIR}/boot/defaults
784 mkdir -p ${DESTDIR}/boot/kernel
785 # XXX boot1 exists only on sparc64
786 cp /boot/boot1 ${DESTDIR}/boot
787 cp /boot/kernel/kernel ${DESTDIR}/boot/kernel
788 echo -h -D -S115200 > ${DESTDIR}/boot.config
789 cat > ${DESTDIR}/boot/loader.conf <<EOF
790 console=comconsole
791 comconsole_speed=115200
792 boot_serial=-h
793 EOF
794 # XXX
795 cp /boot/device.hints ${DESTDIR}/boot/device.hints
796 # Assume we're already built
797 make install DESTDIR=${DESTDIR} MK_MAN=no MK_INSTALL_AS_USER=yes
798 # Copy init, /bin/sh, minimal libraries and testing /etc/rc
799 mkdir -p ${DESTDIR}/sbin ${DESTDIR}/bin \
800       ${DESTDIR}/lib ${DESTDIR}/libexec \
801       ${DESTDIR}/etc ${DESTDIR}/dev
802 for f in /sbin/halt /sbin/init /bin/sh /sbin/sysctl $(ldd /bin/sh | awk 'NF == 4 { print $3; }') /libexec/ld-elf.so.1; do
803     cp $f ${DESTDIR}/$f
804 done
805 cat > ${DESTDIR}/etc/rc <<EOF
806 #!/bin/sh
807
808 sysctl machdep.bootmethod
809 echo "RC COMMAND RUNNING -- SUCCESS!!!!!"
810 halt -p
811 EOF
812
813 # If we were given exactly 5 args, go make that one image.
814
815 if [ $# -eq 5 ]; then
816     make_one_image $*
817     exit
818 fi
819
820 # OK. Let the games begin
821
822 for arch in amd64; 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 uefi both; do
827                     make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
828                 done
829             done
830         done
831     done
832 done
833
834 rmdir ${MNTPT}
835
836 exit 0
837
838 # Notes for the future
839
840 for arch in i386; do
841     for geli in nogeli geli; do
842         for scheme in gpt mbr; do
843             for fs in ufs zfs; do
844                 for bios in legacy; do
845                     make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
846                 done
847             done
848         done
849     done
850 done
851
852 for arch in arm aarch64; do
853     for scheme in gpt mbr; do
854         fs=ufs
855         for bios in uboot efi; do
856             make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
857         done
858     done
859 done
860
861 for arch in powerpc powerpc64; do
862     for scheme in ppc-wtf; do
863         fs=ufs
864         for bios in ofw uboot chrp; do
865             make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
866         done
867     done
868 done
869
870 for arch in sparc64; do
871     for geli in nogeli; do
872         for scheme in vtoc8; do
873             for fs in ufs; do
874                 for bios in ofw; do
875                     make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
876                 done
877             done
878         done
879     done
880 done