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