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