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

Ronny Chevalier chevalier.ronny at gmail.com
Sat Dec 7 04:51:53 PST 2013


2013/12/7 Zbigniew Jędrzejewski-Szmek <zbyszek at in.waw.pl>:
> 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.
Ok, that makes sense

>
> 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.
Not really since in qemu-system-XXXX, the XXXX part is general. For
ARM for instance, there is just arm and not armv7l or others. The same
for i386/i686,... It works for most people if they have common
architecture like x86_64 or i386.
I think the switch can be updated for each architecture someone is aware of.

So I remove all useless parts in the script, keep the switch to find
the suitable binary and resend the patch ? Because I think this kind
of script is still useful to avoid modifying manually test-functions
and searching which are the options and binary name. And maybe just
leave this in test-functions, because a separate file is not really
useful now.
But is it still gonna be a problem for the license ?

>
>> +
>> +    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