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