sd-card-images/test/qemu.sh

142 lines
2.9 KiB
Bash
Executable File

#!/bin/bash
# Boot up and shutdown
BOOT="${1:-boot-qemu_aarch64_virt.bin.gz}"
DEBIAN="${2:-debian-bullseye-arm64-XXXXXX.bin.gz}"
set -ex
# Parse out stuff
IFS="-." read -a PARTS1 <<< `basename "${BOOT}"`
BOARD="${PARTS1[1]}"
echo "Using board ${BOARD}"
# Parse out stuff
IFS="-." read -a PARTS2 <<< `basename "${DEBIAN}"`
ARCH="${PARTS2[2]}"
SSHPASS="${PARTS2[3]}"
echo "Using password ${SSHPASS}"
# Build image
zcat "${BOOT}" "${DEBIAN}" > image.bin
# Check integrity
LOOP1=$(losetup -f -P --show image.bin) && {
trap 'losetup -d "${LOOP1}"' ERR
sleep 1
fsck.vfat -p -f "${LOOP1}p1"
fsck.ext4 -p -f "${LOOP1}p2"
trap '-' ERR
losetup -d "${LOOP1}"
}
# Assume 8GB virtual disk
fallocate -l 8GB image.bin
# Extend second partition
parted -s -a opt image.bin "resizepart 2 100%"
# Check integrity again
LOOP2=$(losetup -f -P --show image.bin) && {
trap 'losetup -d "${LOOP2}"' ERR
sleep 1
fsck.vfat -p -f "${LOOP2}p1"
fsck.ext4 -p -f "${LOOP2}p2"
resize2fs "${LOOP2}p2"
trap '-' ERR
losetup -d "${LOOP2}"
}
# Extract U-Boot (u-boot.rom in x86 case)
dd if=image.bin of=bios.bin count=2048 skip=16
case "${BOARD}" in
qemu*)
;;
*)
echo "Unsupported \$BOARD: ${BOARD}"
exit 1
;;
esac
case "${ARCH}" in
amd64)
QEMU_ARCH="x86_64"
QEMU_MACHINE="pc"
QEMU_CPU="qemu64"
;;
i386)
QEMU_ARCH="i386"
QEMU_MACHINE="pc"
QEMU_CPU="qemu32"
;;
arm64)
QEMU_ARCH="aarch64"
QEMU_MACHINE="virt"
QEMU_CPU="cortex-a53"
;;
armhf)
QEMU_ARCH="arm"
QEMU_MACHINE="virt"
QEMU_CPU="cortex-a15"
;;
*)
echo "Unknown \$ARCH: ${ARCH}"
exit 1
;;
esac
# Launch QEMU with U-Boot and image
qemu-system-${QEMU_ARCH} -machine ${QEMU_MACHINE} \
-cpu ${QEMU_CPU} \
-smp $(nproc) \
-m 512 \
-bios bios.bin \
-serial stdio \
-no-reboot \
-display none \
-drive file=image.bin,format=raw,media=disk \
-nic user,hostfwd=tcp:127.0.0.1:5555-:22 &
sleep 15
# Pass password to sshpass
export SSHPASS
# Wait for start up
until sshpass -e ssh -o "ConnectTimeout=5" \
-o "StrictHostKeyChecking=no" \
-o "UserKnownHostsFile=/dev/null" \
-p 5555 \
-q \
root@localhost /bin/true; do
sleep 1
done
sleep 5
# Run test
sshpass -e ssh -o "ConnectTimeout=5" \
-o "StrictHostKeyChecking=no" \
-o "UserKnownHostsFile=/dev/null" \
-p 5555 \
-q \
root@localhost <<END
# Abort on error
set -ex
# Resize root filesystem
[ ! -e /dev/sda2 ] || resize2fs /dev/sda2 # For i386
[ ! -e /dev/vda2 ] || resize2fs /dev/vda2 # For armhf/arm64
# Install updates
export DEBIAN_FRONTEND=noninteractive
apt-get update
# Shut down
poweroff
END
# Wait for QEMU to exit
wait