diff --git a/tools/boot/rootgen.sh b/tools/boot/rootgen.sh new file mode 100755 index 00000000000..42aa4013b07 --- /dev/null +++ b/tools/boot/rootgen.sh @@ -0,0 +1,213 @@ +#!/bin/sh + +# $FreeBSD$ + +# +# 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 -) +} + +mk_nogeli_gpt_ufs_legacy() { + src=$1 + img=$2 + + rm -f ${img} ${img}.p2 + makefs -t ffs -B little -s 200m ${img}.p2 ${src} + mkimg -s gpt -b ${src}/boot/pmbr \ + -p freebsd-boot:=${src}/boot/gptboot \ + -p freebsd-ufs:=${img}.p2 -o ${img} +} + +mk_nogeli_gpt_ufs_uefi() { + src=$1 + img=$2 + + rm -f ${img} ${img}.p2 + makefs -t ffs -B little -s 200m ${img}.p2 ${src} + mkimg -s gpt -b ${src}/boot/pmbr \ + -p freebsd-boot:=${src}/boot/gptboot \ + -p freebsd-ufs:=${img}.p2 -o ${img} +} + +mk_nogeli_gpt_ufs_both() { + src=$1 + img=$2 + + makefs -t ffs -B little -s 200m ${img}.p3 ${src} + # p1 is boot for uefi, p2 is boot for gpt, p3 is / + mkimg -b ${src}/boot/pmbr -s gpt \ + -p efi:=${src}/boot/boot1.efifat \ + -p freebsd-boot:=${src}/boot/gptboot \ + -p freebsd-ufs:=${img}.p3 \ + -o ${img} +} + +mk_nogeli_gpt_zfs_legacy() { + src=$1 + img=$2 + mntpt=$3 + geli=$4 + scheme=$5 + fs=$6 + bios=$7 + pool=nogeli-gpt-zfs-legacy + + rm -f ${img} + dd if=/dev/zero of=${img} count=1 seek=$((200 * 1024 * 1024 / 512)) + md=$(mdconfig -f ${img}) + gpart create -s gpt ${md} + gpart add -t freebsd-boot -s 400k -a 4k ${md} # <= ~540k + gpart add -t freebsd-zfs -l root $md + # install-boot will make this bootable + zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}p2 + zpool set bootfs=${pool} ${pool} + zfs create -o mountpoint=/ ${pool}/ROOT + # NB: The online guides go nuts customizing /var and other mountpoints here, no need + cpsys ${src} ${mntpt} + df + # need to make a couple of tweaks + cat > ${mntpt}/boot/loader.conf < ${DESTDIR}/boot.config +# XXX +cp /boot/device.hints ${DESTDIR}/boot/device.hints +# Assume we're already built +make install DESTDIR=${DESTDIR} MK_MAN=no MK_INSTALL_AS_USER=yes +# Copy init, /bin/sh and minimal libraries +mkdir -p ${DESTDIR}/sbin ${DESTDIR}/bin ${DESTDIR}/lib ${DESTDIR}/libexec +for f in /sbin/init /bin/sh $(ldd /bin/sh | awk 'NF == 4 { print $3; }') /libexec/ld-elf.so.1; do + cp $f ${DESTDIR}/$f +done +mkdir ${DESTDIR}/dev + +# OK. Let the games begin + +for geli in nogeli geli; do + for scheme in gpt mbr; do + for fs in ufs zfs; do + for bios in legacy uefi both; do + # Create sparse file and mount newly created filesystem(s) on it + img=${IMGDIR}/${geli}-${scheme}-${fs}-${bios}.img + echo "vvvvvvvvvvvvvvvvvvvvvv Creating $img vvvvvvvvvvvvvvvvvvvvvvv" + eval mk_${geli}_${scheme}_${fs}_${bios} ${DESTDIR} ${img} ${MNTPT} ${geli} ${scheme} ${fs} ${bios} + echo "^^^^^^^^^^^^^^^^^^^^^^ Creating $img ^^^^^^^^^^^^^^^^^^^^^^^" + done + done + done +done + +rmdir ${MNTPT}