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