#!/bin/sh
passphrase=passphrase
iterations=50000
espsize=33292
. $(dirname $0)/install-boot.sh
cpsys() {
src=$1
dst=$2
(cd $src ; tar cf - .) | (cd $dst; tar xf -)
}
ufs_fstab() {
dir=$1
cat > ${dir}/etc/fstab <<EOF
/dev/ufs/root / ufs rw 1 1
EOF
}
mk_nogeli_gpt_ufs_legacy() {
src=$1
img=$2
ufs_fstab ${src}
makefs -t ffs -B little -s 200m -o label=root ${img}.p2 ${src}
mkimg -s gpt -b ${src}/boot/pmbr \
-p freebsd-boot:=${src}/boot/gptboot \
-p freebsd-ufs:=${img}.p2 -o ${img}
rm -f ${src}/etc/fstab
}
mk_nogeli_gpt_ufs_uefi() {
src=$1
img=$2
ufs_fstab ${src}
make_esp_file ${img}.p1 ${espsize} ${src}/boot/loader.efi
makefs -t ffs -B little -s 200m -o label=root ${img}.p2 ${src}
mkimg -s gpt \
-p efi:=${img}.p1 \
-p freebsd-ufs:=${img}.p2 -o ${img}
rm -f ${src}/etc/fstab
}
mk_nogeli_gpt_ufs_both() {
src=$1
img=$2
ufs_fstab ${src}
make_esp_file ${img}.p1 ${espsize} ${src}/boot/loader.efi
makefs -t ffs -B little -s 200m -o label=root ${img}.p3 ${src}
mkimg -b ${src}/boot/pmbr -s gpt \
-p efi:=${img}.p1 \
-p freebsd-boot:=${src}/boot/gptboot \
-p freebsd-ufs:=${img}.p3 \
-o ${img}
rm -f ${src}/etc/fstab
}
zfs_extra()
{
src=$1
dst=$2
mkdir -p $dst
mkdir -p $dst/boot/kernel
cat > ${dst}/boot/loader.conf.local <<EOF
cryptodev_load=YES
zfs_load=YES
EOF
cp /boot/kernel/acl_nfs4.ko ${dst}/boot/kernel/acl_nfs4.ko
cp /boot/kernel/cryptodev.ko ${dst}/boot/kernel/cryptodev.ko
cp /boot/kernel/zfs.ko ${dst}/boot/kernel/zfs.ko
}
mk_nogeli_gpt_zfs_legacy() {
src=$1
img=$2
mntpt=$3
geli=$4
scheme=$5
fs=$6
bios=$7
pool=nogeli-gpt-zfs-legacy
dst=$img.extra
zfs_extra $src $dst
makefs -t zfs -s 200m \
-o poolname=${pool} -o bootfs=${pool} -o rootpath=/ \
${img}.p2 ${src} ${dst}
mkimg -b ${src}/boot/pmbr -s gpt \
-p freebsd-boot:=/boot/gptzfsboot \
-p freebsd-zfs:=${img}.p2 \
-o ${img}
rm -rf ${dst}
}
mk_nogeli_gpt_zfs_uefi() {
src=$1
img=$2
mntpt=$3
geli=$4
scheme=$5
fs=$6
bios=$7
pool=nogeli-gpt-zfs-uefi
dst=$img.extra
zfs_extra $src $dst
make_esp_file ${img}.p1 ${espsize} ${src}/boot/loader.efi
makefs -t zfs -s 200m \
-o poolname=${pool} -o bootfs=${pool} -o rootpath=/ \
${img}.p2 ${src} ${dst}
mkimg -b ${src}/boot/pmbr -s gpt \
-p efi:=${img}.p1 \
-p freebsd-zfs:=${img}.p2 \
-o ${img}
rm -rf ${dst}
}
mk_nogeli_gpt_zfs_both() {
src=$1
img=$2
mntpt=$3
geli=$4
scheme=$5
fs=$6
bios=$7
pool=nogeli-gpt-zfs-both
dst=$img.extra
zfs_extra $src $dst
make_esp_file ${img}.p2 ${espsize} ${src}/boot/loader.efi
makefs -t zfs -s 200m \
-o poolname=${pool} -o bootfs=${pool} -o rootpath=/ \
${img}.p3 ${src} ${dst}
mkimg -b ${src}/boot/pmbr -s gpt \
-p freebsd-boot:=/boot/gptzfsboot \
-p efi:=${img}.p2 \
-p freebsd-zfs:=${img}.p3 \
-o ${img}
rm -rf ${dst}
}
mk_nogeli_mbr_ufs_legacy() {
src=$1
img=$2
ufs_fstab ${src}
makefs -t ffs -B little -s 200m -o label=root ${img}.s1a ${src}
mkimg -s bsd -b ${src}/boot/boot -p freebsd-ufs:=${img}.s1a -o ${img}.s1
mkimg -a 1 -s mbr -b ${src}/boot/boot0sio -p freebsd:=${img}.s1 -o ${img}
rm -f ${src}/etc/fstab
}
mk_nogeli_mbr_ufs_uefi() {
src=$1
img=$2
ufs_fstab ${src}
make_esp_file ${img}.s1 ${espsize} ${src}/boot/loader.efi
makefs -t ffs -B little -s 200m -o label=root ${img}.s2a ${src}
mkimg -s bsd -p freebsd-ufs:=${img}.s2a -o ${img}.s2
mkimg -a 1 -s mbr -p efi:=${img}.s1 -p freebsd:=${img}.s2 -o ${img}
rm -f ${src}/etc/fstab
}
mk_nogeli_mbr_ufs_both() {
src=$1
img=$2
ufs_fstab ${src}
make_esp_file ${img}.s1 ${espsize} ${src}/boot/loader.efi
makefs -t ffs -B little -s 200m -o label=root ${img}.s2a ${src}
mkimg -s bsd -b ${src}/boot/boot -p freebsd-ufs:=${img}.s2a -o ${img}.s2
mkimg -a 2 -s mbr -b ${src}/boot/mbr -p efi:=${img}.s1 -p freebsd:=${img}.s2 -o ${img}
rm -f ${src}/etc/fstab
}
mk_nogeli_mbr_zfs_uefi() {
src=$1
img=$2
mntpt=$3
geli=$4
scheme=$5
fs=$6
bios=$7
pool=nogeli-mbr-zfs-uefi
zfs_extra $src $dst
make_esp_file ${img}.s1 ${espsize} ${src}/boot/loader.efi
makefs -t zfs -s 200m \
-o poolname=${pool} -o bootfs=${pool} -o rootpath=/ \
${img}.s2a ${src} ${dst}
mkimg -s bsd -p freebsd-zfs:=${img}.s2a -o ${img}.s2
mkimg -a 1 -s mbr -b ${src}/boot/mbr -p efi:=${img}.s1 -p freebsd:=${img}.s2 -o ${img}
rm -rf ${dst}
}
mk_geli_gpt_ufs_legacy() {
src=$1
img=$2
mntpt=$3
geli=$4
scheme=$5
fs=$6
bios=$7
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}
gpart add -t freebsd-ufs -l root $md
echo ${passphrase} | geli init -bg -e AES-XTS -i ${iterations} -J - -l 256 -s 4096 ${md}p2
echo ${passphrase} | geli attach -j - ${md}p2
newfs -L root /dev/${md}p2.eli
mount /dev/${md}p2.eli ${mntpt}
cpsys ${src} ${mntpt}
cat > ${mntpt}/boot/loader.conf <<EOF
geom_eli_load=YES
EOF
ufs_fstab ${mntpt}
cp /boot/kernel/geom_eli.ko ${mntpt}/boot/kernel/geom_eli.ko
umount -f ${mntpt}
geli detach ${md}p2
${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
mdconfig -d -u ${md}
}
mk_geli_gpt_ufs_uefi() {
src=$1
img=$2
mntpt=$3
geli=$4
scheme=$5
fs=$6
bios=$7
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 efi -s ${espsize}k -a 4k ${md}
gpart add -t freebsd-ufs -l root $md
echo ${passphrase} | geli init -bg -e AES-XTS -i ${iterations} -J - -l 256 -s 4096 ${md}p2
echo ${passphrase} | geli attach -j - ${md}p2
newfs -L root /dev/${md}p2.eli
mount /dev/${md}p2.eli ${mntpt}
cpsys ${src} ${mntpt}
cat > ${mntpt}/boot/loader.conf <<EOF
geom_eli_load=YES
EOF
ufs_fstab ${mntpt}
cp /boot/kernel/geom_eli.ko ${mntpt}/boot/kernel/geom_eli.ko
umount -f ${mntpt}
geli detach ${md}p2
${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
mdconfig -d -u ${md}
}
mk_geli_gpt_ufs_both() {
src=$1
img=$2
mntpt=$3
geli=$4
scheme=$5
fs=$6
bios=$7
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 efi -s ${espsize}k -a 4k ${md}
gpart add -t freebsd-boot -s 400k -a 4k ${md}
gpart add -t freebsd-ufs -l root $md
echo ${passphrase} | geli init -bg -e AES-XTS -i ${iterations} -J - -l 256 -s 4096 ${md}p3
echo ${passphrase} | geli attach -j - ${md}p3
newfs -L root /dev/${md}p3.eli
mount /dev/${md}p3.eli ${mntpt}
cpsys ${src} ${mntpt}
cat > ${mntpt}/boot/loader.conf <<EOF
geom_eli_load=YES
EOF
ufs_fstab ${mntpt}
cp /boot/kernel/geom_eli.ko ${mntpt}/boot/kernel/geom_eli.ko
umount -f ${mntpt}
geli detach ${md}p3
${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
mdconfig -d -u ${md}
}
mk_geli_gpt_zfs_legacy() {
src=$1
img=$2
mntpt=$3
geli=$4
scheme=$5
fs=$6
bios=$7
pool=geli-gpt-zfs-legacy
dd if=/dev/zero of=${img} count=1 seek=$(( 300 * 1024 * 1024 / 512 ))
md=$(mdconfig -f ${img})
gpart create -s gpt ${md}
gpart add -t freebsd-boot -s 400k -a 4k ${md}
gpart add -t freebsd-ufs -s 100m ${md}
gpart add -t freebsd-zfs -l root $md
echo ${passphrase} | geli init -bg -e AES-XTS -i ${iterations} -J - -l 256 -s 4096 ${md}p3
echo ${passphrase} | geli attach -j - ${md}p3
zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}p3.eli
zpool set bootfs=${pool} ${pool}
zfs create -po mountpoint=/ ${pool}/ROOT/default
cpsys ${src} ${mntpt}
cat >> ${mntpt}/boot/loader.conf <<EOF
cryptodev_load=YES
zfs_load=YES
geom_eli_load=YES
EOF
cp /boot/kernel/acl_nfs4.ko ${mntpt}/boot/kernel/acl_nfs4.ko
cp /boot/kernel/cryptodev.ko ${mntpt}/boot/kernel/cryptodev.ko
cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko
cp /boot/kernel/geom_eli.ko ${mntpt}/boot/kernel/geom_eli.ko
zfs umount -f ${pool}/ROOT/default
zfs set mountpoint=none ${pool}/ROOT/default
zpool set bootfs=${pool}/ROOT/default ${pool}
zpool set autoexpand=on ${pool}
zpool export ${pool}
geli detach ${md}p3
${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
mdconfig -d -u ${md}
}
mk_geli_gpt_zfs_uefi() {
src=$1
img=$2
mntpt=$3
geli=$4
scheme=$5
fs=$6
bios=$7
pool=geli-gpt-zfs-uefi
dd if=/dev/zero of=${img} count=1 seek=$(( 300 * 1024 * 1024 / 512 ))
md=$(mdconfig -f ${img})
gpart create -s gpt ${md}
gpart add -t efi -s ${espsize}k -a 4k ${md}
gpart add -t freebsd-ufs -s 100m ${md}
gpart add -t freebsd-zfs -l root $md
echo ${passphrase} | geli init -bg -e AES-XTS -i ${iterations} -J - -l 256 -s 4096 ${md}p3
echo ${passphrase} | geli attach -j - ${md}p3
zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}p3.eli
zpool set bootfs=${pool} ${pool}
zfs create -po mountpoint=/ ${pool}/ROOT/default
cpsys ${src} ${mntpt}
cat >> ${mntpt}/boot/loader.conf <<EOF
cryptodev_load=YES
zfs_load=YES
geom_eli_load=YES
EOF
cp /boot/kernel/acl_nfs4.ko ${mntpt}/boot/kernel/acl_nfs4.ko
cp /boot/kernel/cryptodev.ko ${mntpt}/boot/kernel/cryptodev.ko
cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko
cp /boot/kernel/geom_eli.ko ${mntpt}/boot/kernel/geom_eli.ko
zfs umount -f ${pool}/ROOT/default
zfs set mountpoint=none ${pool}/ROOT/default
zpool set bootfs=${pool}/ROOT/default ${pool}
zpool set autoexpand=on ${pool}
zpool export ${pool}
geli detach ${md}p3
${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
mdconfig -d -u ${md}
}
mk_geli_gpt_zfs_both() {
src=$1
img=$2
mntpt=$3
geli=$4
scheme=$5
fs=$6
bios=$7
pool=geli-gpt-zfs-both
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 efi -s ${espsize}k -a 4k ${md}
gpart add -t freebsd-boot -s 400k -a 4k ${md}
gpart add -t freebsd-zfs -l root $md
echo ${passphrase} | geli init -bg -e AES-XTS -i ${iterations} -J - -l 256 -s 4096 ${md}p3
echo ${passphrase} | geli attach -j - ${md}p3
zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}p3.eli
zpool set bootfs=${pool} ${pool}
zfs create -po mountpoint=/ ${pool}/ROOT/default
cpsys ${src} ${mntpt}
cat > ${mntpt}/boot/loader.conf <<EOF
cryptodev_load=YES
zfs_load=YES
geom_eli_load=YES
EOF
cp /boot/kernel/acl_nfs4.ko ${mntpt}/boot/kernel/acl_nfs4.ko
cp /boot/kernel/cryptodev.ko ${mntpt}/boot/kernel/cryptodev.ko
cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko
cp /boot/kernel/geom_eli.ko ${mntpt}/boot/kernel/geom_eli.ko
zfs umount -f ${pool}/ROOT/default
zfs set mountpoint=none ${pool}/ROOT/default
zpool set bootfs=${pool}/ROOT/default ${pool}
zpool set autoexpand=on ${pool}
zpool export ${pool}
geli detach ${md}p3
${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
mdconfig -d -u ${md}
}
mk_geli_mbr_ufs_legacy() {
}
mk_geli_mbr_ufs_uefi() {
}
mk_geli_mbr_ufs_both() {
}
mk_geli_mbr_zfs_legacy() {
}
mk_geli_mbr_zfs_uefi() {
}
mk_geli_mbr_zfs_both() {
}
qser="-monitor telnet::4444,server,nowait -serial stdio -nographic"
qemu_aarch64_uefi()
{
img=$1
sh=$2
echo "qemu-system-aarch64 -m 4096M -cpu cortex-a57 -M virt \
-bios QEMU_EFI.fd ${qser} \
-drive if=none,file=${img},id=hd0 \
-device virtio-blk-device,drive=hd0" > $sh
chmod 755 $sh
}
log_for()
{
dir=$(dirname $1)
fn=$(basename $1 .sh)
echo $dir/$fn.log
}
qemu_amd64_legacy()
{
img=$1
sh=$2
log=$(log_for $2)
echo "echo -n $(basename $sh .sh):' '" > $sh
echo "(qemu-system-x86_64 -m 256m --drive file=${img},format=raw ${qser} | tee $log 2>&1 | grep -q SUCCESS) && echo legacy pass || echo legacy fail" >> $sh
chmod 755 $sh
}
qemu_amd64_uefi()
{
img=$1
sh=$2
log=$(log_for $2)
echo "echo -n $(basename $sh .sh):' '" > $sh
echo "(qemu-system-x86_64 -m 256m -bios ~/bios/OVMF-X64.fd --drive file=${img},format=raw ${qser} | tee $log 2>&1 | grep -q SUCCESS) && echo uefi pass || echo uefi fail" >> $sh
chmod 755 $sh
}
qemu_amd64_both()
{
img=$1
sh=$2
log=$(log_for $2)
echo "echo -n $(basename $sh .sh):' '" > $sh
echo "(qemu-system-x86_64 -m 256m --drive file=${img},format=raw ${qser} | tee $log 2>&1 | grep -q SUCCESS) && echo legacy pass || echo legacy fail" >> $sh
echo "echo -n $(basename $sh .sh):' '" >> $sh
echo "(qemu-system-x86_64 -m 256m -bios ~/bios/OVMF-X64.fd --drive file=${img},format=raw ${qser} | tee -a $log 2>&1 | grep -q SUCCESS) && echo uefi pass || echo uefi fail" >> $sh
chmod 755 $sh
}
qemu_i386_legacy()
{
img=$1
sh=$2
echo "qemu-system-i386 --drive file=${img},format=raw ${qser}" > $sh
chmod 755 $sh
}
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
}
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?}
img=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.img
sh=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.sh
echo "$sh" >> ${IMGDIR}/all.sh
echo date >> ${IMGDIR}/all.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 ^^^^^^^^^^^^^^^"
}
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)
DESTDIR=${OBJDIR}/boot-tree
rm -rf ${DESTDIR}
mkdir -p ${DESTDIR}/boot/defaults
mkdir -p ${DESTDIR}/boot/kernel
cp /boot/kernel/kernel ${DESTDIR}/boot/kernel
echo -h -D -S115200 > ${DESTDIR}/boot.config
cat > ${DESTDIR}/boot/loader.conf <<EOF
comconsole_speed=115200
autoboot_delay=0
EOF
cp /boot/device.hints ${DESTDIR}/boot/device.hints
make install DESTDIR=${DESTDIR} MK_MAN=no MK_INSTALL_AS_USER=yes WITHOUT_DEBUG_FILES=yes
if [ $? -ne 0 ]; then
echo "make install failed"
exit 1
fi
mkdir -p ${DESTDIR}/sbin ${DESTDIR}/bin \
${DESTDIR}/lib ${DESTDIR}/libexec \
${DESTDIR}/etc ${DESTDIR}/dev
for f in /sbin/halt /sbin/init /bin/sh /sbin/sysctl $(ldd /bin/sh | awk 'NF == 4 { print $3; }') /libexec/ld-elf.so.1; do
cp $f ${DESTDIR}/$f
done
cat > ${DESTDIR}/etc/rc <<EOF
#!/bin/sh
sysctl machdep.bootmethod
echo "RC COMMAND RUNNING -- SUCCESS!!!!!"
halt -p
EOF
rm -f ${IMGDIR}/all.sh
echo date > ${IMGDIR}/all.sh
chmod +x ${IMGDIR}/all.sh
if [ $# -eq 5 ]; then
make_one_image $*
echo ${IMGDIR}/all.sh
exit
fi
for arch in amd64; do
for geli in nogeli; do
for scheme in gpt mbr; do
for fs in ufs zfs; do
for bios in legacy uefi both; do
if [ "$scheme" = "mbr" -a "$fs" = "zfs" -a "$bios" != "uefi" ]; then
continue
fi
make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
done
done
done
done
done
echo ${IMGDIR}/all.sh
rmdir ${MNTPT}
exit 0
for arch in i386; do
for geli in nogeli geli; do
for scheme in gpt mbr; do
for fs in ufs zfs; do
for bios in legacy; do
if [ "$scheme" = "mbr" -a "$fs" = "zfs" -a "$bios" != "uefi" ]; then
continue
fi
make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
done
done
done
done
done
for arch in arm aarch64; do
geli=nogeli
for scheme in gpt mbr; do
for fs in ufs zfs; do
bios=efi
make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
done
done
done
for arch in powerpc powerpc64 powerpc64le; do
geli=nogeli
for scheme in apm gpt; do
fs=ufs
for bios in ofw uboot chrp; do
make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
done
done
done
for arch in riscv; do
geli=nogeli
fs=ufs
scheme=gpt
bios=efi
make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
done