Cirrus-CI: use makefs if root size exceeds QEMU's virtual FAT limit

We use QEMU's virtual FAT support to avoid having to create a disk
image because it is much faster, but it has a limit of about 500MB.
Artifacts produced by the GCC 12 CI job exceeded this size.

Add support for creating a FAT partition image and MBR-partitioned disk
image and use it when the file system is too large for QEMU.

In one run the Cirrus-CI LLVM test task took 1m33s using QEMU's virtual
FAT while the GCC task took 6m48s using makefs+mkimg.

Reviewed by:	imp
Sponsored by:	The FreeBSD Foundation
Differential Revision:	https://reviews.freebsd.org/D38589
This commit is contained in:
Ed Maste 2023-02-13 12:39:39 -05:00
parent 28137bdb19
commit 7b0593fdcb

View File

@ -21,7 +21,7 @@ die()
tempdir_cleanup()
{
trap - EXIT SIGINT SIGHUP SIGTERM SIGQUIT
rm -rf ${ROOTDIR}
rm -rf ${WORKDIR}
}
tempdir_setup()
@ -99,18 +99,31 @@ arm64)
esac
# Create a temp dir to hold the boot image.
ROOTDIR=$(mktemp -d -t ci-qemu-test-fat-root)
WORKDIR=$(mktemp -d -t ci-qemu-test-fat-root)
ROOTDIR=${WORKDIR}/stage-root
trap tempdir_cleanup EXIT SIGINT SIGHUP SIGTERM SIGQUIT
# Populate the boot image in a temp dir.
( cd ${SRCTOP} && tempdir_setup )
# Using QEMU's virtual FAT support is much faster than creating a disk image,
# but only supports about 500MB. Fall back to creating a disk image if the
# staged root is too large.
hda="fat:${ROOTDIR}"
rootsize=$(du -skA ${ROOTDIR} | sed 's/[[:space:]].*$//')
if [ $rootsize -gt 512000 ]; then
echo "Root size ${rootsize}K too large for QEMU virtual FAT" >&2
makefs -t msdos -s 1g $WORKDIR/image.fat $ROOTDIR
mkimg -s mbr -p efi:=$WORKDIR/image.fat -o $WORKDIR/image.mbr
hda="$WORKDIR/image.mbr"
fi
# And, boot in QEMU.
: ${BOOTLOG:=${TMPDIR:-/tmp}/ci-qemu-test-boot.log}
timeout 300 \
$QEMU -m 256M -nodefaults \
-serial stdio -vga none -nographic -monitor none \
-snapshot -hda fat:${ROOTDIR} 2>&1 | tee ${BOOTLOG}
-snapshot -hda $hda 2>&1 | tee ${BOOTLOG}
# Check whether we succesfully booted...
if grep -q 'Hello world.' ${BOOTLOG}; then