mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
Make debugging early boot failures easier based on just CI logs. Signed-off-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
244 lines
5.9 KiB
Bash
Executable File
244 lines
5.9 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
set -ex
|
|
|
|
test_variant=$1
|
|
|
|
### defaults
|
|
extra_xen_opts=
|
|
wait_and_wakeup=
|
|
timeout=120
|
|
domU_config='
|
|
type = "pvh"
|
|
name = "domU"
|
|
kernel = "/boot/vmlinuz"
|
|
ramdisk = "/boot/initrd-domU"
|
|
extra = "root=/dev/ram0 console=hvc0"
|
|
memory = 512
|
|
vif = [ "bridge=xenbr0", ]
|
|
disk = [ ]
|
|
'
|
|
|
|
### test: smoke test & smoke test PVH
|
|
if [ -z "${test_variant}" ] || [ "${test_variant}" = "dom0pvh" ]; then
|
|
passed="ping test passed"
|
|
domU_check="
|
|
ifconfig eth0 192.168.0.2
|
|
until ping -c 10 192.168.0.1; do
|
|
sleep 1
|
|
done
|
|
echo \"${passed}\"
|
|
"
|
|
dom0_check="
|
|
until grep -q \"${passed}\" /var/log/xen/console/guest-domU.log; do
|
|
sleep 1
|
|
done
|
|
# get domU console content into test log
|
|
tail -n 100 /var/log/xen/console/guest-domU.log
|
|
echo \"${passed}\"
|
|
"
|
|
if [ "${test_variant}" = "dom0pvh" ]; then
|
|
extra_xen_opts="dom0=pvh"
|
|
fi
|
|
|
|
### test: S3
|
|
elif [ "${test_variant}" = "s3" ]; then
|
|
passed="suspend test passed"
|
|
wait_and_wakeup="started, suspending"
|
|
domU_check="
|
|
ifconfig eth0 192.168.0.2
|
|
echo domU started
|
|
"
|
|
dom0_check="
|
|
until grep 'domU started' /var/log/xen/console/guest-domU.log; do
|
|
sleep 1
|
|
done
|
|
echo \"${wait_and_wakeup}\"
|
|
set -x
|
|
echo deep > /sys/power/mem_sleep
|
|
echo mem > /sys/power/state
|
|
# now wait for resume
|
|
sleep 5
|
|
# get domU console content into test log
|
|
tail -n 100 /var/log/xen/console/guest-domU.log
|
|
xl list
|
|
xl dmesg | grep 'Finishing wakeup from ACPI S3 state' || exit 1
|
|
# check if domU is still alive
|
|
ping -c 10 192.168.0.2 || exit 1
|
|
echo \"${passed}\"
|
|
"
|
|
|
|
### test: pci-pv, pci-hvm
|
|
elif [ "${test_variant}" = "pci-pv" ] || [ "${test_variant}" = "pci-hvm" ]; then
|
|
|
|
if [ -z "$PCIDEV" ]; then
|
|
echo "Please set 'PCIDEV' variable with BDF of test network adapter" >&2
|
|
echo "Optionally set also 'PCIDEV_INTR' to 'MSI' or 'MSI-X'" >&2
|
|
exit 1
|
|
fi
|
|
|
|
passed="pci test passed"
|
|
|
|
domU_config='
|
|
type = "'${test_variant#pci-}'"
|
|
name = "domU"
|
|
kernel = "/boot/vmlinuz"
|
|
ramdisk = "/boot/initrd-domU"
|
|
extra = "root=/dev/ram0 console=hvc0 earlyprintk=xen"
|
|
memory = 512
|
|
vif = [ ]
|
|
disk = [ ]
|
|
pci = [ "'$PCIDEV',seize=1" ]
|
|
on_reboot = "destroy"
|
|
'
|
|
|
|
domU_check="
|
|
set -x -e
|
|
ip link set eth0 up
|
|
timeout 30s udhcpc -i eth0
|
|
pingip=\$(ip -o -4 r show default|cut -f 3 -d ' ')
|
|
ping -c 10 \"\$pingip\"
|
|
echo domU started
|
|
cat /proc/interrupts
|
|
"
|
|
if [ "$PCIDEV_INTR" = "MSI-X" ]; then
|
|
domU_check="$domU_check
|
|
grep -- '\\(-msi-x\\|PCI-MSI-X\\).*eth0' /proc/interrupts
|
|
"
|
|
elif [ "$PCIDEV_INTR" = "MSI" ]; then
|
|
# depending on the kernel version and domain type, the MSI can be
|
|
# marked as '-msi', 'PCI-MSI', or 'PCI-MSI-<SBDF>'; be careful to not match
|
|
# -msi-x nor PCI-MSI-X
|
|
domU_check="$domU_check
|
|
grep -- '\\(-msi \\|PCI-MSI\\( \\|-[^X]\\)\\).*eth0' /proc/interrupts
|
|
"
|
|
fi
|
|
domU_check="$domU_check
|
|
echo \"${passed}\"
|
|
"
|
|
|
|
dom0_check="
|
|
until grep -q \"^domU Welcome to Alpine Linux\" /var/log/xen/console/guest-domU.log; do
|
|
sleep 1
|
|
done
|
|
tail -n 100 /var/log/xen/console/guest-domU.log
|
|
"
|
|
fi
|
|
|
|
# DomU
|
|
mkdir -p rootfs
|
|
cd rootfs
|
|
# fakeroot is needed to preserve device nodes in rootless podman container
|
|
fakeroot -s ../fakeroot-save tar xzf ../binaries/initrd.tar.gz
|
|
mkdir proc
|
|
mkdir run
|
|
mkdir srv
|
|
mkdir sys
|
|
rm var/run
|
|
echo "#!/bin/sh
|
|
|
|
${domU_check}
|
|
" > etc/local.d/xen.start
|
|
chmod +x etc/local.d/xen.start
|
|
echo "rc_verbose=yes" >> etc/rc.conf
|
|
sed -i -e 's/^Welcome/domU \0/' etc/issue
|
|
find . | fakeroot -i ../fakeroot-save cpio -H newc -o | gzip > ../binaries/domU-rootfs.cpio.gz
|
|
cd ..
|
|
rm -rf rootfs
|
|
|
|
# DOM0 rootfs
|
|
mkdir -p rootfs
|
|
cd rootfs
|
|
fakeroot -s ../fakeroot-save tar xzf ../binaries/initrd.tar.gz
|
|
mkdir boot
|
|
mkdir proc
|
|
mkdir run
|
|
mkdir srv
|
|
mkdir sys
|
|
rm var/run
|
|
cp -ar ../binaries/dist/install/* .
|
|
|
|
echo "#!/bin/bash
|
|
|
|
export LD_LIBRARY_PATH=/usr/local/lib
|
|
bash /etc/init.d/xencommons start
|
|
|
|
brctl addbr xenbr0
|
|
brctl addif xenbr0 eth0
|
|
ifconfig eth0 up
|
|
ifconfig xenbr0 up
|
|
ifconfig xenbr0 192.168.0.1
|
|
|
|
xl create /etc/xen/domU.cfg
|
|
${dom0_check}
|
|
" > etc/local.d/xen.start
|
|
chmod +x etc/local.d/xen.start
|
|
echo "$domU_config" > etc/xen/domU.cfg
|
|
|
|
echo "rc_verbose=yes" >> etc/rc.conf
|
|
echo "XENCONSOLED_TRACE=all" >> etc/default/xencommons
|
|
echo "QEMU_XEN=/bin/false" >> etc/default/xencommons
|
|
mkdir -p var/log/xen/console
|
|
cp ../binaries/bzImage boot/vmlinuz
|
|
cp ../binaries/domU-rootfs.cpio.gz boot/initrd-domU
|
|
find . | fakeroot -i ../fakeroot-save cpio -H newc -o | gzip > ../binaries/dom0-rootfs.cpio.gz
|
|
cd ..
|
|
|
|
|
|
TFTP=/scratch/gitlab-runner/tftp
|
|
CONTROLLER=control@thor.testnet
|
|
|
|
echo "
|
|
multiboot2 (http)/gitlab-ci/xen $CONSOLE_OPTS loglvl=all guest_loglvl=all dom0_mem=4G $extra_xen_opts
|
|
module2 (http)/gitlab-ci/vmlinuz console=hvc0 root=/dev/ram0 earlyprintk=xen
|
|
module2 (http)/gitlab-ci/initrd-dom0
|
|
" > $TFTP/grub.cfg
|
|
|
|
cp -f binaries/xen $TFTP/xen
|
|
cp -f binaries/bzImage $TFTP/vmlinuz
|
|
cp -f binaries/dom0-rootfs.cpio.gz $TFTP/initrd-dom0
|
|
|
|
# start logging the serial; this gives interactive console, don't close its
|
|
# stdin to not close it; the 'cat' is important, plain redirection would hang
|
|
# until somebody opens the pipe; opening and closing the pipe is used to close
|
|
# the console
|
|
mkfifo /tmp/console-stdin
|
|
cat /tmp/console-stdin |\
|
|
ssh $CONTROLLER console | tee smoke.serial &
|
|
|
|
# start the system pointing at gitlab-ci predefined config
|
|
ssh $CONTROLLER gitlabci poweron
|
|
trap "ssh $CONTROLLER poweroff; : > /tmp/console-stdin" EXIT
|
|
|
|
if [ -n "$wait_and_wakeup" ]; then
|
|
# wait for suspend or a timeout
|
|
until grep "$wait_and_wakeup" smoke.serial || [ $timeout -le 0 ]; do
|
|
sleep 1;
|
|
: $((--timeout))
|
|
done
|
|
if [ $timeout -le 0 ]; then
|
|
echo "ERROR: suspend timeout, aborting"
|
|
exit 1
|
|
fi
|
|
# keep it suspended a bit, then wakeup
|
|
sleep 30
|
|
ssh $CONTROLLER wake
|
|
fi
|
|
|
|
until grep "^Welcome to Alpine Linux" smoke.serial || [ $timeout -le 0 ]; do
|
|
sleep 1;
|
|
: $((--timeout))
|
|
done
|
|
|
|
tail -n 100 smoke.serial
|
|
|
|
if [ $timeout -le 0 ]; then
|
|
echo "ERROR: test timeout, aborting"
|
|
exit 1
|
|
fi
|
|
|
|
sleep 1
|
|
|
|
(grep -q "^Welcome to Alpine Linux" smoke.serial && grep -q "${passed}" smoke.serial) || exit 1
|
|
exit 0
|