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