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