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