]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - tools/boot/rootgen.sh
libarchive: merge from vendor branch
[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 any user if someone
18 # creates userland geli.
19 #
20 # This assumes an external program install-boot.sh which will install
21 # the appropriate boot files in the appropriate locations.
22 #
23 # Assumes you've already rebuilt... maybe bad? Also maybe bad: the env
24 # vars should likely be conditionally set to allow better automation.
25 #
26
27 . $(dirname $0)/install-boot.sh
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 ufs_fstab() {
38     dir=$1
39
40     cat > ${dir}/etc/fstab <<EOF
41 /dev/ufs/root   /               ufs     rw      1       1
42 EOF
43 }
44
45 mk_nogeli_gpt_ufs_legacy() {
46     src=$1
47     img=$2
48
49     ufs_fstab ${src}
50     makefs -t ffs -B little -s 200m -o label=root ${img}.p2 ${src}
51     mkimg -s gpt -b ${src}/boot/pmbr \
52           -p freebsd-boot:=${src}/boot/gptboot \
53           -p freebsd-ufs:=${img}.p2 -o ${img}
54     rm -f ${src}/etc/fstab
55 }
56
57 mk_nogeli_gpt_ufs_uefi() {
58     src=$1
59     img=$2
60
61     ufs_fstab ${src}
62     make_esp_file ${img}.p1 ${espsize} ${src}/boot/loader.efi
63     makefs -t ffs -B little -s 200m -o label=root ${img}.p2 ${src}
64     mkimg -s gpt \
65           -p efi:=${img}.p1 \
66           -p freebsd-ufs:=${img}.p2 -o ${img}
67     rm -f ${src}/etc/fstab
68 }
69
70 mk_nogeli_gpt_ufs_both() {
71     src=$1
72     img=$2
73
74     ufs_fstab ${src}
75     make_esp_file ${img}.p1 ${espsize} ${src}/boot/loader.efi
76     makefs -t ffs -B little -s 200m -o label=root ${img}.p3 ${src}
77     # p1 is boot for uefi, p2 is boot for gpt, p3 is /
78     mkimg -b ${src}/boot/pmbr -s gpt \
79           -p efi:=${img}.p1 \
80           -p freebsd-boot:=${src}/boot/gptboot \
81           -p freebsd-ufs:=${img}.p3 \
82           -o ${img}
83     rm -f ${src}/etc/fstab
84 }
85
86 # XXX should not assume host == target
87 zfs_extra()
88 {
89     src=$1
90     dst=$2
91
92     mkdir -p $dst
93     mkdir -p $dst/boot/kernel
94     cat > ${dst}/boot/loader.conf.local <<EOF
95 cryptodev_load=YES
96 zfs_load=YES
97 EOF
98     cp /boot/kernel/acl_nfs4.ko ${dst}/boot/kernel/acl_nfs4.ko
99     cp /boot/kernel/cryptodev.ko ${dst}/boot/kernel/cryptodev.ko
100     cp /boot/kernel/zfs.ko ${dst}/boot/kernel/zfs.ko
101 }
102
103 mk_nogeli_gpt_zfs_legacy() {
104     src=$1
105     img=$2
106     mntpt=$3
107     geli=$4
108     scheme=$5
109     fs=$6
110     bios=$7
111     pool=nogeli-gpt-zfs-legacy
112     dst=$img.extra
113
114     zfs_extra $src $dst
115     makefs -t zfs -s 200m \
116         -o poolname=${pool} -o bootfs=${pool} -o rootpath=/ \
117         ${img}.p2 ${src} ${dst}
118     mkimg -b ${src}/boot/pmbr -s gpt \
119           -p freebsd-boot:=/boot/gptzfsboot \
120           -p freebsd-zfs:=${img}.p2 \
121           -o ${img}
122     rm -rf ${dst}
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     dst=$img.extra
135
136     zfs_extra $src $dst
137     make_esp_file ${img}.p1 ${espsize} ${src}/boot/loader.efi
138     makefs -t zfs -s 200m \
139         -o poolname=${pool} -o bootfs=${pool} -o rootpath=/ \
140         ${img}.p2 ${src} ${dst}
141     mkimg -b ${src}/boot/pmbr -s gpt \
142           -p efi:=${img}.p1 \
143           -p freebsd-zfs:=${img}.p2 \
144           -o ${img}
145     rm -rf ${dst}
146 }
147
148 mk_nogeli_gpt_zfs_both() {
149     src=$1
150     img=$2
151     mntpt=$3
152     geli=$4
153     scheme=$5
154     fs=$6
155     bios=$7
156     pool=nogeli-gpt-zfs-both
157     dst=$img.extra
158
159     zfs_extra $src $dst
160     make_esp_file ${img}.p2 ${espsize} ${src}/boot/loader.efi
161     makefs -t zfs -s 200m \
162         -o poolname=${pool} -o bootfs=${pool} -o rootpath=/ \
163         ${img}.p3 ${src} ${dst}
164     mkimg -b ${src}/boot/pmbr -s gpt \
165           -p freebsd-boot:=/boot/gptzfsboot \
166           -p efi:=${img}.p2 \
167           -p freebsd-zfs:=${img}.p3 \
168           -o ${img}
169     rm -rf ${dst}
170 }
171
172 mk_nogeli_mbr_ufs_legacy() {
173     src=$1
174     img=$2
175
176     ufs_fstab ${src}
177     makefs -t ffs -B little -s 200m -o label=root ${img}.s1a ${src}
178     mkimg -s bsd -b ${src}/boot/boot -p freebsd-ufs:=${img}.s1a -o ${img}.s1
179     mkimg -a 1 -s mbr -b ${src}/boot/boot0sio -p freebsd:=${img}.s1 -o ${img}
180     rm -f ${src}/etc/fstab
181 }
182
183 mk_nogeli_mbr_ufs_uefi() {
184     src=$1
185     img=$2
186
187     ufs_fstab ${src}
188     make_esp_file ${img}.s1 ${espsize} ${src}/boot/loader.efi
189     makefs -t ffs -B little -s 200m -o label=root ${img}.s2a ${src}
190     mkimg -s bsd -p freebsd-ufs:=${img}.s2a -o ${img}.s2
191     mkimg -a 1 -s mbr -p efi:=${img}.s1 -p freebsd:=${img}.s2 -o ${img}
192     rm -f ${src}/etc/fstab
193 }
194
195 mk_nogeli_mbr_ufs_both() {
196     src=$1
197     img=$2
198
199     ufs_fstab ${src}
200     make_esp_file ${img}.s1 ${espsize} ${src}/boot/loader.efi
201     makefs -t ffs -B little -s 200m -o label=root ${img}.s2a ${src}
202     mkimg -s bsd -b ${src}/boot/boot -p freebsd-ufs:=${img}.s2a -o ${img}.s2
203     mkimg -a 2 -s mbr -b ${src}/boot/mbr -p efi:=${img}.s1 -p freebsd:=${img}.s2 -o ${img}
204     rm -f ${src}/etc/fstab
205 }
206
207 mk_nogeli_mbr_zfs_legacy() {
208     src=$1
209     img=$2
210     mntpt=$3
211     geli=$4
212     scheme=$5
213     fs=$6
214     bios=$7
215     pool=nogeli-mbr-zfs-legacy
216
217     zfs_extra $src $dst
218     makefs -t zfs -s 200m \
219         -o poolname=${pool} -o bootfs=${pool} -o rootpath=/ \
220         ${img}.s1a ${src} ${dst}
221     # The old boot1/boot2 boot split is also used by zfs. We need to extract zfsboot1
222     # from this image. Since there's no room in the mbr format for the rest of the loader,
223     # it will load the zfsboot loader from the reserved for bootloader area of the ZFS volume
224     # being booted, hence the need to dd it into the raw img later.
225     # Please note: zfsboot only works with partition 'a' which must be the root
226     # partition / zfs volume
227     dd if=${src}/boot/zfsboot of=${dst}/zfsboot1 count=1
228     mkimg -s bsd -b ${dst}zfsboot1 -p freebsd-zfs:=${img}.s1a -o ${img}.s1
229     dd if=${src}/boot/zfsboot of=${img}.s1a skip=1 seek=1024
230     mkimg -a 1 -s mbr -b ${src}/boot/mbr -p freebsd:=${img}.s1 -o ${img}
231     rm -rf ${dst}
232 }
233
234 mk_nogeli_mbr_zfs_uefi() {
235     src=$1
236     img=$2
237     mntpt=$3
238     geli=$4
239     scheme=$5
240     fs=$6
241     bios=$7
242     pool=nogeli-mbr-zfs-uefi
243
244     zfs_extra $src $dst
245     make_esp_file ${img}.s1 ${espsize} ${src}/boot/loader.efi
246     makefs -t zfs -s 200m \
247         -o poolname=${pool} -o bootfs=${pool} -o rootpath=/ \
248         ${img}.s2a ${src} ${dst}
249     mkimg -s bsd -b ${dst}zfsboot1 -p freebsd-zfs:=${img}.s2a -o ${img}.s2
250     mkimg -a 1 -s mbr -b ${src}/boot/mbr -p efi:=${img}.s1 -p freebsd:=${img}.s2 -o ${img}
251     rm -rf ${dst}
252 }
253
254 mk_nogeli_mbr_zfs_both() {
255     src=$1
256     img=$2
257     mntpt=$3
258     geli=$4
259     scheme=$5
260     fs=$6
261     bios=$7
262     pool=nogeli-mbr-zfs-both
263
264     zfs_extra $src $dst
265     make_esp_file ${img}.s1 ${espsize} ${src}/boot/loader.efi
266     makefs -t zfs -s 200m \
267         -o poolname=${pool} -o bootfs=${pool} -o rootpath=/ \
268         ${img}.s2a ${src} ${dst}
269     # The old boot1/boot2 boot split is also used by zfs. We need to extract zfsboot1
270     # from this image. Since there's no room in the mbr format for the rest of the loader,
271     # it will load the zfsboot loader from the reserved for bootloader area of the ZFS volume
272     # being booted, hence the need to dd it into the raw img later.
273     # Please note: zfsboot only works with partition 'a' which must be the root
274     # partition / zfs volume
275     dd if=${src}/boot/zfsboot of=${dst}/zfsboot1 count=1
276     mkimg -s bsd -b ${dst}zfsboot1 -p freebsd-zfs:=${img}.s2a -o ${img}.s2
277     dd if=${src}/boot/zfsboot of=${img}.s1a skip=1 seek=1024
278     mkimg -a 1 -s mbr -b ${src}/boot/mbr -p efi:=${img}.s1 -p freebsd:=${img}.s2 -o ${img}
279 }
280
281 mk_geli_gpt_ufs_legacy() {
282     src=$1
283     img=$2
284     mntpt=$3
285     geli=$4
286     scheme=$5
287     fs=$6
288     bios=$7
289
290     dd if=/dev/zero of=${img} count=1 seek=$(( 200 * 1024 * 1024 / 512 ))
291     md=$(mdconfig -f ${img})
292     gpart create -s gpt ${md}
293     gpart add -t freebsd-boot -s 400k -a 4k     ${md}   # <= ~540k
294     gpart add -t freebsd-ufs -l root $md
295     # install-boot will make this bootable
296     echo ${passphrase} | geli init -bg -e AES-XTS -i ${iterations} -J - -l 256 -s 4096 ${md}p2
297     echo ${passphrase} | geli attach -j - ${md}p2
298     newfs -L root /dev/${md}p2.eli
299     mount /dev/${md}p2.eli ${mntpt}
300     cpsys ${src} ${mntpt}
301     # need to make a couple of tweaks
302     cat > ${mntpt}/boot/loader.conf <<EOF
303 geom_eli_load=YES
304 EOF
305     ufs_fstab ${mntpt}
306
307     cp /boot/kernel/geom_eli.ko ${mntpt}/boot/kernel/geom_eli.ko
308     # end tweaks
309     umount -f ${mntpt}
310     geli detach ${md}p2
311     ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
312     mdconfig -d -u ${md}
313 }
314
315 mk_geli_gpt_ufs_uefi() {
316     src=$1
317     img=$2
318     mntpt=$3
319     geli=$4
320     scheme=$5
321     fs=$6
322     bios=$7
323
324     dd if=/dev/zero of=${img} count=1 seek=$(( 200 * 1024 * 1024 / 512 ))
325     md=$(mdconfig -f ${img})
326     gpart create -s gpt ${md}
327     gpart add -t efi -s ${espsize}k -a 4k ${md}
328     gpart add -t freebsd-ufs -l root $md
329     # install-boot will make this bootable
330     echo ${passphrase} | geli init -bg -e AES-XTS -i ${iterations} -J - -l 256 -s 4096 ${md}p2
331     echo ${passphrase} | geli attach -j - ${md}p2
332     newfs -L root /dev/${md}p2.eli
333     mount /dev/${md}p2.eli ${mntpt}
334     cpsys ${src} ${mntpt}
335     # need to make a couple of tweaks
336     cat > ${mntpt}/boot/loader.conf <<EOF
337 geom_eli_load=YES
338 EOF
339     ufs_fstab ${mntpt}
340
341     cp /boot/kernel/geom_eli.ko ${mntpt}/boot/kernel/geom_eli.ko
342     # end tweaks
343     umount -f ${mntpt}
344     geli detach ${md}p2
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_geli_gpt_ufs_both() {
350     src=$1
351     img=$2
352     mntpt=$3
353     geli=$4
354     scheme=$5
355     fs=$6
356     bios=$7
357
358     dd if=/dev/zero of=${img} count=1 seek=$(( 200 * 1024 * 1024 / 512 ))
359     md=$(mdconfig -f ${img})
360     gpart create -s gpt ${md}
361     gpart add -t efi -s ${espsize}k -a 4k ${md}
362     gpart add -t freebsd-boot -s 400k -a 4k     ${md}   # <= ~540k
363     gpart add -t freebsd-ufs -l root $md
364     # install-boot will make this bootable
365     echo ${passphrase} | geli init -bg -e AES-XTS -i ${iterations} -J - -l 256 -s 4096 ${md}p3
366     echo ${passphrase} | geli attach -j - ${md}p3
367     newfs -L root /dev/${md}p3.eli
368     mount /dev/${md}p3.eli ${mntpt}
369     cpsys ${src} ${mntpt}
370     # need to make a couple of tweaks
371     cat > ${mntpt}/boot/loader.conf <<EOF
372 geom_eli_load=YES
373 EOF
374     ufs_fstab ${mntpt}
375
376     cp /boot/kernel/geom_eli.ko ${mntpt}/boot/kernel/geom_eli.ko
377     # end tweaks
378     umount -f ${mntpt}
379     geli detach ${md}p3
380     ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
381     mdconfig -d -u ${md}
382 }
383
384 mk_geli_gpt_zfs_legacy() {
385     src=$1
386     img=$2
387     mntpt=$3
388     geli=$4
389     scheme=$5
390     fs=$6
391     bios=$7
392     pool=geli-gpt-zfs-legacy
393
394     # Note that in this flavor we create an empty p2 ufs partition, and put
395     # the bootable zfs stuff on p3, just to test the ability of the zfs probe
396     # probe routines to find a pool on a partition other than the first one.
397
398     dd if=/dev/zero of=${img} count=1 seek=$(( 300 * 1024 * 1024 / 512 ))
399     md=$(mdconfig -f ${img})
400     gpart create -s gpt ${md}
401     gpart add -t freebsd-boot -s 400k -a 4k     ${md}   # <= ~540k
402     gpart add -t freebsd-ufs -s 100m ${md}
403     gpart add -t freebsd-zfs -l root $md
404     # install-boot will make this bootable
405     echo ${passphrase} | geli init -bg -e AES-XTS -i ${iterations} -J - -l 256 -s 4096 ${md}p3
406     echo ${passphrase} | geli attach -j - ${md}p3
407     zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}p3.eli
408     zpool set bootfs=${pool} ${pool}
409     zfs create -po mountpoint=/ ${pool}/ROOT/default
410     # NB: The online guides go nuts customizing /var and other mountpoints here, no need
411     cpsys ${src} ${mntpt}
412     # need to make a couple of tweaks
413     cat >> ${mntpt}/boot/loader.conf <<EOF
414 cryptodev_load=YES
415 zfs_load=YES
416 geom_eli_load=YES
417 EOF
418     cp /boot/kernel/acl_nfs4.ko ${mntpt}/boot/kernel/acl_nfs4.ko
419     cp /boot/kernel/cryptodev.ko ${mntpt}/boot/kernel/cryptodev.ko
420     cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko
421     cp /boot/kernel/geom_eli.ko ${mntpt}/boot/kernel/geom_eli.ko
422     # end tweaks
423     zfs umount -f ${pool}/ROOT/default
424     zfs set mountpoint=none ${pool}/ROOT/default
425     zpool set bootfs=${pool}/ROOT/default ${pool}
426     zpool set autoexpand=on ${pool}
427     zpool export ${pool}
428     geli detach ${md}p3
429     ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
430     mdconfig -d -u ${md}
431 }
432
433 mk_geli_gpt_zfs_uefi() {
434     src=$1
435     img=$2
436     mntpt=$3
437     geli=$4
438     scheme=$5
439     fs=$6
440     bios=$7
441     pool=geli-gpt-zfs-uefi
442
443     # Note that in this flavor we create an empty p2 ufs partition, and put
444     # the bootable zfs stuff on p3, just to test the ability of the zfs probe
445     # probe routines to find a pool on a partition other than the first one.
446
447     dd if=/dev/zero of=${img} count=1 seek=$(( 300 * 1024 * 1024 / 512 ))
448     md=$(mdconfig -f ${img})
449     gpart create -s gpt ${md}
450     gpart add -t efi -s ${espsize}k -a 4k ${md}
451     gpart add -t freebsd-ufs -s 100m ${md}
452     gpart add -t freebsd-zfs -l root $md
453     # install-boot will make this bootable
454     echo ${passphrase} | geli init -bg -e AES-XTS -i ${iterations} -J - -l 256 -s 4096 ${md}p3
455     echo ${passphrase} | geli attach -j - ${md}p3
456     zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}p3.eli
457     zpool set bootfs=${pool} ${pool}
458     zfs create -po mountpoint=/ ${pool}/ROOT/default
459     # NB: The online guides go nuts customizing /var and other mountpoints here, no need
460     cpsys ${src} ${mntpt}
461     # need to make a couple of tweaks
462     cat >> ${mntpt}/boot/loader.conf <<EOF
463 cryptodev_load=YES
464 zfs_load=YES
465 geom_eli_load=YES
466 EOF
467     cp /boot/kernel/acl_nfs4.ko ${mntpt}/boot/kernel/acl_nfs4.ko
468     cp /boot/kernel/cryptodev.ko ${mntpt}/boot/kernel/cryptodev.ko
469     cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko
470     cp /boot/kernel/geom_eli.ko ${mntpt}/boot/kernel/geom_eli.ko
471     # end tweaks
472     zfs umount -f ${pool}/ROOT/default
473     zfs set mountpoint=none ${pool}/ROOT/default
474     zpool set bootfs=${pool}/ROOT/default ${pool}
475     zpool set autoexpand=on ${pool}
476     zpool export ${pool}
477     geli detach ${md}p3
478     ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
479     mdconfig -d -u ${md}
480 }
481
482 mk_geli_gpt_zfs_both() {
483     src=$1
484     img=$2
485     mntpt=$3
486     geli=$4
487     scheme=$5
488     fs=$6
489     bios=$7
490     pool=geli-gpt-zfs-both
491
492     dd if=/dev/zero of=${img} count=1 seek=$(( 200 * 1024 * 1024 / 512 ))
493     md=$(mdconfig -f ${img})
494     gpart create -s gpt ${md}
495     gpart add -t efi -s ${espsize}k -a 4k ${md}
496     gpart add -t freebsd-boot -s 400k -a 4k     ${md}   # <= ~540k
497     gpart add -t freebsd-zfs -l root $md
498     # install-boot will make this bootable
499     echo ${passphrase} | geli init -bg -e AES-XTS -i ${iterations} -J - -l 256 -s 4096 ${md}p3
500     echo ${passphrase} | geli attach -j - ${md}p3
501     zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}p3.eli
502     zpool set bootfs=${pool} ${pool}
503     zfs create -po mountpoint=/ ${pool}/ROOT/default
504     # NB: The online guides go nuts customizing /var and other mountpoints here, no need
505     cpsys ${src} ${mntpt}
506     # need to make a couple of tweaks
507     cat > ${mntpt}/boot/loader.conf <<EOF
508 cryptodev_load=YES
509 zfs_load=YES
510 geom_eli_load=YES
511 EOF
512     cp /boot/kernel/acl_nfs4.ko ${mntpt}/boot/kernel/acl_nfs4.ko
513     cp /boot/kernel/cryptodev.ko ${mntpt}/boot/kernel/cryptodev.ko
514     cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko
515     cp /boot/kernel/geom_eli.ko ${mntpt}/boot/kernel/geom_eli.ko
516     # end tweaks
517     zfs umount -f ${pool}/ROOT/default
518     zfs set mountpoint=none ${pool}/ROOT/default
519     zpool set bootfs=${pool}/ROOT/default ${pool}
520     zpool set autoexpand=on ${pool}
521     zpool export ${pool}
522     geli detach ${md}p3
523     ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
524     mdconfig -d -u ${md}
525 }
526
527 # GELI+MBR is not a valid configuration
528 mk_geli_mbr_ufs_legacy() {
529 }
530
531 mk_geli_mbr_ufs_uefi() {
532 }
533
534 mk_geli_mbr_ufs_both() {
535 }
536
537 mk_geli_mbr_zfs_legacy() {
538 }
539
540 mk_geli_mbr_zfs_uefi() {
541 }
542
543 mk_geli_mbr_zfs_both() {
544 }
545
546 # iso
547 # pxeldr
548 # u-boot
549 # powerpc
550
551 qser="-monitor telnet::4444,server,nowait -serial stdio -nographic"
552
553 # https://wiki.freebsd.org/QemuRecipes
554 # aarch64
555 qemu_aarch64_uefi()
556 {
557     img=$1
558     sh=$2
559
560     echo "qemu-system-aarch64 -m 4096M -cpu cortex-a57 -M virt  \
561         -bios QEMU_EFI.fd ${qser} \
562         -drive if=none,file=${img},id=hd0 \
563         -device virtio-blk-device,drive=hd0" > $sh
564     chmod 755 $sh
565 # https://wiki.freebsd.org/arm64/QEMU also has
566 #       -device virtio-net-device,netdev=net0
567 #       -netdev user,id=net0
568 }
569
570 log_for()
571 {
572     dir=$(dirname $1)
573     fn=$(basename $1 .sh)
574     echo $dir/$fn.log
575 }
576
577 # Amd64 qemu
578 qemu_amd64_legacy()
579 {
580     img=$1
581     sh=$2
582     log=$(log_for $2)
583
584     echo "echo -n $(basename $sh .sh):' '" > $sh
585     echo "(qemu-system-x86_64 -m 256m --drive file=${img},format=raw ${qser} | tee $log 2>&1 | grep -q SUCCESS) && echo legacy pass || echo legacy fail" >> $sh
586     chmod 755 $sh
587 }
588
589 qemu_amd64_uefi()
590 {
591     img=$1
592     sh=$2
593     log=$(log_for $2)
594
595     echo "echo -n $(basename $sh .sh):' '" > $sh
596     echo "(qemu-system-x86_64 -m 256m -bios ~/bios/OVMF-X64.fd --drive file=${img},format=raw ${qser} | tee $log 2>&1 | grep -q SUCCESS) && echo uefi pass || echo uefi fail" >> $sh
597     chmod 755 $sh
598 }
599
600 qemu_amd64_both()
601 {
602     img=$1
603     sh=$2
604     log=$(log_for $2)
605
606     echo "echo -n $(basename $sh .sh):' '" > $sh
607     echo "(qemu-system-x86_64 -m 256m --drive file=${img},format=raw ${qser} | tee $log 2>&1 | grep -q SUCCESS) && echo legacy pass || echo legacy fail" >> $sh
608     echo "echo -n $(basename $sh .sh):' '" >> $sh
609     echo "(qemu-system-x86_64 -m 256m -bios ~/bios/OVMF-X64.fd --drive file=${img},format=raw ${qser} | tee -a $log 2>&1 | grep -q SUCCESS) && echo uefi pass || echo uefi fail" >> $sh
610     chmod 755 $sh
611 }
612
613 # arm
614 # nothing listed?
615
616 # i386
617 qemu_i386_legacy()
618 {
619     img=$1
620     sh=$2
621
622     echo "qemu-system-i386 --drive file=${img},format=raw ${qser}" > $sh
623     chmod 755 $sh
624 }
625
626 # Not yet supported
627 qemu_i386_uefi()
628 {
629     img=$1
630     sh=$2
631
632     echo "qemu-system-i386 -bios ~/bios/OVMF-X32.fd --drive file=${img},format=raw ${qser}" > $sh
633     chmod 755 $sh
634 }
635
636 # Needs UEFI to be supported
637 qemu_i386_both()
638 {
639     img=$1
640     sh=$2
641
642     echo "qemu-system-i386 --drive file=${img},format=raw ${qser}" > $sh
643     echo "qemu-system-i386 -bios ~/bios/OVMF-X32.fd --drive file=${img},format=raw ${qser}" >> $sh
644     chmod 755 $sh
645 }
646
647 make_one_image()
648 {
649     local arch=${1?}
650     local geli=${2?}
651     local scheme=${3?}
652     local fs=${4?}
653     local bios=${5?}
654
655     # Create sparse file and mount newly created filesystem(s) on it
656     img=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.img
657     sh=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.sh
658     echo "$sh" >> ${IMGDIR}/all.sh
659     echo date >> ${IMGDIR}/all.sh
660     echo "vvvvvvvvvvvvvv   Creating $img  vvvvvvvvvvvvvvv"
661     rm -f ${img}*
662     eval mk_${geli}_${scheme}_${fs}_${bios} ${DESTDIR} ${img} ${MNTPT} ${geli} ${scheme} ${fs} ${bios}
663     eval qemu_${arch}_${bios} ${img} ${sh}
664     [ -n "${SUDO_USER}" ] && chown ${SUDO_USER} ${img}*
665     echo "^^^^^^^^^^^^^^   Created $img   ^^^^^^^^^^^^^^^"
666 }
667
668 # Powerpc -- doesn't work but maybe it would enough for testing -- needs details
669 # powerpc64
670 # qemu-system-ppc64 -drive file=/path/to/disk.img,format=raw
671
672 # Misc variables
673 SRCTOP=$(make -v SRCTOP)
674 cd ${SRCTOP}/stand
675 OBJDIR=$(make -v .OBJDIR)
676 IMGDIR=${OBJDIR}/boot-images
677 mkdir -p ${IMGDIR}
678 MNTPT=$(mktemp -d /tmp/stand-test.XXXXXX)
679
680 # Setup the installed tree...
681 DESTDIR=${OBJDIR}/boot-tree
682 rm -rf ${DESTDIR}
683 mkdir -p ${DESTDIR}/boot/defaults
684 mkdir -p ${DESTDIR}/boot/kernel
685 cp /boot/kernel/kernel ${DESTDIR}/boot/kernel
686 echo -h -D -S115200 > ${DESTDIR}/boot.config
687 cat > ${DESTDIR}/boot/loader.conf <<EOF
688 comconsole_speed=115200
689 autoboot_delay=0
690 EOF
691 # XXX
692 cp /boot/device.hints ${DESTDIR}/boot/device.hints
693 # Assume we're already built
694 make install DESTDIR=${DESTDIR} MK_MAN=no MK_INSTALL_AS_USER=yes WITHOUT_DEBUG_FILES=yes
695 if [ $? -ne 0 ]; then
696         echo "make install failed"
697         exit 1
698 fi
699 # Copy init, /bin/sh, minimal libraries and testing /etc/rc
700 mkdir -p ${DESTDIR}/sbin ${DESTDIR}/bin \
701       ${DESTDIR}/lib ${DESTDIR}/libexec \
702       ${DESTDIR}/etc ${DESTDIR}/dev
703 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
704     cp $f ${DESTDIR}/$f
705 done
706 cat > ${DESTDIR}/etc/rc <<EOF
707 #!/bin/sh
708
709 sysctl machdep.bootmethod
710 echo "RC COMMAND RUNNING -- SUCCESS!!!!!"
711 halt -p
712 EOF
713
714 # If we were given exactly 5 args, go make that one image.
715
716 rm -f ${IMGDIR}/all.sh
717 echo date > ${IMGDIR}/all.sh
718 chmod +x  ${IMGDIR}/all.sh
719
720 if [ $# -eq 5 ]; then
721     make_one_image $*
722     echo ${IMGDIR}/all.sh
723     exit
724 fi
725
726 # OK. Let the games begin
727
728 for arch in amd64; do
729     for geli in nogeli; do # geli
730         for scheme in gpt mbr; do
731             for fs in ufs zfs; do
732                 for bios in legacy uefi both; do
733                     make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
734                 done
735             done
736         done
737     done
738 done
739     # We should also do a cd image for amd64 here
740 echo ${IMGDIR}/all.sh
741
742 rmdir ${MNTPT}
743
744 exit 0
745
746 # Notes for the future
747
748 for arch in i386; do
749     for geli in nogeli geli; do
750         for scheme in gpt mbr; do
751             for fs in ufs zfs; do
752                 for bios in legacy; do
753                     # The legacy boot is shared with amd64 so those routines could
754                     # likely be used here.
755                     make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
756                 done
757             done
758         done
759     done
760 done
761     # We should also do a cd image for i386 here
762
763 for arch in arm aarch64; do
764     geli=nogeli         # I don't think geli boot works / is supported on arm
765     for scheme in gpt mbr; do
766       for fs in ufs zfs; do
767         bios=efi # Note: arm has some uboot support with ufs, what to do?
768         make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
769       done
770     done
771 done
772
773 # It's not clear that the nested looping paradigm is best for powerpc
774 # due to its diversity.
775 for arch in powerpc powerpc64 powerpc64le; do
776     geli=nogeli
777     for scheme in apm gpt; do
778         fs=ufs # zfs + gpt might be supported?
779         for bios in ofw uboot chrp; do
780             make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
781         done
782     done
783 done
784
785 for arch in riscv; do
786     geli=nogeli
787     fs=ufs              # Generic ZFS booting support with efi?
788     scheme=gpt
789     bios=efi
790     make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
791 done