[systemd-devel] [PATCH] test: add run-qemu script

Zbigniew Jędrzejewski-Szmek zbyszek at in.waw.pl
Fri Dec 6 17:42:50 PST 2013


On Thu, Dec 05, 2013 at 06:24:58PM +0100, Ronny Chevalier wrote:
> from Alexander Graf's script: http://www.spinics.net/lists/kvm/msg72389.html
> ---
> Hi,
> 
> It adds a little script which try to find a QEMU binary on the system and
> enable kvm if it's available. This script is used when running QEMU in the
> tests. (We can also specify a different kernel and initramfs)
Hi Ronny,
since this is code from the kernel, it is implicitly GPLv2 licensed.
systemd is suppose to be / become LGPLv2+ as a whole, and including this
make this impossible. But anyway, I think that large parts of are not
necessary for us:
- we don't care about old qemu versions, we always assume that
  a person running systemd from git has bleeding edge versions of
  all dependencies updated from the experimental branch each morning,
- we don't care about insane people who compile qemu from source,
  instead of using the package manager. (I know that this contradicts
  the first point, but who said that developer's life is easy ;) )
- if something is missing just say so, no explanation or instructions
  necesary.

Otherwise the changes look OK.

>  TODO                            |   1 -
>  test/README.testsuite           |  19 ++++-
>  test/TEST-01-BASIC/test.sh      |   6 +-
>  test/TEST-02-CRYPTSETUP/test.sh |   6 +-
>  test/TEST-03-JOBS/test.sh       |   6 +-
>  test/run-qemu.sh                | 150 ++++++++++++++++++++++++++++++++++++++++
>  test/test-functions             |  10 +--
>  7 files changed, 170 insertions(+), 28 deletions(-)
>  create mode 100755 test/run-qemu.sh
> 
> diff --git a/TODO b/TODO
> index 9698082..f493dbb 100644
> --- a/TODO
> +++ b/TODO
> @@ -168,7 +168,6 @@ Features:
>  * test/:
>    - add 'set -e' to scripts in test/
>    - make stuff in test/ work with separate output dir
> -  - qemu wrapper script: http://www.spinics.net/lists/kvm/msg72389.html
>  
>  * systemctl delete x.snapshot leaves no trace in logs (at least at default level).
>  
> diff --git a/test/README.testsuite b/test/README.testsuite
> index 54d0eaa..3b841cd 100644
> --- a/test/README.testsuite
> +++ b/test/README.testsuite
> @@ -25,11 +25,24 @@ $ make all
>  $ cd test/TEST-01-BASIC
>  $ sudo make clean setup run
>  
> +QEMU
> +====
> +
>  If you want to log in the testsuite virtual machine, you can specify
> -additional kernel command line parameter with $DEBUGFAIL.
> +additional kernel command line parameter with $KERNEL_APPEND.
>  
> -$ sudo make DEBUGFAIL="systemd.unit=multi-user.target" clean setup run
> +$ sudo make KERNEL_APPEND="systemd.unit=multi-user.target" clean setup run
>  
>  you can even skip the "clean" and "setup" if you want to run the machine again.
>  
> -$ sudo make DEBUGFAIL="systemd.unit=multi-user.target" run
> +$ sudo make KERNEL_APPEND="systemd.unit=multi-user.target" run
> +
> +You can specify a different kernel and initramfs with $KERNEL_BIN and $INITRD.
> +(Fedora's default kernel path and initramfs are used by default)
> +
> +$ sudo make KERNEL_BIN=/boot/vmlinuz-foo INITRD=/boot/initramfs-bar clean check
> +
> +A script will try to find your QEMU binary. If you want to specify a different
> +one you can use $QEMU_BIN.
> +
> +$ sudo make QEMU_BIN=/path/to/qemu/qemu-kvm clean check
> diff --git a/test/TEST-01-BASIC/test.sh b/test/TEST-01-BASIC/test.sh
> index aaf63f4..c598af9 100755
> --- a/test/TEST-01-BASIC/test.sh
> +++ b/test/TEST-01-BASIC/test.sh
> @@ -5,9 +5,6 @@ TEST_DESCRIPTION="Basic systemd setup"
>  
>  . $TEST_BASE_DIR/test-functions
>  
> -# Uncomment this to debug failures
> -#DEBUGFAIL="systemd.unit=multi-user.target"
> -
>  check_result_qemu() {
>      ret=1
>      mkdir -p $TESTDIR/root
> @@ -23,8 +20,7 @@ check_result_qemu() {
>  }
>  
>  test_run() {
> -    if check_qemu ; then
> -        run_qemu
> +    if run_qemu; then
>          check_result_qemu || return 1
>      else
>          dwarn "can't run qemu-kvm, skipping"
> diff --git a/test/TEST-02-CRYPTSETUP/test.sh b/test/TEST-02-CRYPTSETUP/test.sh
> index 86617df..b9161e7 100755
> --- a/test/TEST-02-CRYPTSETUP/test.sh
> +++ b/test/TEST-02-CRYPTSETUP/test.sh
> @@ -5,9 +5,6 @@ TEST_DESCRIPTION="cryptsetup systemd setup"
>  
>  . $TEST_BASE_DIR/test-functions
>  
> -# Uncomment this to debug failures
> -#DEBUGFAIL="systemd.unit=multi-user.target"
> -
>  check_result_qemu() {
>      ret=1
>      mkdir -p $TESTDIR/root
> @@ -28,8 +25,7 @@ check_result_qemu() {
>  
>  
>  test_run() {
> -    if check_qemu ; then
> -        run_qemu
> +    if run_qemu; then
>          check_result_qemu || return 1
>      else
>          dwarn "can't run qemu-kvm, skipping"
> diff --git a/test/TEST-03-JOBS/test.sh b/test/TEST-03-JOBS/test.sh
> index 6303258..9190eb0 100755
> --- a/test/TEST-03-JOBS/test.sh
> +++ b/test/TEST-03-JOBS/test.sh
> @@ -5,9 +5,6 @@ TEST_DESCRIPTION="Job-related tests"
>  
>  . $TEST_BASE_DIR/test-functions
>  
> -# Uncomment this to debug failures
> -#DEBUGFAIL="systemd.unit=multi-user.target"
> -
>  check_result_qemu() {
>      ret=1
>      mkdir -p $TESTDIR/root
> @@ -23,8 +20,7 @@ check_result_qemu() {
>  }
>  
>  test_run() {
> -    if check_qemu ; then
> -        run_qemu
> +    if run_qemu; then
>          check_result_qemu || return 1
>      else
>          dwarn "can't run qemu-kvm, skipping"
> diff --git a/test/run-qemu.sh b/test/run-qemu.sh
> new file mode 100755
> index 0000000..17708da
> --- /dev/null
> +++ b/test/run-qemu.sh
> @@ -0,0 +1,150 @@
> +#!/bin/bash
> +#
> +# based on: http://www.spinics.net/lists/kvm/msg72389.html
> +#
> +
> +# Uncomment this to debug failures
> +#KERNEL_APPEND="systemd.unit=multi-user.target"
> +KERNEL_VER=${KERNEL_VER-$(uname -r)}
> +[ "$KERNEL_BIN" ] || KERNEL_BIN=/boot/vmlinuz-$KERNEL_VER
> +[ "$INITRD" ] || INITRD=/boot/initramfs-${KERNEL_VER}.img
> +[ "$SMP" ] || SMP=1
> +BASENAME=$(basename "$0")
> +IMAGE=
> +
> +function usage() {
> +    echo "$BASENAME IMAGE -- [QEMU_OPTIONS]"
> +}
> +
> +function verify_qemu() {
> +    QEMU="$(which $1 2>/dev/null)"
> +
> +    # binary exists?
> +    [ -x "$QEMU" ] || exit 1
> +
> +    # we need a version that knows -machine
> +    if ! "$QEMU" --help | grep -q -- '-machine'; then
> +        exit 1
> +    fi
> +
> +    echo "$QEMU"
> +    exit 0
> +}
> +
> +function find_qemu_bin() {
> +    # Try to find the KVM accelerated QEMU binary
> +
> +    # SUSE and Red Hat call the binary qemu-kvm
> +    [ "$QEMU_BIN" ] && return || QEMU_BIN=$(verify_qemu qemu-kvm)
> +
> +    # Debian and Gentoo call it kvm
> +    [ "$QEMU_BIN" ] && return || QEMU_BIN=$(verify_qemu kvm)
> +
> +    [ "$ARCH" ] || ARCH=$(uname -m)
> +    case $ARCH in
> +    x86_64)
> +        # QEMU's own build system calls it qemu-system-x86_64
> +        [ "$QEMU_BIN" ] || QEMU_BIN=$(verify_qemu qemu-system-x86_64)
> +        ;;
> +    i*86)
> +        # new i386 version of QEMU
> +        [ "$QEMU_BIN" ] || QEMU_BIN=$(verify_qemu qemu-system-i386)
> +
> +        # i386 version of QEMU
> +        [ "$QEMU_BIN" ] || QEMU_BIN=$(verify_qemu qemu)
> +        ;;
> +    esac

I think if you say
  QEMU_BIN=$(LANG=C which qemu qemu-kvm qemu-system-$ARCH | grep '^/' -m1)
the effect will be similar without all the verbosity.

> +
> +    if [ ! -e "$QEMU_BIN" ]; then
> +        echo "\
> +Could not find a usable QEMU binary. Please install one from \
> +your distro or from source code using:
> +
> +$ git clone git://git.qemu.org/qemu.git
> +$ cd qemu
> +$ ./configure
> +$ make -j
> +$ sudo make install
> +
> +or point this script to a working version of qemu using
> +
> +$ export QEMU_BIN=/path/to/qemu-kvm
> +" >&2
> +        exit 1
> +	fi
> +
> +    # The binaries without kvm in their name can be too old to support KVM, so
> +    # check for that before the user gets confused
> +    if [ ! "$(echo $QEMU_BIN | grep kvm)" -a \
> +        ! "$($QEMU_BIN --help | egrep '^-machine')" ]; then
> +        echo "Your QEMU binary is too old, please update to at least 0.15." >&2
> +        exit 1
> +    fi
> +}
>
> +
> +GETOPT=`getopt -o h --long help -n "$(basename \"$0\")" -- "$@"`
> +
> +if [ $? != 0 ]; then
> +    echo "Terminating..." >&2
> +    exit 1
> +fi
> +
> +eval set -- "$GETOPT"
> +
> +while true; do
> +    case "$1" in
> +        -h|--help)
> +            usage
> +            exit 0
> +            ;;
> +        --)
> +            shift
> +            break
> +            ;;
> +        *)
> +            echo "Could not parse option: $1" >&2
> +            exit 1
> +            ;;
> +    esac
> +    shift
> +done
> +IMAGE=$1
> +shift
> +
> +if [ ! -e "$KERNEL_BIN" ]; then
> +    echo "Could not find kernel binary: $KERNEL_BIN" >&2
> +    exit 1
> +fi
> +
> +if [ ! -e "$IMAGE" ]; then
> +    echo "Could not find image: $IMAGE" >&2
> +    exit 1
> +fi
> +
> +find_qemu_bin
> +
> +KERNEL_APPEND="root=/dev/sda1 \
> +systemd.log_level=debug \
> +raid=noautodetect \
> +loglevel=2 \
> +init=/usr/lib/systemd/systemd \
> +ro \
> +console=ttyS0 \
> +selinux=0 \
> +$KERNEL_APPEND \
> +"
> +
> +QEMU_OPTIONS="-machine accel=kvm:tcg \
> +-smp $SMP \
> +-net none \
> +-m 512M \
> +-nographic \
> +-kernel $KERNEL_BIN \
> +"
> +
> +if [ "$INITRD" ]; then
> +    QEMU_OPTIONS="$QEMU_OPTIONS -initrd $INITRD"
> +fi
> +
> +echo "$QEMU_BIN $QEMU_OPTIONS -append \"$KERNEL_APPEND\" $@ $IMAGE"
> +$QEMU_BIN $QEMU_OPTIONS -append "$KERNEL_APPEND" "$@" $IMAGE
> diff --git a/test/test-functions b/test/test-functions
> index a184ed7..da3bd07 100644
> --- a/test/test-functions
> +++ b/test/test-functions
> @@ -11,11 +11,7 @@ BASICTOOLS="sh bash setsid loadkeys setfont login sushell sulogin gzip sleep ech
>  DEBUGTOOLS="df free ls stty cat ps ln ip route dmesg dhclient mkdir cp ping dhclient strace less grep id tty touch du sort"
>  
>  run_qemu() {
> -    qemu-kvm \
> -        -hda $TESTDIR/rootdisk.img \
> -        -m 512M -nographic \
> -        -net none -kernel /boot/vmlinuz-$KERNEL_VER \
> -        -append "root=/dev/sda1 systemd.log_level=debug raid=noautodetect loglevel=2 init=/usr/lib/systemd/systemd ro console=ttyS0,115200n81 selinux=0 $DEBUGFAIL" || return 1
> +    ../run-qemu.sh $TESTDIR/rootdisk.img || return 1
>  }
>  
>  run_nspawn() {
> @@ -1043,10 +1039,6 @@ inst_libdir_file() {
>      fi
>  }
>  
> -check_qemu() {
> -    command -v qemu-kvm &>/dev/null && [[ -c /dev/kvm ]]
> -}
> -
>  check_nspawn() {
>      [[ -d /sys/fs/cgroup/systemd ]]
>  }

Zbyszek


More information about the systemd-devel mailing list