| #!/bin/bash |
| |
| XFSTESTS_FLAVOR=kvm |
| t=$(echo ${XFSTESTS_FLAVOR}_xfstests_dir | tr "[:lower:]" "[:upper:]") |
| eval DIR="\$$t" |
| if test -z "$DIR" |
| then |
| DIR="$(dirname "$(readlink -f "$0")")" |
| fi |
| if test ! -f "$DIR/util/get-config" |
| then |
| echo "$(basename "$0"): couldn't find $DIR/util/get-config" |
| exit 1 |
| fi |
| |
| . "$DIR/util/get-config" |
| . "$DIR/util/parse_opt_funcs" |
| . "$DIR/util/arch-funcs" |
| |
| case "$1" in |
| install-kconfig) |
| shift |
| if test ! -x "$KBUILD_DIR/install-kconfig" |
| then |
| echo "Kernel configuration not supported in this installation" |
| exit 1 |
| fi |
| "$KBUILD_DIR/install-kconfig" "$@" |
| exit $? |
| ;; |
| kbuild) |
| shift |
| if test ! -x "$KBUILD_DIR/kbuild" |
| then |
| echo "kbuild not supported in this installation" |
| exit 1 |
| fi |
| "$KBUILD_DIR/kbuild" "$@" |
| exit $? |
| ;; |
| setup) |
| shift |
| export KVM_XFSTESTS_DIR="$DIR" |
| XFSTESTS_FLAVOR=$XFSTESTS_FLAVOR "$DIR/util/kvm-do-setup" "$@" |
| exit $? |
| ;; |
| esac |
| |
| QUIET="quiet loglevel=0" |
| |
| . $DIR/util/parse_cli |
| |
| DOWNLOAD_BASE_URL="https://mirrors.kernel.org/pub/linux/kernel/people/tytso/kvm-xfstests" |
| if test -z "$EXPLICIT_ROOT_FS" ; then |
| ROOT_FS="$(dirname $DIR)/test-appliance/root_fs.img.$ARCH" |
| if ! test -f "$ROOT_FS" ; then |
| ROOT_FS="$(dirname $DIR)/test-appliance/root_fs.img" |
| fi |
| if ! test -f "$ROOT_FS" ; then |
| f=root_fs.img.$ARCH |
| ROOT_FS="$(dirname $DIR)/test-appliance/$f" |
| echo "Downloading $f..." |
| |
| # wget1 and 2 have different flags to show progress bar |
| WGET_VERSION=$(wget --version | head -n1 | awk '{print $3}' | cut -d. -f1) |
| if [[ "$WGET_VERSION" -eq 1 ]]; then |
| PROGRESS_FLAG="--show-progress" |
| elif [[ "$WGET_VERSION" -eq 2 ]]; then |
| PROGRESS_FLAG="--force-progress" |
| else |
| # don't show progress bar if we can't determine version |
| PROGRESS_FLAG="" |
| fi |
| wget -nv $PROGRESS_FLAG -O "$ROOT_FS.new" "$DOWNLOAD_BASE_URL/$f" |
| |
| mv "$ROOT_FS.new" "$ROOT_FS" |
| fi |
| fi |
| |
| if ! test -f "$ROOT_FS" ; then |
| echo "Can't find root_fs image: $ROOT_FS" |
| exit 1 |
| fi |
| |
| if test -n "$DO_KERNEL_BUILD"; then |
| echo "Building kernel before running test" |
| "$DIR/../kernel-build/install-kconfig" --arch "$ARCH" || exit 125 |
| "$DIR/../kernel-build/kbuild" --no-dpkg --arch "$ARCH" || exit 125 |
| fi |
| |
| if ! test -f "$KERNEL"; then |
| echo "$KERNEL: kernel not found" |
| exit 1 |
| fi |
| |
| if test -n "$NO_ACTION" ; then |
| echo "Using kernel $KERNEL" |
| fi |
| |
| if test -z "$DO_NET" ; then |
| echo "Networking disabled." |
| NET="-net none " |
| else |
| ARG="$ARG net.ifnames=0" |
| if test $(whoami) = "root" ; then |
| NET="-net nic,model=virtio -net tap,script=$IFUP,downscript=$IFDOWN " |
| else |
| NET="-netdev user,id=mynet0,net=172.20.0.0/24 -device virtio-net,netdev=mynet0 " |
| fi |
| fi |
| |
| EXTRA_ARG=$(echo "$EXTRA_ARG" | sed -e 's/:/ /') |
| |
| if test -z "$TESTRUNID" ; then |
| TESTRUNID=$(date +%Y%m%d%H%M) |
| fi |
| if test -n "$SKIP_LOG" ; then |
| LOGFILE=/tmp/log.$TESTRUNID |
| else |
| mkdir -p "$DIR/logs" |
| LOGFILE="$DIR/logs/log.$TESTRUNID" |
| fi |
| RESULTFILE="$DIR/logs/results-$TESTRUNID.tar.xz" |
| if test -n "$VIRTCONSOLE" ; then |
| vc=$(echo "$VIRTCONSOLE" | sed -e "s;VIRTCONFILE;/tmp/console.$TESTRUNID;") |
| VIRTCONSOLE="$vc" |
| fi |
| |
| if test -n "$INITRD" ; then |
| INITRD="--initrd $INITRD" |
| fi |
| |
| if ! test -e $VDB -a -e $VDC -a -e $VDD -a -e $VDE -a -e $VDF -a -e $VDG \ |
| -a -e $VDI -a -e $VDJ |
| then |
| echo "Test disks don't exist, running setup..." |
| $DIR/util/kvm-do-setup |
| fi |
| |
| for i in "$VDB" "$VDC" "$VDD" "$VDE" "$VDF" "$VDG" "$VDI" "$VDJ" |
| do |
| if ! test -e "$i" |
| then |
| echo "Fatal error: disk $i does not exit. Config error?" |
| exit 1; |
| fi |
| done |
| |
| if type ionice >& /dev/null ; then |
| IONICE="ionice -n 5" |
| fi |
| |
| if test -z "$VIRTIOFSD" ; then |
| for i in /usr/libexec/virtiofsd /usr/lib/virtiofsd /usr/lib/qemu/virtiofsd |
| do |
| if test -x "$i" ; then |
| VIRTIOFSD="$i" |
| break |
| fi |
| done |
| else |
| if ! test -x "$VIRTIOFSD" ; then |
| echo "Virtiofsd daemon $VIRTIOFSD not available" |
| exit 1 |
| fi |
| fi |
| |
| if test -z "$VIRTFS_TYPE"; then |
| case "$FSTESTCFG" in |
| virtiofs*|*virtiofs*|*virtiofs) |
| VIRTFS_TYPE=virtiofs |
| ;; |
| *) |
| VIRTFS_TYPE=9p |
| ;; |
| esac |
| else |
| case "$VIRTFS_TYPE" in |
| 9p) ;; |
| virtiofs) |
| if test -z "$VIRTIOFSD" ; then |
| echo "virtiofsd not available can't use virtiofs" |
| exit 1 |
| fi |
| ;; |
| *) |
| echo "Unsupported virtfs type: $VIRTFS_TYPE" |
| exit 1 |
| esac |
| fi |
| if test -z "$VIRTFS_PATH"; then |
| VIRTFS_PATH=/tmp/kvm-xfstests-$USER |
| mkdir -p "$VIRTFS_PATH" |
| fi |
| |
| if test "$VIRTFS_TYPE" = "9p" ; then |
| VIRTFS="-fsdev local,id=v_tmp,path=$VIRTFS_PATH,security_model=none " |
| VIRTFS+="-device virtio-9p-pci,fsdev=v_tmp,mount_tag=v_tmp " |
| else |
| V_SOCK_PATH="/tmp/virtiofs-$USER" |
| "$VIRTIOFSD" --shared-dir $VIRTFS_PATH --socket-path "$V_SOCK_PATH" \ |
| >& /tmp/virtiofsd-$USER.log & |
| VIRTFS="-chardev socket,id=char0,path=$V_SOCK_PATH " |
| VIRTFS+="-device vhost-user-fs-pci,queue-size=1024,chardev=char0,tag=vtmp " |
| VIRTFS+="-object memory-backend-file,id=mem,size=${MEM}m,mem-path=/dev/shm,share=on -numa node,memdev=mem " |
| fi |
| |
| if test -z "$VIRTFS_MODEL"; then |
| VIRTFS_MODEL=none |
| fi |
| case "$FSTESTCFG" in |
| virtiofs*|*virtiofs*|*virtiofs|9p*|*9p*|*9p) |
| if test -z "$VIRTFS_TEST_PATH" ; then |
| VIRTFS_TEST_PATH=/tmp/virtfs-$USER-testdir |
| fi |
| if test -z "$VIRTFS_SCRATCHTEST_PATH" ; then |
| VIRTFS_SCRATCH_PATH=/tmp/virtfs-$USER-scratchdir |
| fi |
| ;; |
| esac |
| if test -n "$VIRTFS_TEST_PATH"; then |
| mkdir -p "$VIRTFS_TEST_PATH" |
| if test "$VIRTFS_TYPE" = "9p" ; then |
| VIRTFS+="-fsdev local,id=p9test,path=$VIRTFS_TEST_PATH," |
| VIRTFS+="security_model=$VIRTFS_MODEL " |
| VIRTFS+="-device virtio-9p-pci,fsdev=p9test,mount_tag=9ptest " |
| else |
| V_SOCK_PATH="/tmp/virtiofs-test-$USER" |
| "$VIRTIOFSD" --shared-dir "$VIRTFS_TEST_PATH" \ |
| --socket-path "$V_SOCK_PATH" \ |
| >& /tmp/virtiofsd-test-$USER.log & |
| VIRTFS+="-chardev socket,id=char1,path=$V_SOCK_PATH " |
| VIRTFS+="-device vhost-user-fs-pci,queue-size=1024," |
| VIRTFS+="chardev=char1,tag=virtiofs-test " |
| fi |
| fi |
| if test -n "$VIRTFS_SCRATCH_PATH"; then |
| mkdir -p "$VIRTFS_SCRATCH_PATH" |
| if test "$VIRTFS_TYPE" = "9p" ; then |
| VIRTFS+=" -fsdev local,id=p9scratch,path=$VIRTFS_SCRATCH_PATH," |
| VIRTFS+="security_model=$VIRTFS_MODEL " |
| VIRTFS+="-device virtio-9p-pci,fsdev=p9scratch,mount_tag=9pscratch " |
| else |
| V_SOCK_PATH="/tmp/virtiofs-scratch-$USER" |
| "$VIRTIOFSD" --shared-dir "$VIRTFS_SCRATCH_PATH" \ |
| --socket-path "$V_SOCK_PATH" \ |
| >& /tmp/virtiofsd-scratch-$USER.log & |
| VIRTFS+="-chardev socket,id=char2,path=$V_SOCK_PATH " |
| VIRTFS+="-device vhost-user-fs-pci,queue-size=1024," |
| VIRTFS+="chardev=char2,tag=virtiofs-scratch " |
| fi |
| fi |
| |
| VDH="$ourtmp/kvm-vdh" |
| tar -c -f "$VDH" -T /dev/null |
| |
| if test -z "$NO_ACTION" -a "$UPDATE_XFSTESTS" = "yes" |
| then |
| tar -r -f $VDH -C "$DIR/../fstests-bld" xfstests.tar.gz |
| fi |
| |
| if test -z "$NO_ACTION" -a "$UPDATE_EXTRA_TESTS" = "yes" |
| then |
| tar -r -f $VDH -C "$ourtmp" extra-tests.tar.gz |
| fi |
| |
| if test -z "$NO_ACTION" -a "$UPDATE_FILES" = "yes" |
| then |
| TDIR=$(mktemp -d /tmp/files.XXXXXXXX) |
| if test -z "$TDIR"; then |
| echo "Couldn't create temp directory" |
| exit 1 |
| fi |
| (cd "$DIR/../test-appliance"; \ |
| tar -X kvm-exclude-files -C files \ |
| --owner=root --group=root --mode=go+u-w -cf - . | \ |
| gzip -9n > "$TDIR/files.tar.gz") |
| tar -r -f $VDH -C "$TDIR" files.tar.gz |
| rm -rf "$TDIR" |
| fi |
| |
| if test -n "$MODULES" -a -f "$MODULES" |
| then |
| if test -z "$NO_ACTION" ; then |
| tar -r -f $VDH -C $(dirname "$MODULES") \ |
| --transform="s/.*/modules.tar.xz/" $(basename "$MODULES") |
| else |
| echo "Using modules from $MODULES" |
| fi |
| fi |
| |
| truncate -s 256M "$VDH" |
| chmod 600 "$VDH" |
| |
| mkdir -p /tmp/kvm-xfstests-$USER |
| |
| case "$ARCH" in |
| i386|amd64) |
| QEMU_ARCH=x86_64 |
| ACCEL=kvm:tcg |
| CONSOLE_DEV=ttyS0 |
| MACHINE_TYPE=${KVM_MACHTYPE:-q35} |
| CPU_TYPE=max |
| ;; |
| arm64) |
| QEMU_ARCH=aarch64 |
| if test "$(uname -o)" = "Darwin" ; then |
| ACCEL=hvf |
| GDB= |
| else |
| ACCEL=tcg |
| fi |
| CONSOLE_DEV=ttyAMA0 |
| MACHINE_TYPE=virt |
| CPU_TYPE=max |
| ;; |
| *) |
| echo "Unsupported architecture: $ARCH" |
| exit 1; |
| esac |
| QEMU="qemu-system-$QEMU_ARCH" |
| |
| if test "$CACHE" != "none" ; then |
| AIO= |
| fi |
| |
| if test -n "$CACHE" ; then |
| CACHE="cache=$CACHE," |
| fi |
| CONARG="console=$CONSOLE_DEV,115200" |
| if test -n "$VIRTCONSOLE" ; then |
| CONARG="console=hvc0 $CONARG" |
| fi |
| |
| $NO_ACTION $IONICE $QEMU -boot order=c $NET \ |
| -machine $MACHINE_TYPE,accel=$ACCEL -cpu $CPU_TYPE \ |
| -drive file=$ROOT_FS,if=virtio$SNAPSHOT \ |
| -drive file=$VDB,${CACHE}if=virtio,format=raw$AIO \ |
| -drive file=$VDC,${CACHE}if=virtio,format=raw$AIO \ |
| -drive file=$VDD,${CACHE}if=virtio,format=raw$AIO \ |
| -drive file=$VDE,${CACHE}if=virtio,format=raw$AIO \ |
| -drive file=$VDF,${CACHE}if=virtio,format=raw$AIO \ |
| -drive file=$VDG,${CACHE}if=virtio,format=raw$AIO \ |
| -drive file=$VDH,if=virtio,format=raw \ |
| -drive file=$VDI,${CACHE}if=virtio,format=raw$AIO \ |
| -drive file=$VDJ,${CACHE}if=virtio,format=raw$AIO \ |
| -vga none -nographic -smp $NR_CPU -m $MEM \ |
| $VIRTFS \ |
| $VIRTIO_RNG \ |
| $VIRTCONSOLE \ |
| $CONSOLE \ |
| $MONITOR \ |
| $SERIAL \ |
| $GDB \ |
| $NUMA \ |
| --kernel $KERNEL \ |
| $INITRD \ |
| --append "$QUIET root=$ROOT_DEV $CONARG nokaslr $ARG $EXTRA_ARG" |\ |
| tee $LOGFILE |
| |
| TDIR=$(mktemp -d /tmp/files.XXXXXXXX) |
| if test -z "$NO_ACTION" ; then |
| tar -C "$TDIR" -xf "$VDH" . |
| fi |
| if test -f "$TDIR/exit_code" ; then |
| read exit_code < "$TDIR/exit_code" |
| fi |
| if test -f "$TDIR/results.tar.xz" ; then |
| mv "$TDIR/results.tar.xz" $RESULTFILE |
| echo "result in $RESULTFILE" |
| fi |
| rm -rf "$TDIR" |
| if test -n "$SKIP_LOG" ; then |
| rm $LOGFILE |
| else |
| sed -i -e '/^-------------------- Summary report/,$d' $LOGFILE |
| echo "logfile in $LOGFILE" |
| fi |
| # Fix line wrap from qemu |
| echo -ne '\e[?7h' |
| exit $exit_code |