1#!/bin/sh 2 3passphrase=passphrase 4iterations=50000 5 6# The smallest FAT32 filesystem is 33292 KB 7espsize=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 27cpsys() { 28 src=$1 29 dst=$2 30 31 # Copy kernel + boot loader 32 (cd $src ; tar cf - .) | (cd $dst; tar xf -) 33} 34 35ufs_fstab() { 36 dir=$1 37 38 cat > ${dir}/etc/fstab <<EOF 39/dev/ufs/root / ufs rw 1 1 40EOF 41} 42 43mk_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 55mk_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 68mk_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 85zfs_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 93cryptodev_load=YES 94zfs_load=YES 95EOF 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 101mk_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 123mk_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 146mk_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 170mk_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 181mk_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 193mk_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 205mk_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 225mk_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 247geom_eli_load=YES 248EOF 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 259mk_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 281geom_eli_load=YES 282EOF 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 293mk_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 316geom_eli_load=YES 317EOF 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 328mk_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 358cryptodev_load=YES 359zfs_load=YES 360geom_eli_load=YES 361EOF 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 377mk_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 407cryptodev_load=YES 408zfs_load=YES 409geom_eli_load=YES 410EOF 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 426mk_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 452cryptodev_load=YES 453zfs_load=YES 454geom_eli_load=YES 455EOF 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 472mk_geli_mbr_ufs_legacy() { 473} 474 475mk_geli_mbr_ufs_uefi() { 476} 477 478mk_geli_mbr_ufs_both() { 479} 480 481mk_geli_mbr_zfs_legacy() { 482} 483 484mk_geli_mbr_zfs_uefi() { 485} 486 487mk_geli_mbr_zfs_both() { 488} 489 490# iso 491# pxeldr 492# u-boot 493# powerpc 494 495qser="-monitor telnet::4444,server,nowait -serial stdio -nographic" 496 497# https://wiki.freebsd.org/QemuRecipes 498# aarch64 499qemu_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 514log_for() 515{ 516 dir=$(dirname $1) 517 fn=$(basename $1 .sh) 518 echo $dir/$fn.log 519} 520 521# Amd64 qemu 522qemu_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 533qemu_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 544qemu_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 561qemu_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 571qemu_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 581qemu_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 591make_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 617SRCTOP=$(make -v SRCTOP) 618cd ${SRCTOP}/stand 619OBJDIR=$(make -v .OBJDIR) 620IMGDIR=${OBJDIR}/boot-images 621mkdir -p ${IMGDIR} 622MNTPT=$(mktemp -d /tmp/stand-test.XXXXXX) 623 624# Setup the installed tree... 625DESTDIR=${OBJDIR}/boot-tree 626rm -rf ${DESTDIR} 627mkdir -p ${DESTDIR}/boot/defaults 628mkdir -p ${DESTDIR}/boot/kernel 629cp /boot/kernel/kernel ${DESTDIR}/boot/kernel 630echo -h -D -S115200 > ${DESTDIR}/boot.config 631cat > ${DESTDIR}/boot/loader.conf <<EOF 632comconsole_speed=115200 633autoboot_delay=0 634EOF 635# XXX 636cp /boot/device.hints ${DESTDIR}/boot/device.hints 637# Assume we're already built 638make install DESTDIR=${DESTDIR} MK_MAN=no MK_INSTALL_AS_USER=yes WITHOUT_DEBUG_FILES=yes 639if [ $? -ne 0 ]; then 640 echo "make install failed" 641 exit 1 642fi 643# Copy init, /bin/sh, minimal libraries and testing /etc/rc 644mkdir -p ${DESTDIR}/sbin ${DESTDIR}/bin \ 645 ${DESTDIR}/lib ${DESTDIR}/libexec \ 646 ${DESTDIR}/etc ${DESTDIR}/dev 647for 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 649done 650cat > ${DESTDIR}/etc/rc <<EOF 651#!/bin/sh 652 653sysctl machdep.bootmethod 654echo "RC COMMAND RUNNING -- SUCCESS!!!!!" 655halt -p 656EOF 657 658# If we were given exactly 5 args, go make that one image. 659 660rm -f ${IMGDIR}/all.sh 661echo date > ${IMGDIR}/all.sh 662chmod +x ${IMGDIR}/all.sh 663 664if [ $# -eq 5 ]; then 665 make_one_image $* 666 echo ${IMGDIR}/all.sh 667 exit 668fi 669 670# OK. Let the games begin 671 672for 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 686done 687 # We should also do a cd image for amd64 here 688echo ${IMGDIR}/all.sh 689 690rmdir ${MNTPT} 691 692exit 0 693 694# Notes for the future 695 696for 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 713done 714 # We should also do a cd image for i386 here 715 716for 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 724done 725 726# It's not clear that the nested looping paradigm is best for powerpc 727# due to its diversity. 728for 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 736done 737 738for 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} 744done 745