Skip to content

Instantly share code, notes, and snippets.

@maciejsszmigiero
Last active April 20, 2019 11:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save maciejsszmigiero/cf8267a7384970dc42b08574d50207a3 to your computer and use it in GitHub Desktop.
Save maciejsszmigiero/cf8267a7384970dc42b08574d50207a3 to your computer and use it in GitHub Desktop.
Gentoo Syslinux test script
#!/bin/bash
# Gentoo Syslinux test script
# Author: Maciej S. Szmigiero <mail@maciej.szmigiero.name>
#
# Requires:
# * sys-boot/syslinux
# * sys-fs/mtools
# * sys-fs/dosfstools
# * sys-block/parted
# * app-cdr/cdrtools
# * app-emulation/qemu
# * sys-firmware/edk2-ovmf
# * a qemu-bootable linux kernel image with a matching initrd image that
# powers off the system when booted
#
# For example kernel / initrd images based on Gentoo's install-amd64-minimal-20190417T214503Z.iso
# please see https://gist.github.com/maciejsszmigiero/49dc6a74e711a917b24c2731963582a9
LINUX=syslinux-test-linux
LINUXI="${LINUX}-initrd"
TIMEOUT=2m
# for things like mkfs and parted
export PATH="${PATH}:/usr/sbin:/sbin"
if [ ! -f "${LINUX}" -o ! -f "${LINUXI}" ]; then
echo "no kernel (${LINUX}) or initrd (${LINUXI}) image" 1>&2
exit -1
fi
IMGFILE=`mktemp`
if [ $? -ne 0 -o -z "${IMGFILE}" ]; then
echo "no temporary image file" 1>&2
exit -1
fi
# mkfs.fat refuses to overwrite existing files
TMPFILE="${IMGFILE}-tmp"
if [ -f "${TMPFILE}" ]; then
echo "temporary file already exists" 1>&2
rm -f "${IMGFILE}"
exit -1
fi
TMPDIR=`mktemp -d`
if [ $? -ne 0 -o -z "${TMPDIR}" ]; then
echo "no temporary directory" 1>&2
rm -f "${IMGFILE}"
exit -1
fi
FAIL=
FAILT=
mkfs.fat -v -F 32 -C "${TMPFILE}" $(( 100 * 1024 )) &&
syslinux --install "${TMPFILE}" &&
mcopy -i "${TMPFILE}" "${LINUX}" '::linux' &&
mcopy -i "${TMPFILE}" "${LINUXI}" '::linux.igz' || FAIL=1
if [ -z "${FAIL}" ]; then
mcopy -i "${TMPFILE}" - '::syslinux.cfg' <<-SLC
DEFAULT linux
PROMPT 1
TIMEOUT 10
LABEL linux
KERNEL linux
APPEND looptype=squashfs loop=/image.squashfs cdroot
INITRD linux.igz
SLC
if [ $? -ne 0 ]; then
FAIL=1
fi
fi
if [ -z "${FAIL}" ]; then
mmd -i "${TMPFILE}" 'EFI' && mmd -i "${TMPFILE}" 'EFI/BOOT' &&
mcopy -i "${TMPFILE}" /usr/share/syslinux/efi64/syslinux.efi '::EFI/BOOT/BOOTx64.EFI' &&
mcopy -i "${TMPFILE}" /usr/share/syslinux/efi64/ldlinux.e64 '::EFI/BOOT/' || FAIL=1
fi
if [ -z "${FAIL}" ]; then
fallocate -l 128M "${IMGFILE}" &&
parted "${IMGFILE}" mklabel msdos mkpart primary fat32 $(( 1024 * 1024 ))B 128MB set 1 boot on &&
dd if=/usr/share/syslinux/mbr.bin of="${IMGFILE}" bs=440 conv=notrunc &&
dd if="${TMPFILE}" of="${IMGFILE}" bs=512 seek=$(( 1024 * 1024 / 512 )) conv=notrunc || FAIL=1
fi
if [ -z "${FAIL}" ]; then
echo "Testing SYSLINUX BIOS"
if ! timeout "${TIMEOUT}" qemu-system-x86_64 -enable-kvm -m 512M \
-drive file="${IMGFILE}",index=0,media=disk,format=raw; then
echo "TEST FAILED!"
FAILT=1
fi
fi
if [ -z "${FAIL}" ]; then
echo -n '' >"${IMGFILE}" &&
fallocate -l 128M "${IMGFILE}" &&
parted "${IMGFILE}" mklabel gpt mkpart BOOT $(( 1024 * 1024 ))B 128MB set 1 boot on &&
dd if="${TMPFILE}" of="${IMGFILE}" bs=512 seek=$(( 1024 * 1024 / 512 )) conv=notrunc || FAIL=1
fi
if [ -z "${FAIL}" ]; then
echo "Testing SYSLINUX EFI"
if ! timeout "${TIMEOUT}" qemu-system-x86_64 -enable-kvm -m 512M \
-drive file=/usr/share/edk2-ovmf/OVMF.fd,if=pflash,format=raw,unit=0,readonly=on \
-drive file="${IMGFILE}",index=0,media=disk,format=raw; then
echo "TEST FAILED!"
FAILT=1
fi
fi
if [ -z "${FAIL}" ]; then
mkdir "${TMPDIR}"/syslinux &&
mcopy -i "${TMPFILE}" '::syslinux.cfg' "${TMPDIR}"/ &&
cp "${LINUX}" "${TMPDIR}"/linux &&
cp "${LINUXI}" "${TMPDIR}"/linux.igz &&
cp /usr/share/syslinux/isolinux.bin "${TMPDIR}"/syslinux/ &&
cp /usr/share/syslinux/ldlinux.c32 "${TMPDIR}"/ &&
mkisofs -o "${IMGFILE}" -b syslinux/isolinux.bin -c syslinux/boot.cat \
-no-emul-boot -boot-load-size 4 -boot-info-table "${TMPDIR}" || FAIL=1
fi
if [ -z "${FAIL}" ]; then
echo "Testing ISOLINUX"
if ! timeout "${TIMEOUT}" qemu-system-x86_64 -enable-kvm -m 512M -cdrom "${IMGFILE}"; then
echo "TEST FAILED!"
FAILT=1
fi
fi
if [ -z "${FAIL}" ]; then
mkdir "${TMPDIR}"/pxelinux.cfg &&
mv "${TMPDIR}"/syslinux.cfg "${TMPDIR}"/pxelinux.cfg/default &&
cp /usr/share/syslinux/efi64/syslinux.efi "${TMPDIR}"/ &&
cp /usr/share/syslinux/efi64/ldlinux.e64 "${TMPDIR}"/ &&
cp /usr/share/syslinux/pxelinux.0 "${TMPDIR}"/ || FAIL=1
fi
if [ -z "${FAIL}" ]; then
echo "Testing PXELINUX BIOS"
if ! timeout "${TIMEOUT}" qemu-system-x86_64 -enable-kvm -m 512M \
-device e1000,netdev=n1 -netdev user,id=n1,tftp="${TMPDIR}"/,bootfile=/pxelinux.0; then
echo "TEST FAILED!"
FAILT=1
fi
fi
if [ -z "${FAIL}" ]; then
echo "Testing SYSLINUX EFI NET"
if ! timeout "${TIMEOUT}" qemu-system-x86_64 -enable-kvm -m 512M \
-drive file=/usr/share/edk2-ovmf/OVMF.fd,if=pflash,format=raw,unit=0,readonly=on \
-device e1000,netdev=n1 -netdev user,id=n1,tftp="${TMPDIR}"/,bootfile=/syslinux.efi; then
echo "TEST FAILED!"
FAILT=1
fi
fi
rm -rf "${TMPDIR}"
rm -f "${TMPFILE}"
rm -f "${IMGFILE}"
[ -n "${FAIL}" -o -n "${FAILT}" ] && exit -1
true
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment