Index: head/tools/boot/install-boot.sh =================================================================== --- head/tools/boot/install-boot.sh (revision 336240) +++ head/tools/boot/install-boot.sh (revision 336241) @@ -1,270 +1,267 @@ #!/bin/sh # $FreeBSD$ # # Installs/updates the necessary boot blocks for the desired boot environment # # Lightly tested.. Intended to be installed, but until it matures, it will just # be a boot tool for regression testing. # insert code here to guess what you have -- yikes! die() { echo $* exit 1 } doit() { echo $* eval $* } find-part() { dev=$1 part=$2 gpart show $dev | tail +2 | awk '$4 == "'$part'" { print $3; }' } make_esp() { local dev dst mntpt dev=$1 dst=$2 newfs_msdos -a 32 ${dev} mntpt=$(mktemp -d /tmp/stand-test.XXXXXX) mount -t msdos ${dev} ${mntpt} mkdir -p ${mntpt}/efi/boot cp ${dst}/boot/loader.efi ${mntpt}/efi/boot/bootx64.efi umount ${mntpt} rmdir ${mntpt} } make_esp_mbr() { dev=$1 dst=$2 s=$(find-part $dev "!239") if [ -z "$s" ] ; then - s=$(find-part $dev "efi") - if [ -z "$s" ] ; then - die "No ESP slice found" - fi + die "No ESP slice found" fi make_esp /dev/${dev}s${s} ${dst} } make_esp_gpt() { dev=$1 dst=$2 idx=$(find-part $dev "efi") if [ -z "$idx" ] ; then die "No ESP partition found" fi make_esp /dev/${dev}p${idx} ${dst} } boot_nogeli_gpt_ufs_legacy() { dev=$1 dst=$2 idx=$(find-part $dev "freebsd-boot") if [ -z "$idx" ] ; then die "No freebsd-boot partition found" fi doit gpart bootcode -b ${gpt0} -p ${gpt2} -i $idx $dev } boot_nogeli_gpt_ufs_uefi() { make_esp_gpt $1 $2 } boot_nogeli_gpt_ufs_both() { boot_nogeli_gpt_ufs_legacy $1 $2 $3 boot_nogeli_gpt_ufs_uefi $1 $2 $3 } boot_nogeli_gpt_zfs_legacy() { dev=$1 dst=$2 idx=$(find-part $dev "freebsd-boot") if [ -z "$idx" ] ; then die "No freebsd-boot partition found" fi doit gpart bootcode -b ${gpt0} -p ${gptzfs2} -i $idx $dev } boot_nogeli_gpt_zfs_uefi() { make_esp_gpt $1 $2 } boot_nogeli_gpt_zfs_both() { boot_nogeli_gpt_zfs_legacy $1 $2 $3 boot_nogeli_gpt_zfs_uefi $1 $2 $3 } boot_nogeli_mbr_ufs_legacy() { dev=$1 dst=$2 doit gpart bootcode -b ${mbr0} ${dev} s=$(find-part $dev "freebsd") if [ -z "$s" ] ; then die "No freebsd slice found" fi doit gpart bootcode -p ${mbr2} ${dev}s${s} } boot_nogeli_mbr_ufs_uefi() { make_esp_mbr $1 $2 } boot_nogeli_mbr_ufs_both() { boot_nogeli_mbr_ufs_legacy $1 $2 $3 boot_nogeli_mbr_ufs_uefi $1 $2 $3 } boot_nogeli_mbr_zfs_legacy() { dev=$1 dst=$2 # search to find the BSD slice s=$(find-part $dev "freebsd") if [ -z "$s" ] ; then die "No BSD slice found" fi idx=$(find-part ${dev}s${s} "freebsd-zfs") if [ -z "$idx" ] ; then die "No freebsd-zfs slice found" fi # search to find the freebsd-zfs partition within the slice # Or just assume it is 'a' because it has to be since it fails otherwise doit gpart bootcode -b ${dst}/boot/mbr ${dev} dd if=${dst}/boot/zfsboot of=/tmp/zfsboot1 count=1 doit gpart bootcode -b /tmp/zfsboot1 ${dev}s${s} # Put boot1 into the start of part sysctl kern.geom.debugflags=0x10 # Put boot2 into ZFS boot slot doit dd if=${dst}/boot/zfsboot of=/dev/${dev}s${s}a skip=1 seek=1024 sysctl kern.geom.debugflags=0x0 } boot_nogeli_mbr_zfs_uefi() { - make_esp_mbr $1 $2 + make_eps_mbr $1 $2 } boot_nogeli_mbr_zfs_both() { boot_nogeli_mbr_zfs_legacy $1 $2 $3 boot_nogeli_mbr_zfs_uefi $1 $2 $3 } boot_geli_gpt_ufs_legacy() { boot_nogeli_gpt_ufs_legacy $1 $2 $3 } boot_geli_gpt_ufs_uefi() { boot_nogeli_gpt_ufs_uefi $1 $2 $3 } boot_geli_gpt_ufs_both() { boot_nogeli_gpt_ufs_both $1 $2 $3 } boot_geli_gpt_zfs_legacy() { boot_nogeli_gpt_zfs_legacy $1 $2 $3 } boot_geli_gpt_zfs_uefi() { boot_nogeli_gpt_zfs_uefi $1 $2 $3 } boot_geli_gpt_zfs_both() { boot_nogeli_gpt_zfs_both $1 $2 $3 } # GELI+MBR is not a valid configuration boot_geli_mbr_ufs_legacy() { exit 1 } boot_geli_mbr_ufs_uefi() { exit 1 } boot_geli_mbr_ufs_both() { exit 1 } boot_geli_mbr_zfs_legacy() { exit 1 } boot_geli_mbr_zfs_uefi() { exit 1 } boot_geli_mbr_zfs_both() { exit 1 } boot_nogeli_vtoc8_ufs_ofw() { dev=$1 dst=$2 # For non-native builds, ensure that geom_part(4) supports VTOC8. kldload geom_part_vtoc8.ko doit gpart bootcode -p ${vtoc8} ${dev} } DESTDIR=/ # Note: we really don't support geli boot in this script yet. geli=nogeli while getopts "b:d:f:g:o:s:" opt; do case "$opt" in b) bios=${OPTARG} ;; d) DESTDIR=${OPTARG} ;; f) fs=${OPTARG} ;; g) case ${OPTARG} in [Yy][Ee][Ss]|geli) geli=geli ;; *) geli=nogeli ;; esac ;; o) opts=${OPTARG} ;; s) scheme=${OPTARG} ;; esac done shift $((OPTIND-1)) dev=$1 # For gpt, we need to install pmbr as the primary boot loader # it knows about gpt0=${DESTDIR}/boot/pmbr gpt2=${DESTDIR}/boot/gptboot gptzfs2=${DESTDIR}/boot/gptzfsboot # For MBR, we have lots of choices, but select mbr, boot0 has issues with UEFI mbr0=${DESTDIR}/boot/mbr mbr2=${DESTDIR}/boot/boot # VTOC8 vtoc8=${DESTDIR}/boot/boot1 # sanity check here eval boot_${geli}_${scheme}_${fs}_${bios} $dev $DESTDIR $opts || echo "Unsupported boot env: ${geli}-${scheme}-${fs}-${bios}" Index: head/tools/boot/rootgen.sh =================================================================== --- head/tools/boot/rootgen.sh (revision 336240) +++ head/tools/boot/rootgen.sh (revision 336241) @@ -1,890 +1,883 @@ #!/bin/sh # $FreeBSD$ -passphrase=x -iterations=5 +passphrase=passphrase +iterations=50000 do_boot1_efi=0 # # Builds all the bat-shit crazy combinations we support booting from, # at least for amd64. It assume you have a ~sane kernel in /boot/kernel # and copies that into the ~150MB root images we create (we create the du # size of the kernel + 20MB # # Sad panda sez: this runs as root, but could be userland if someone # creates userland geli and zfs tools. # # This assumes an external prograam install-boot.sh which will install # the appropriate boot files in the appropriate locations. # # These images assume ada0 will be the root image. We should likely # use labels, but we don't. # # ASsumes you've already rebuilt... maybe bad? Also maybe bad: the env # vars should likely be conditionally set to allow better automation. # cpsys() { src=$1 dst=$2 # Copy kernel + boot loader (cd $src ; tar cf - .) | (cd $dst; tar xf -) } make_esp() { local src dst md mntpt src=$1 dst=$2 if [ "${do_boot1_efi}" -eq 1 ]; then cp ${src}/boot/boot1.efifat ${dst} else dd if=/dev/zero of=${dst} count=1 seek=$((100 * 1024 * 1024 / 512)) md=$(mdconfig -f ${dst}) newfs_msdos -a 32 /dev/${md} mntpt=$(mktemp -d /tmp/stand-test.XXXXXX) mount -t msdos /dev/${md} ${mntpt} # mkdir -p ${mntpt}/efi/freebsd # not yet mkdir -p ${mntpt}/efi/boot cp ${src}/boot/loader.efi ${mntpt}/efi/boot/bootx64.efi umount ${mntpt} rmdir ${mntpt} mdconfig -d -u ${md} fi } mk_nogeli_gpt_ufs_legacy() { src=$1 img=$2 cat > ${src}/etc/fstab < ${src}/etc/fstab < ${src}/etc/fstab <> ${mntpt}/boot/loader.conf <> ${mntpt}/boot/loader.conf <> ${mntpt}/boot/loader.conf < ${src}/etc/fstab < ${src}/etc/fstab < ${src}/etc/fstab <> ${mntpt}/boot/loader.conf <> ${mntpt}/boot/loader.conf <> ${mntpt}/boot/loader.conf < ${mntpt}/boot/loader.conf < ${mntpt}/etc/fstab < ${mntpt}/boot/loader.conf < ${mntpt}/etc/fstab < ${mntpt}/boot/loader.conf < ${mntpt}/etc/fstab <> ${mntpt}/boot/loader.conf <> ${mntpt}/boot/loader.conf < ${mntpt}/boot/loader.conf < ${src}/etc/fstab < $sh - chmod 755 $sh # https://wiki.freebsd.org/arm64/QEMU also has # -device virtio-net-device,netdev=net0 # -netdev user,id=net0 } # Amd64 qemu qemu_amd64_legacy() { img=$1 sh=$2 echo "qemu-system-x86_64 -m 256m --drive file=${img},format=raw ${qser}" > $sh - chmod 755 $sh } qemu_amd64_uefi() { img=$1 sh=$2 echo "qemu-system-x86_64 -m 256m -bios ~/bios/OVMF-X64.fd --drive file=${img},format=raw ${qser}" > $sh - chmod 755 $sh } qemu_amd64_both() { img=$1 sh=$2 echo "qemu-system-x86_64 -m 256m --drive file=${img},format=raw ${qser}" > $sh echo "qemu-system-x86_64 -m 256m -bios ~/bios/OVMF-X64.fd --drive file=${img},format=raw ${qser}" >> $sh - chmod 755 $sh } # arm # nothing listed? # i386 qemu_i386_legacy() { img=$1 sh=$2 echo "qemu-system-i386 --drive file=${img},format=raw ${qser}" > $sh - chmod 755 $sh } # Not yet supported qemu_i386_uefi() { img=$1 sh=$2 echo "qemu-system-i386 -bios ~/bios/OVMF-X32.fd --drive file=${img},format=raw ${qser}" > $sh - chmod 755 $sh } # Needs UEFI to be supported qemu_i386_both() { img=$1 sh=$2 echo "qemu-system-i386 --drive file=${img},format=raw ${qser}" > $sh echo "qemu-system-i386 -bios ~/bios/OVMF-X32.fd --drive file=${img},format=raw ${qser}" >> $sh - chmod 755 $sh } make_one_image() { local arch=${1?} local geli=${2?} local scheme=${3?} local fs=${4?} local bios=${5?} # Create sparse file and mount newly created filesystem(s) on it img=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.img sh=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.sh echo "vvvvvvvvvvvvvv Creating $img vvvvvvvvvvvvvvv" rm -f ${img}* eval mk_${geli}_${scheme}_${fs}_${bios} ${DESTDIR} ${img} ${MNTPT} ${geli} ${scheme} ${fs} ${bios} eval qemu_${arch}_${bios} ${img} ${sh} [ -n "${SUDO_USER}" ] && chown ${SUDO_USER} ${img}* echo "^^^^^^^^^^^^^^ Created $img ^^^^^^^^^^^^^^^" } # mips # qemu-system-mips -kernel /path/to/rootfs/boot/kernel/kernel -nographic -hda /path/to/disk.img -m 2048 # Powerpc -- doesn't work but maybe it would enough for testing -- needs details # powerpc64 # qemu-system-ppc64 -drive file=/path/to/disk.img,format=raw # sparc64 # qemu-system-sparc64 -drive file=/path/to/disk.img,format=raw # Misc variables SRCTOP=$(make -v SRCTOP) cd ${SRCTOP}/stand OBJDIR=$(make -v .OBJDIR) IMGDIR=${OBJDIR}/boot-images mkdir -p ${IMGDIR} MNTPT=$(mktemp -d /tmp/stand-test.XXXXXX) # Setup the installed tree... DESTDIR=${OBJDIR}/boot-tree rm -rf ${DESTDIR} mkdir -p ${DESTDIR}/boot/defaults mkdir -p ${DESTDIR}/boot/kernel # XXX boot1 exists only on sparc64 cp /boot/boot1 ${DESTDIR}/boot cp /boot/kernel/kernel ${DESTDIR}/boot/kernel echo -h -D -S115200 > ${DESTDIR}/boot.config cat > ${DESTDIR}/boot/loader.conf < ${DESTDIR}/etc/rc <