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