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