]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - tools/boot/rootgen.sh
The zfs module has grown a dependency on zcl_nfs4.ko, so copy it into all
[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     dd if=/dev/zero of=${img} count=1 seek=$(( 200 * 1024 * 1024 / 512 ))
491     md=$(mdconfig -f ${img})
492     gpart create -s gpt ${md}
493     gpart add -t freebsd-boot -s 400k -a 4k     ${md}   # <= ~540k
494     gpart add -t freebsd-zfs -l root $md
495     # install-boot will make this bootable
496     echo ${passphrase} | geli init -bg -e AES-XTS -i ${iterations} -J - -l 256 -s 4096 ${md}p2
497     echo ${passphrase} | geli attach -j - ${md}p2
498     zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}p2.eli
499     zpool set bootfs=${pool} ${pool}
500     zfs create -po mountpoint=/ ${pool}/ROOT/default
501     # NB: The online guides go nuts customizing /var and other mountpoints here, no need
502     cpsys ${src} ${mntpt}
503     # need to make a couple of tweaks
504     cat >> ${mntpt}/boot/loader.conf <<EOF
505 zfs_load=YES
506 opensolaris_load=YES
507 geom_eli_load=YES
508 EOF
509     cp /boot/kernel/acl_nfs4.ko ${mntpt}/boot/kernel/acl_nfs4.ko
510     cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko
511     cp /boot/kernel/opensolaris.ko ${mntpt}/boot/kernel/opensolaris.ko
512     cp /boot/kernel/geom_eli.ko ${mntpt}/boot/kernel/geom_eli.ko
513     # end tweaks
514     zfs umount -f ${pool}/ROOT/default
515     zfs set mountpoint=none ${pool}/ROOT/default
516     zpool set bootfs=${pool}/ROOT/default ${pool}
517     zpool set autoexpand=on ${pool}
518     zpool export ${pool}
519     geli detach ${md}p2
520     ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
521     mdconfig -d -u ${md}
522 }
523
524 mk_geli_gpt_zfs_uefi() {
525     src=$1
526     img=$2
527     mntpt=$3
528     geli=$4
529     scheme=$5
530     fs=$6
531     bios=$7
532     pool=geli-gpt-zfs-uefi
533
534     dd if=/dev/zero of=${img} count=1 seek=$(( 200 * 1024 * 1024 / 512 ))
535     md=$(mdconfig -f ${img})
536     gpart create -s gpt ${md}
537     gpart add -t efi -s ${espsize}k -a 4k ${md}
538     gpart add -t freebsd-zfs -l root $md
539     # install-boot will make this bootable
540     echo ${passphrase} | geli init -bg -e AES-XTS -i ${iterations} -J - -l 256 -s 4096 ${md}p2
541     echo ${passphrase} | geli attach -j - ${md}p2
542     zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}p2.eli
543     zpool set bootfs=${pool} ${pool}
544     zfs create -po mountpoint=/ ${pool}/ROOT/default
545     # NB: The online guides go nuts customizing /var and other mountpoints here, no need
546     cpsys ${src} ${mntpt}
547     # need to make a couple of tweaks
548     cat >> ${mntpt}/boot/loader.conf <<EOF
549 zfs_load=YES
550 opensolaris_load=YES
551 geom_eli_load=YES
552 EOF
553     cp /boot/kernel/acl_nfs4.ko ${mntpt}/boot/kernel/acl_nfs4.ko
554     cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko
555     cp /boot/kernel/opensolaris.ko ${mntpt}/boot/kernel/opensolaris.ko
556     cp /boot/kernel/geom_eli.ko ${mntpt}/boot/kernel/geom_eli.ko
557     # end tweaks
558     zfs umount -f ${pool}/ROOT/default
559     zfs set mountpoint=none ${pool}/ROOT/default
560     zpool set bootfs=${pool}/ROOT/default ${pool}
561     zpool set autoexpand=on ${pool}
562     zpool export ${pool}
563     geli detach ${md}p2
564     ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
565     mdconfig -d -u ${md}
566 }
567
568 mk_geli_gpt_zfs_both() {
569     src=$1
570     img=$2
571     mntpt=$3
572     geli=$4
573     scheme=$5
574     fs=$6
575     bios=$7
576     pool=geli-gpt-zfs-both
577
578     dd if=/dev/zero of=${img} count=1 seek=$(( 200 * 1024 * 1024 / 512 ))
579     md=$(mdconfig -f ${img})
580     gpart create -s gpt ${md}
581     gpart add -t efi -s ${espsize}k -a 4k ${md}
582     gpart add -t freebsd-boot -s 400k -a 4k     ${md}   # <= ~540k
583     gpart add -t freebsd-zfs -l root $md
584     # install-boot will make this bootable
585     echo ${passphrase} | geli init -bg -e AES-XTS -i ${iterations} -J - -l 256 -s 4096 ${md}p3
586     echo ${passphrase} | geli attach -j - ${md}p3
587     zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}p3.eli
588     zpool set bootfs=${pool} ${pool}
589     zfs create -po mountpoint=/ ${pool}/ROOT/default
590     # NB: The online guides go nuts customizing /var and other mountpoints here, no need
591     cpsys ${src} ${mntpt}
592     # need to make a couple of tweaks
593     cat > ${mntpt}/boot/loader.conf <<EOF
594 zfs_load=YES
595 opensolaris_load=YES
596 geom_eli_load=YES
597 EOF
598     cp /boot/kernel/acl_nfs4.ko ${mntpt}/boot/kernel/acl_nfs4.ko
599     cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko
600     cp /boot/kernel/opensolaris.ko ${mntpt}/boot/kernel/opensolaris.ko
601     cp /boot/kernel/geom_eli.ko ${mntpt}/boot/kernel/geom_eli.ko
602     # end tweaks
603     zfs umount -f ${pool}/ROOT/default
604     zfs set mountpoint=none ${pool}/ROOT/default
605     zpool set bootfs=${pool}/ROOT/default ${pool}
606     zpool set autoexpand=on ${pool}
607     zpool export ${pool}
608     geli detach ${md}p3
609     ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
610     mdconfig -d -u ${md}
611 }
612
613 # GELI+MBR is not a valid configuration
614 mk_geli_mbr_ufs_legacy() {
615 }
616
617 mk_geli_mbr_ufs_uefi() {
618 }
619
620 mk_geli_mbr_ufs_both() {
621 }
622
623 mk_geli_mbr_zfs_legacy() {
624 }
625
626 mk_geli_mbr_zfs_uefi() {
627 }
628
629 mk_geli_mbr_zfs_both() {
630 }
631
632 # iso
633 # pxeldr
634 # u-boot
635 # powerpc
636
637 mk_sparc64_nogeli_vtoc8_ufs_ofw() {
638     src=$1
639     img=$2
640     mntpt=$3
641     geli=$4
642     scheme=$5
643     fs=$6
644     bios=$7
645
646     cat > ${src}/etc/fstab <<EOF
647 /dev/ada0a      /               ufs     rw      1       1
648 EOF
649     makefs -t ffs -B big -s 200m ${img} ${src}
650     md=$(mdconfig -f ${img})
651     # For non-native builds, ensure that geom_part(4) supports VTOC8.
652     kldload geom_part_vtoc8.ko
653     gpart create -s VTOC8 ${md}
654     gpart add -t freebsd-ufs ${md}
655     ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
656     mdconfig -d -u ${md}
657     rm -f ${src}/etc/fstab
658 }
659
660 qser="-serial telnet::4444,server -nographic"
661
662 # https://wiki.freebsd.org/QemuRecipes
663 # aarch64
664 qemu_aarch64_uefi()
665 {
666     img=$1
667     sh=$2
668
669     echo "qemu-system-aarch64 -m 4096M -cpu cortex-a57 -M virt  \
670         -bios QEMU_EFI.fd ${qser} \
671         -drive if=none,file=${img},id=hd0 \
672         -device virtio-blk-device,drive=hd0" > $sh
673     chmod 755 $sh
674 # https://wiki.freebsd.org/arm64/QEMU also has
675 #       -device virtio-net-device,netdev=net0
676 #       -netdev user,id=net0
677 }
678
679 # Amd64 qemu
680 qemu_amd64_legacy()
681 {
682     img=$1
683     sh=$2
684
685     echo "qemu-system-x86_64 -m 256m --drive file=${img},format=raw ${qser}" > $sh
686     chmod 755 $sh
687 }
688
689 qemu_amd64_uefi()
690 {
691     img=$1
692     sh=$2
693
694     echo "qemu-system-x86_64 -m 256m -bios ~/bios/OVMF-X64.fd --drive file=${img},format=raw ${qser}" > $sh
695     chmod 755 $sh
696 }
697
698 qemu_amd64_both()
699 {
700     img=$1
701     sh=$2
702
703     echo "qemu-system-x86_64 -m 256m --drive file=${img},format=raw ${qser}" > $sh
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 # arm
709 # nothing listed?
710
711 # i386
712 qemu_i386_legacy()
713 {
714     img=$1
715     sh=$2
716
717     echo "qemu-system-i386 --drive file=${img},format=raw ${qser}" > $sh
718     chmod 755 $sh
719 }
720
721 # Not yet supported
722 qemu_i386_uefi()
723 {
724     img=$1
725     sh=$2
726
727     echo "qemu-system-i386 -bios ~/bios/OVMF-X32.fd --drive file=${img},format=raw ${qser}" > $sh
728     chmod 755 $sh
729 }
730
731 # Needs UEFI to be supported
732 qemu_i386_both()
733 {
734     img=$1
735     sh=$2
736
737     echo "qemu-system-i386 --drive file=${img},format=raw ${qser}" > $sh
738     echo "qemu-system-i386 -bios ~/bios/OVMF-X32.fd --drive file=${img},format=raw ${qser}" >> $sh
739     chmod 755 $sh
740 }
741
742 make_one_image()
743 {
744     local arch=${1?}
745     local geli=${2?}
746     local scheme=${3?}
747     local fs=${4?}
748     local bios=${5?}
749
750     # Create sparse file and mount newly created filesystem(s) on it
751     img=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.img
752     sh=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.sh
753     echo "vvvvvvvvvvvvvv   Creating $img  vvvvvvvvvvvvvvv"
754     rm -f ${img}*
755     eval mk_${geli}_${scheme}_${fs}_${bios} ${DESTDIR} ${img} ${MNTPT} ${geli} ${scheme} ${fs} ${bios}
756     eval qemu_${arch}_${bios} ${img} ${sh}
757     [ -n "${SUDO_USER}" ] && chown ${SUDO_USER} ${img}*
758     echo "^^^^^^^^^^^^^^   Created $img   ^^^^^^^^^^^^^^^"
759 }
760
761 # mips
762 # qemu-system-mips -kernel /path/to/rootfs/boot/kernel/kernel -nographic -hda /path/to/disk.img -m 2048
763
764 # Powerpc -- doesn't work but maybe it would enough for testing -- needs details
765 # powerpc64
766 # qemu-system-ppc64 -drive file=/path/to/disk.img,format=raw
767
768 # sparc64
769 # qemu-system-sparc64 -drive file=/path/to/disk.img,format=raw
770
771 # Misc variables
772 SRCTOP=$(make -v SRCTOP)
773 cd ${SRCTOP}/stand
774 OBJDIR=$(make -v .OBJDIR)
775 IMGDIR=${OBJDIR}/boot-images
776 mkdir -p ${IMGDIR}
777 MNTPT=$(mktemp -d /tmp/stand-test.XXXXXX)
778
779 # Setup the installed tree...
780 DESTDIR=${OBJDIR}/boot-tree
781 rm -rf ${DESTDIR}
782 mkdir -p ${DESTDIR}/boot/defaults
783 mkdir -p ${DESTDIR}/boot/kernel
784 cp /boot/kernel/kernel ${DESTDIR}/boot/kernel
785 echo -h -D -S115200 > ${DESTDIR}/boot.config
786 cat > ${DESTDIR}/boot/loader.conf <<EOF
787 console=comconsole
788 comconsole_speed=115200
789 boot_serial=yes
790 boot_multicons=yes
791 EOF
792 # XXX
793 cp /boot/device.hints ${DESTDIR}/boot/device.hints
794 # Assume we're already built
795 make install DESTDIR=${DESTDIR} MK_MAN=no MK_INSTALL_AS_USER=yes WITHOUT_DEBUG_FILES=yes
796 if [ $? -ne 0 ]; then
797         echo "make install failed"
798         exit 1
799 fi
800 # Copy init, /bin/sh, minimal libraries and testing /etc/rc
801 mkdir -p ${DESTDIR}/sbin ${DESTDIR}/bin \
802       ${DESTDIR}/lib ${DESTDIR}/libexec \
803       ${DESTDIR}/etc ${DESTDIR}/dev
804 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
805     cp $f ${DESTDIR}/$f
806 done
807 cat > ${DESTDIR}/etc/rc <<EOF
808 #!/bin/sh
809
810 sysctl machdep.bootmethod
811 echo "RC COMMAND RUNNING -- SUCCESS!!!!!"
812 halt -p
813 EOF
814
815 # If we were given exactly 5 args, go make that one image.
816
817 if [ $# -eq 5 ]; then
818     make_one_image $*
819     exit
820 fi
821
822 # OK. Let the games begin
823
824 for arch in amd64; do
825     for geli in nogeli geli; do
826         for scheme in gpt mbr; do
827             for fs in ufs zfs; do
828                 for bios in legacy uefi both; do
829                     make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
830                 done
831             done
832         done
833     done
834 done
835
836 rmdir ${MNTPT}
837
838 exit 0
839
840 # Notes for the future
841
842 for arch in i386; do
843     for geli in nogeli geli; do
844         for scheme in gpt mbr; do
845             for fs in ufs zfs; do
846                 for bios in legacy; do
847                     make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
848                 done
849             done
850         done
851     done
852 done
853
854 for arch in arm aarch64; do
855     for scheme in gpt mbr; do
856         fs=ufs
857         for bios in uboot efi; do
858             make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
859         done
860     done
861 done
862
863 for arch in powerpc powerpc64; do
864     for scheme in ppc-wtf; do
865         fs=ufs
866         for bios in ofw uboot chrp; do
867             make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
868         done
869     done
870 done
871
872 for arch in sparc64; do
873     for geli in nogeli; do
874         for scheme in vtoc8; do
875             for fs in ufs; do
876                 for bios in ofw; do
877                     make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
878                 done
879             done
880         done
881     done
882 done