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