Date: Thu, 19 Mar 2020 18:15:09 +0000 (UTC) From: Ed Maste <emaste@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r359149 - stable/12/tools/boot Message-ID: <202003191815.02JIF9t3078908@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: emaste Date: Thu Mar 19 18:15:09 2020 New Revision: 359149 URL: https://svnweb.freebsd.org/changeset/base/359149 Log: MFC r346080: Add a smoke test QEMU boot script for CI And followon commits: r346317 (ian): Allow this test script to be run from within src/tools/boot r346329: Install some entropy for QEMU CI smoke test r346330: Put QEMU CI smoke test boot log in /tmp if TMPDIR not set r346748 (bcran): Fix tools/boot/ci-qemu-test.sh and make some improvements r346961: revert QEMU q35 platform use from r346748 r352063: ci-qemu-test: if firmware is not available, hint at pkg to install r358472: CI: print wired page count on boot Sponsored by: The FreeBSD Foundation Added: stable/12/tools/boot/ci-qemu-test.sh - copied, changed from r346080, head/tools/boot/ci-qemu-test.sh Modified: Directory Properties: stable/12/ (props changed) Copied and modified: stable/12/tools/boot/ci-qemu-test.sh (from r346080, head/tools/boot/ci-qemu-test.sh) ============================================================================== --- head/tools/boot/ci-qemu-test.sh Wed Apr 10 13:41:34 2019 (r346080, copy source) +++ stable/12/tools/boot/ci-qemu-test.sh Thu Mar 19 18:15:09 2020 (r359149) @@ -2,62 +2,111 @@ # Install loader, kernel, and enough of userland to boot in QEMU and echo # "Hello world." from init, as a very quick smoke test for CI. Uses QEMU's -# virtual FAT filesystem to avoid the need to create a disk image. +# virtual FAT filesystem to avoid the need to create a disk image. While +# designed for CI automated testing, this script can also be run by hand as +# a quick smoke-test. The rootgen.sh and related scripts generate much more +# extensive tests for many combinations of boot env (ufs, zfs, geli, etc). # # $FreeBSD$ set -e -# Root directory for minimal FreeBSD installation. -ROOTDIR=$(pwd)/fat-root +die() +{ + echo "$*" 1>&2 + exit 1 +} -# Create minimal directory structure. -rm -f $ROOTDIR/efi/boot/BOOTx64.EFI -for dir in dev bin efi/boot etc lib libexec sbin usr/libexec; do - mkdir -p $ROOTDIR/$dir -done +tempdir_cleanup() +{ + trap - EXIT SIGINT SIGHUP SIGTERM SIGQUIT + rm -rf ${ROOTDIR} +} -# Install kernel, loader and minimal userland. -make -DNO_ROOT DESTDIR=$ROOTDIR \ - MODULES_OVERRIDE= \ - WITHOUT_DEBUG_FILES=yes \ - WITHOUT_KERNEL_SYMBOLS=yes \ - installkernel -for dir in stand \ - lib/libc lib/libedit lib/ncurses \ - libexec/rtld-elf \ - bin/sh sbin/init sbin/shutdown; do - make -DNO_ROOT DESTDIR=$ROOTDIR INSTALL="install -U" \ - WITHOUT_MAN= \ - WITHOUT_PROFILE= \ - WITHOUT_TESTS= \ - WITHOUT_TOOLCHAIN= \ - -C $dir install -done +tempdir_setup() +{ + # Create minimal directory structure and populate it. + # Caller must cd ${SRCTOP} before calling this function. -# Put loader in standard EFI location. -mv $ROOTDIR/boot/loader.efi $ROOTDIR/efi/boot/BOOTx64.EFI + for dir in dev bin efi/boot etc lib libexec sbin usr/lib usr/libexec; do + mkdir -p ${ROOTDIR}/${dir} + done -# Configuration files. -cat > $ROOTDIR/boot/loader.conf <<EOF + # Install kernel, loader and minimal userland. + + make -DNO_ROOT DESTDIR=${ROOTDIR} \ + MODULES_OVERRIDE= \ + WITHOUT_DEBUG_FILES=yes \ + WITHOUT_KERNEL_SYMBOLS=yes \ + installkernel + for dir in stand \ + lib/libc lib/libedit lib/ncurses \ + libexec/rtld-elf \ + bin/sh sbin/init sbin/shutdown sbin/sysctl; do + make -DNO_ROOT DESTDIR=${ROOTDIR} INSTALL="install -U" \ + WITHOUT_DEBUG_FILES= \ + WITHOUT_MAN= \ + WITHOUT_PROFILE= \ + WITHOUT_TESTS= \ + WITHOUT_TOOLCHAIN= \ + -C ${dir} install + done + + # Put loader in standard EFI location. + mv ${ROOTDIR}/boot/loader.efi ${ROOTDIR}/efi/boot/BOOTx64.EFI + + # Configuration files. + cat > ${ROOTDIR}/boot/loader.conf <<EOF vfs.root.mountfrom="msdosfs:/dev/ada0s1" autoboot_delay=-1 boot_verbose=YES EOF -cat > $ROOTDIR/etc/rc <<EOF + cat > ${ROOTDIR}/etc/rc <<EOF #!/bin/sh echo "Hello world." +/sbin/sysctl vm.stats.vm.v_wire_count /sbin/shutdown -p now EOF -# Remove unnecessary files to keep FAT filesystem size down. -rm -rf $ROOTDIR/METALOG $ROOTDIR/usr/lib + # Entropy needed to boot, see r346250 and followup commits/discussion. + dd if=/dev/random of=${ROOTDIR}/boot/entropy bs=4k count=1 + # Remove unnecessary files to keep FAT filesystem size down. + rm -rf ${ROOTDIR}/METALOG ${ROOTDIR}/usr/lib +} + +# Locate the top of the source tree, to run make install from. +: ${SRCTOP:=$(make -V SRCTOP)} +if [ -z "${SRCTOP}" ]; then + die "Cannot locate top of source tree" +fi + +# Locate the uefi firmware file used by qemu. +: ${OVMF:=/usr/local/share/uefi-edk2-qemu/QEMU_UEFI_CODE-x86_64.fd} +if [ ! -r "${OVMF}" ]; then + echo "NOTE: UEFI firmware available in the uefi-edk2-qemu-x86_64 package" >&2 + die "Cannot read UEFI firmware file ${OVMF}" +fi + +# Create a temp dir to hold the boot image. +ROOTDIR=$(mktemp -d -t ci-qemu-test-fat-root) +trap tempdir_cleanup EXIT SIGINT SIGHUP SIGTERM SIGQUIT + +# Populate the boot image in a temp dir. +( cd ${SRCTOP} && tempdir_setup ) + # And, boot in QEMU. +: ${BOOTLOG:=${TMPDIR:-/tmp}/ci-qemu-test-boot.log} timeout 300 \ - qemu-system-x86_64 -m 256M -bios OVMF.fd \ - -serial stdio -vga none -nographic -monitor none \ - -snapshot -hda fat:$ROOTDIR 2>&1 | tee boot.log -grep -q 'Hello world.' boot.log -echo OK + qemu-system-x86_64 -m 256M -nodefaults \ + -drive if=pflash,format=raw,readonly,file=${OVMF} \ + -serial stdio -vga none -nographic -monitor none \ + -snapshot -hda fat:${ROOTDIR} 2>&1 | tee ${BOOTLOG} + +# Check whether we succesfully booted... +if grep -q 'Hello world.' ${BOOTLOG}; then + echo "OK" +else + die "Did not boot successfully, see ${BOOTLOG}" +fi
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202003191815.02JIF9t3078908>