1#!/bin/sh 2 3# $FreeBSD$ 4 5# 6# Builds all the bat-shit crazy combinations we support booting from, 7# at least for amd64. It assume you have a ~sane kernel in /boot/kernel 8# and copies that into the ~150MB root images we create (we create the du 9# size of the kernel + 20MB 10# 11# Sad panda sez: this runs as root, but could be userland if someone 12# creates userland geli and zfs tools. 13# 14# This assumes an external prograam install-boot.sh which will install 15# the appropriate boot files in the appropriate locations. 16# 17# These images assume ada0 will be the root image. We should likely 18# use labels, but we don't. 19# 20# ASsumes you've already rebuilt... maybe bad? Also maybe bad: the env 21# vars should likely be conditionally set to allow better automation. 22# 23 24cpsys() { 25 src=$1 26 dst=$2 27 28 # Copy kernel + boot loader 29 (cd $src ; tar cf - .) | (cd $dst; tar xf -) 30} 31 32mk_nogeli_gpt_ufs_legacy() { 33 src=$1 34 img=$2 35 36 rm -f ${img} ${img}.p2 37 makefs -t ffs -B little -s 200m ${img}.p2 ${src} 38 mkimg -s gpt -b ${src}/boot/pmbr \ 39 -p freebsd-boot:=${src}/boot/gptboot \ 40 -p freebsd-ufs:=${img}.p2 -o ${img} 41} 42 43mk_nogeli_gpt_ufs_uefi() { 44 src=$1 45 img=$2 46 47 rm -f ${img} ${img}.p2 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} 53 54mk_nogeli_gpt_ufs_both() { 55 src=$1 56 img=$2 57 58 makefs -t ffs -B little -s 200m ${img}.p3 ${src} 59 # p1 is boot for uefi, p2 is boot for gpt, p3 is / 60 mkimg -b ${src}/boot/pmbr -s gpt \ 61 -p efi:=${src}/boot/boot1.efifat \ 62 -p freebsd-boot:=${src}/boot/gptboot \ 63 -p freebsd-ufs:=${img}.p3 \ 64 -o ${img} 65} 66 67mk_nogeli_gpt_zfs_legacy() { 68 src=$1 69 img=$2 70 mntpt=$3 71 geli=$4 72 scheme=$5 73 fs=$6 74 bios=$7 75 pool=nogeli-gpt-zfs-legacy 76 77 rm -f ${img} 78 dd if=/dev/zero of=${img} count=1 seek=$((200 * 1024 * 1024 / 512)) 79 md=$(mdconfig -f ${img}) 80 gpart create -s gpt ${md} 81 gpart add -t freebsd-boot -s 400k -a 4k ${md} # <= ~540k 82 gpart add -t freebsd-zfs -l root $md 83 # install-boot will make this bootable 84 zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}p2 85 zpool set bootfs=${pool} ${pool} 86 zfs create -o mountpoint=/ ${pool}/ROOT 87 # NB: The online guides go nuts customizing /var and other mountpoints here, no need 88 cpsys ${src} ${mntpt} 89 df 90 # need to make a couple of tweaks 91 cat > ${mntpt}/boot/loader.conf <<EOF 92zfs_load=YES 93opensolaris_load=YES 94EOF 95 cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko 96 cp /boot/kernel/opensolaris.ko ${mntpt}/boot/kernel/opensolaris.ko 97 ls -las ${mntpt}/boot 98 # end tweaks 99 zfs umount -f ${pool}/ROOT 100 zfs set mountpoint=none ${pool}/ROOT 101 zpool set bootfs=${pool}/ROOT ${pool} 102 zpool set autoexpand=on ${pool} 103 zpool export ${pool} 104 ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md} 105 mdconfig -d -u ${md} 106} 107 108mk_nogeli_gpt_zfs_uefi() { 109} 110 111mk_nogeli_gpt_zfs_both() { 112} 113 114mk_nogeli_mbr_ufs_legacy() { 115} 116 117mk_nogeli_mbr_ufs_uefi() { 118} 119 120mk_nogeli_mbr_ufs_both() { 121} 122 123mk_nogeli_mbr_zfs_legacy() { 124} 125 126mk_nogeli_mbr_zfs_uefi() { 127} 128 129mk_nogeli_mbr_zfs_both() { 130} 131 132mk_geli_gpt_ufs_legacy() { 133} 134 135mk_geli_gpt_ufs_uefi() { 136} 137 138mk_geli_gpt_ufs_both() { 139} 140 141mk_geli_gpt_zfs_legacy() { 142} 143 144mk_geli_gpt_zfs_uefi() { 145} 146 147mk_geli_gpt_zfs_both() { 148} 149 150mk_geli_mbr_ufs_legacy() { 151} 152 153mk_geli_mbr_ufs_uefi() { 154} 155 156mk_geli_mbr_ufs_both() { 157} 158 159mk_geli_mbr_zfs_legacy() { 160} 161 162mk_geli_mbr_zfs_uefi() { 163} 164 165mk_geli_mbr_zfs_both() { 166} 167 168# iso 169# pxeldr 170# u-boot 171 172# Misc variables 173SRCTOP=$(make -v SRCTOP) 174cd ${SRCTOP}/stand 175OBJDIR=$(make -v .OBJDIR) 176IMGDIR=${OBJDIR}/boot-images 177mkdir -p ${IMGDIR} 178MNTPT=$(mktemp -d /tmp/stand-test.XXXXXX) 179 180# Setup the installed tree... 181DESTDIR=${OBJDIR}/boot-tree 182rm -rf ${DESTDIR} 183mkdir -p ${DESTDIR}/boot/defaults 184mkdir -p ${DESTDIR}/boot/kernel 185cp /boot/kernel/kernel ${DESTDIR}/boot/kernel 186echo -h -D -S115200 > ${DESTDIR}/boot.config 187# XXX 188cp /boot/device.hints ${DESTDIR}/boot/device.hints 189# Assume we're already built 190make install DESTDIR=${DESTDIR} MK_MAN=no MK_INSTALL_AS_USER=yes 191# Copy init, /bin/sh and minimal libraries 192mkdir -p ${DESTDIR}/sbin ${DESTDIR}/bin ${DESTDIR}/lib ${DESTDIR}/libexec 193for f in /sbin/init /bin/sh $(ldd /bin/sh | awk 'NF == 4 { print $3; }') /libexec/ld-elf.so.1; do 194 cp $f ${DESTDIR}/$f 195done 196mkdir ${DESTDIR}/dev 197 198# OK. Let the games begin 199 200for geli in nogeli geli; do 201 for scheme in gpt mbr; do 202 for fs in ufs zfs; do 203 for bios in legacy uefi both; do 204 # Create sparse file and mount newly created filesystem(s) on it 205 img=${IMGDIR}/${geli}-${scheme}-${fs}-${bios}.img 206 echo "vvvvvvvvvvvvvvvvvvvvvv Creating $img vvvvvvvvvvvvvvvvvvvvvvv" 207 eval mk_${geli}_${scheme}_${fs}_${bios} ${DESTDIR} ${img} ${MNTPT} ${geli} ${scheme} ${fs} ${bios} 208 echo "^^^^^^^^^^^^^^^^^^^^^^ Creating $img ^^^^^^^^^^^^^^^^^^^^^^^" 209 done 210 done 211 done 212done 213 214rmdir ${MNTPT} 215