From 389e776676b2adcdb8d5f05546d3a0bbd33a4104 Mon Sep 17 00:00:00 2001 From: Justin Cormack Date: Mon, 22 May 2017 11:31:05 +0100 Subject: [PATCH 1/6] Update moby tool This now supports setting `source:` in the `files` section to read the contents of a file rather than specifying it inline. Signed-off-by: Justin Cormack --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 5e4e1fd85..c7d7ac140 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ endif PREFIX?=/usr/local/ -MOBY_COMMIT=339aa5ec863c0cdabbe8331c7f530f6459a8fe92 +MOBY_COMMIT=b47f3dec4a8357bc3ee4da878c402700d3fed62e bin/moby: | bin docker run --rm --log-driver=none $(CROSS) $(GO_COMPILE) --clone-path github.com/moby/tool --clone https://github.com/moby/tool.git --commit $(MOBY_COMMIT) --package github.com/moby/tool/cmd/moby --ldflags "-X main.GitCommit=$(GIT_COMMIT) -X main.Version=$(VERSION)" -o $@ > tmp_moby_bin.tar tar xf tmp_moby_bin.tar > $@ From 0fa440938a6f2d0886d42fd209e4d0d302f40e9b Mon Sep 17 00:00:00 2001 From: Rolf Neugebauer Date: Mon, 22 May 2017 12:09:25 +0100 Subject: [PATCH 2/6] tests: Fix cleanup for qemu tests Signed-off-by: Rolf Neugebauer --- test/cases/010_platforms/000_qemu/000_run_kernel/test.sh | 2 +- test/cases/010_platforms/000_qemu/010_run_iso/test.sh | 2 +- test/cases/010_platforms/000_qemu/020_run_efi/test.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/cases/010_platforms/000_qemu/000_run_kernel/test.sh b/test/cases/010_platforms/000_qemu/000_run_kernel/test.sh index f3f033164..a9ebb6823 100644 --- a/test/cases/010_platforms/000_qemu/000_run_kernel/test.sh +++ b/test/cases/010_platforms/000_qemu/000_run_kernel/test.sh @@ -14,7 +14,7 @@ NAME=qemu-kernel clean_up() { # remove any files, containers, images etc - rm -rf "${NAME}*" || true + rm -rf ${NAME}* || true } trap clean_up EXIT diff --git a/test/cases/010_platforms/000_qemu/010_run_iso/test.sh b/test/cases/010_platforms/000_qemu/010_run_iso/test.sh index dae34b3d1..b660acda3 100644 --- a/test/cases/010_platforms/000_qemu/010_run_iso/test.sh +++ b/test/cases/010_platforms/000_qemu/010_run_iso/test.sh @@ -13,7 +13,7 @@ set -e NAME=qemu-iso clean_up() { - rm -rf "${NAME}*" || true + rm -rf ${NAME}* || true } trap clean_up EXIT diff --git a/test/cases/010_platforms/000_qemu/020_run_efi/test.sh b/test/cases/010_platforms/000_qemu/020_run_efi/test.sh index 4bef989cd..dbe75c572 100644 --- a/test/cases/010_platforms/000_qemu/020_run_efi/test.sh +++ b/test/cases/010_platforms/000_qemu/020_run_efi/test.sh @@ -14,7 +14,7 @@ NAME=qemu-efi clean_up() { # remove any files, containers, images etc - rm -rf "${NAME}*" || true + rm -rf ${NAME}* || true } trap clean_up EXIT From e1920b4f221c42ebcf3335a855a8024eadf41617 Mon Sep 17 00:00:00 2001 From: Rolf Neugebauer Date: Fri, 19 May 2017 11:34:19 +0100 Subject: [PATCH 3/6] tests: Add a test for running qemu in a container The qemu backend defaults to running against a locally installed qemu but falls back to running in a container if qemu is not installed. This test explicitly tests that the containerised qemu backend works only if there is a locally installed qemu. Signed-off-by: Rolf Neugebauer --- .../000_qemu/100_container/test.sh | 35 +++++++++++++++++++ .../000_qemu/100_container/test.yml | 16 +++++++++ 2 files changed, 51 insertions(+) create mode 100644 test/cases/010_platforms/000_qemu/100_container/test.sh create mode 100644 test/cases/010_platforms/000_qemu/100_container/test.yml diff --git a/test/cases/010_platforms/000_qemu/100_container/test.sh b/test/cases/010_platforms/000_qemu/100_container/test.sh new file mode 100644 index 000000000..dc2c091cf --- /dev/null +++ b/test/cases/010_platforms/000_qemu/100_container/test.sh @@ -0,0 +1,35 @@ +#!/bin/sh +# SUMMARY: Check that qemu runs containerised +# LABELS: +# AUTHOR: Rolf Neugebauer + +set -e + +# Source libraries. Uncomment if needed/defined +#. "${RT_LIB}" +. "${RT_PROJECT_ROOT}/_lib/lib.sh" + +NAME=qemu-kernel + +clean_up() { + # remove any files, containers, images etc + rm -rf ${NAME}* || true +} + +trap clean_up EXIT + +# check if qemu is installed locally +QEMU=$(command -v qemu-system-x86_64 || true) +if [ -z "${QEMU}" ]; then + # No qemu installed so don't bother to test as all the other + # qemu tests would have been run containerised + echo "No locally installed qemu" + exit $RT_CANCEL +fi + +moby build -name "${NAME}" test.yml +[ -f "${NAME}-kernel" ] || exit 1 +[ -f "${NAME}-initrd.img" ] || exit 1 +[ -f "${NAME}-cmdline" ]|| exit 1 +linuxkit run qemu -containerized "${NAME}" | grep -q "Welcome to LinuxKit" +exit 0 diff --git a/test/cases/010_platforms/000_qemu/100_container/test.yml b/test/cases/010_platforms/000_qemu/100_container/test.yml new file mode 100644 index 000000000..5f5a5da05 --- /dev/null +++ b/test/cases/010_platforms/000_qemu/100_container/test.yml @@ -0,0 +1,16 @@ +kernel: + image: "linuxkit/kernel:4.9.x" + cmdline: "console=ttyS0 console=tty0 page_poison=1" +init: + - linuxkit/init:cbd7ae748f0a082516501a3e914fa0c924ee941e + - linuxkit/runc:24dfe632ed3ff53a026ee3fac046fd544434e2d6 + - linuxkit/containerd:f1130450206d4f64f0ddc13d15bb68435aa1ff61 +onboot: + - name: poweroff + image: "linuxkit/poweroff:a8f1e4ad8d459f1fdaad9e4b007512cb3b504ae8" + command: ["/bin/sh", "/poweroff.sh", "3"] +trust: + image: + - linuxkit/kernel +outputs: + - format: kernel+initrd From e62e94a24030e35be0ae4d976e399a32645b0e67 Mon Sep 17 00:00:00 2001 From: Rolf Neugebauer Date: Fri, 19 May 2017 11:50:01 +0100 Subject: [PATCH 4/6] tests: Run config tests on all kernels we support - Add a test for the kernel config for each supported kernel - simplify YAML files: no need for ca certificates nor DHCP - Explicitly state that the kernel module tests are for the 4.9 kernel. Signed-off-by: Rolf Neugebauer --- .../000_config_4.4.x/test-kernel-config.yml | 16 +++++++++++++ .../{000_config => 000_config_4.4.x}/test.sh | 0 .../test-kernel-config.yml | 12 ---------- .../cases/020_kernel/001_config_4.9.x/test.sh | 23 +++++++++++++++++++ .../002_config_4.10.x/test-kernel-config.yml | 16 +++++++++++++ .../020_kernel/002_config_4.10.x/test.sh | 23 +++++++++++++++++++ .../003_config_4.11.x/test-kernel-config.yml | 16 +++++++++++++ .../020_kernel/003_config_4.11.x/test.sh | 23 +++++++++++++++++++ .../{010_kmod => 010_kmod_4.9.x}/Dockerfile | 0 .../{010_kmod => 010_kmod_4.9.x}/check.sh | 0 .../{010_kmod => 010_kmod_4.9.x}/kmod.yml | 0 .../{010_kmod => 010_kmod_4.9.x}/src/Makefile | 0 .../src/hello_world.c | 0 .../{010_kmod => 010_kmod_4.9.x}/test.sh | 0 14 files changed, 117 insertions(+), 12 deletions(-) create mode 100644 test/cases/020_kernel/000_config_4.4.x/test-kernel-config.yml rename test/cases/020_kernel/{000_config => 000_config_4.4.x}/test.sh (100%) rename test/cases/020_kernel/{000_config => 001_config_4.9.x}/test-kernel-config.yml (60%) create mode 100644 test/cases/020_kernel/001_config_4.9.x/test.sh create mode 100644 test/cases/020_kernel/002_config_4.10.x/test-kernel-config.yml create mode 100644 test/cases/020_kernel/002_config_4.10.x/test.sh create mode 100644 test/cases/020_kernel/003_config_4.11.x/test-kernel-config.yml create mode 100644 test/cases/020_kernel/003_config_4.11.x/test.sh rename test/cases/020_kernel/{010_kmod => 010_kmod_4.9.x}/Dockerfile (100%) rename test/cases/020_kernel/{010_kmod => 010_kmod_4.9.x}/check.sh (100%) rename test/cases/020_kernel/{010_kmod => 010_kmod_4.9.x}/kmod.yml (100%) rename test/cases/020_kernel/{010_kmod => 010_kmod_4.9.x}/src/Makefile (100%) rename test/cases/020_kernel/{010_kmod => 010_kmod_4.9.x}/src/hello_world.c (100%) rename test/cases/020_kernel/{010_kmod => 010_kmod_4.9.x}/test.sh (100%) diff --git a/test/cases/020_kernel/000_config_4.4.x/test-kernel-config.yml b/test/cases/020_kernel/000_config_4.4.x/test-kernel-config.yml new file mode 100644 index 000000000..6c0db2dfb --- /dev/null +++ b/test/cases/020_kernel/000_config_4.4.x/test-kernel-config.yml @@ -0,0 +1,16 @@ +kernel: + image: "linuxkit/kernel:4.4.x" + cmdline: "console=ttyS0" +init: + - linuxkit/init:cbd7ae748f0a082516501a3e914fa0c924ee941e + - linuxkit/runc:24dfe632ed3ff53a026ee3fac046fd544434e2d6 + - linuxkit/containerd:f1130450206d4f64f0ddc13d15bb68435aa1ff61 +onboot: + - name: check-kernel-config + image: "linuxkit/test-kernel-config:ecff41279ccbc408079a3996a956432651c6eb9c" + readonly: true + - name: poweroff + image: "linuxkit/poweroff:a8f1e4ad8d459f1fdaad9e4b007512cb3b504ae8" + command: ["/bin/sh", "/poweroff.sh", "3"] +outputs: + - format: kernel+initrd diff --git a/test/cases/020_kernel/000_config/test.sh b/test/cases/020_kernel/000_config_4.4.x/test.sh similarity index 100% rename from test/cases/020_kernel/000_config/test.sh rename to test/cases/020_kernel/000_config_4.4.x/test.sh diff --git a/test/cases/020_kernel/000_config/test-kernel-config.yml b/test/cases/020_kernel/001_config_4.9.x/test-kernel-config.yml similarity index 60% rename from test/cases/020_kernel/000_config/test-kernel-config.yml rename to test/cases/020_kernel/001_config_4.9.x/test-kernel-config.yml index 8146aa2fb..ac928292b 100644 --- a/test/cases/020_kernel/000_config/test-kernel-config.yml +++ b/test/cases/020_kernel/001_config_4.9.x/test-kernel-config.yml @@ -5,19 +5,7 @@ init: - linuxkit/init:cbd7ae748f0a082516501a3e914fa0c924ee941e - linuxkit/runc:24dfe632ed3ff53a026ee3fac046fd544434e2d6 - linuxkit/containerd:f1130450206d4f64f0ddc13d15bb68435aa1ff61 - - linuxkit/ca-certificates:4e9a83e890e6477dcd25029fc4f1ced61d0642f4 onboot: - - name: dhcpcd - image: "linuxkit/dhcpcd:cb96c09a33c166eca6530f166f0f79927c3e83b0" - binds: - - /var:/var - - /tmp:/etc - capabilities: - - CAP_NET_ADMIN - - CAP_NET_BIND_SERVICE - - CAP_NET_RAW - net: host - command: ["/sbin/dhcpcd", "--nobackground", "-f", "/dhcpcd.conf", "-1"] - name: check-kernel-config image: "linuxkit/test-kernel-config:ecff41279ccbc408079a3996a956432651c6eb9c" readonly: true diff --git a/test/cases/020_kernel/001_config_4.9.x/test.sh b/test/cases/020_kernel/001_config_4.9.x/test.sh new file mode 100644 index 000000000..7883df33b --- /dev/null +++ b/test/cases/020_kernel/001_config_4.9.x/test.sh @@ -0,0 +1,23 @@ +#!/bin/sh +# SUMMARY: Sanity check on the kernel config file +# LABELS: +# REPEAT: +# AUTHOR: Dave Tucker + +set -e + +# Source libraries. Uncomment if needed/defined +#. "${RT_LIB}" +. "${RT_PROJECT_ROOT}/_lib/lib.sh" + +clean_up() { + find . -iname "test-kernel-config*" -not -iname "*.yml" -exec rm -rf {} \; +} +trap clean_up EXIT + +# Test code goes here +moby build test-kernel-config +RESULT="$(linuxkit run qemu test-kernel-config)" +echo "${RESULT}" | grep -q "suite PASSED" + +exit 0 diff --git a/test/cases/020_kernel/002_config_4.10.x/test-kernel-config.yml b/test/cases/020_kernel/002_config_4.10.x/test-kernel-config.yml new file mode 100644 index 000000000..f54ef34a3 --- /dev/null +++ b/test/cases/020_kernel/002_config_4.10.x/test-kernel-config.yml @@ -0,0 +1,16 @@ +kernel: + image: "linuxkit/kernel:4.10.x" + cmdline: "console=ttyS0" +init: + - linuxkit/init:cbd7ae748f0a082516501a3e914fa0c924ee941e + - linuxkit/runc:24dfe632ed3ff53a026ee3fac046fd544434e2d6 + - linuxkit/containerd:f1130450206d4f64f0ddc13d15bb68435aa1ff61 +onboot: + - name: check-kernel-config + image: "linuxkit/test-kernel-config:ecff41279ccbc408079a3996a956432651c6eb9c" + readonly: true + - name: poweroff + image: "linuxkit/poweroff:a8f1e4ad8d459f1fdaad9e4b007512cb3b504ae8" + command: ["/bin/sh", "/poweroff.sh", "3"] +outputs: + - format: kernel+initrd diff --git a/test/cases/020_kernel/002_config_4.10.x/test.sh b/test/cases/020_kernel/002_config_4.10.x/test.sh new file mode 100644 index 000000000..7883df33b --- /dev/null +++ b/test/cases/020_kernel/002_config_4.10.x/test.sh @@ -0,0 +1,23 @@ +#!/bin/sh +# SUMMARY: Sanity check on the kernel config file +# LABELS: +# REPEAT: +# AUTHOR: Dave Tucker + +set -e + +# Source libraries. Uncomment if needed/defined +#. "${RT_LIB}" +. "${RT_PROJECT_ROOT}/_lib/lib.sh" + +clean_up() { + find . -iname "test-kernel-config*" -not -iname "*.yml" -exec rm -rf {} \; +} +trap clean_up EXIT + +# Test code goes here +moby build test-kernel-config +RESULT="$(linuxkit run qemu test-kernel-config)" +echo "${RESULT}" | grep -q "suite PASSED" + +exit 0 diff --git a/test/cases/020_kernel/003_config_4.11.x/test-kernel-config.yml b/test/cases/020_kernel/003_config_4.11.x/test-kernel-config.yml new file mode 100644 index 000000000..412fb2a11 --- /dev/null +++ b/test/cases/020_kernel/003_config_4.11.x/test-kernel-config.yml @@ -0,0 +1,16 @@ +kernel: + image: "linuxkit/kernel:4.11.x" + cmdline: "console=ttyS0" +init: + - linuxkit/init:cbd7ae748f0a082516501a3e914fa0c924ee941e + - linuxkit/runc:24dfe632ed3ff53a026ee3fac046fd544434e2d6 + - linuxkit/containerd:f1130450206d4f64f0ddc13d15bb68435aa1ff61 +onboot: + - name: check-kernel-config + image: "linuxkit/test-kernel-config:ecff41279ccbc408079a3996a956432651c6eb9c" + readonly: true + - name: poweroff + image: "linuxkit/poweroff:a8f1e4ad8d459f1fdaad9e4b007512cb3b504ae8" + command: ["/bin/sh", "/poweroff.sh", "3"] +outputs: + - format: kernel+initrd diff --git a/test/cases/020_kernel/003_config_4.11.x/test.sh b/test/cases/020_kernel/003_config_4.11.x/test.sh new file mode 100644 index 000000000..7883df33b --- /dev/null +++ b/test/cases/020_kernel/003_config_4.11.x/test.sh @@ -0,0 +1,23 @@ +#!/bin/sh +# SUMMARY: Sanity check on the kernel config file +# LABELS: +# REPEAT: +# AUTHOR: Dave Tucker + +set -e + +# Source libraries. Uncomment if needed/defined +#. "${RT_LIB}" +. "${RT_PROJECT_ROOT}/_lib/lib.sh" + +clean_up() { + find . -iname "test-kernel-config*" -not -iname "*.yml" -exec rm -rf {} \; +} +trap clean_up EXIT + +# Test code goes here +moby build test-kernel-config +RESULT="$(linuxkit run qemu test-kernel-config)" +echo "${RESULT}" | grep -q "suite PASSED" + +exit 0 diff --git a/test/cases/020_kernel/010_kmod/Dockerfile b/test/cases/020_kernel/010_kmod_4.9.x/Dockerfile similarity index 100% rename from test/cases/020_kernel/010_kmod/Dockerfile rename to test/cases/020_kernel/010_kmod_4.9.x/Dockerfile diff --git a/test/cases/020_kernel/010_kmod/check.sh b/test/cases/020_kernel/010_kmod_4.9.x/check.sh similarity index 100% rename from test/cases/020_kernel/010_kmod/check.sh rename to test/cases/020_kernel/010_kmod_4.9.x/check.sh diff --git a/test/cases/020_kernel/010_kmod/kmod.yml b/test/cases/020_kernel/010_kmod_4.9.x/kmod.yml similarity index 100% rename from test/cases/020_kernel/010_kmod/kmod.yml rename to test/cases/020_kernel/010_kmod_4.9.x/kmod.yml diff --git a/test/cases/020_kernel/010_kmod/src/Makefile b/test/cases/020_kernel/010_kmod_4.9.x/src/Makefile similarity index 100% rename from test/cases/020_kernel/010_kmod/src/Makefile rename to test/cases/020_kernel/010_kmod_4.9.x/src/Makefile diff --git a/test/cases/020_kernel/010_kmod/src/hello_world.c b/test/cases/020_kernel/010_kmod_4.9.x/src/hello_world.c similarity index 100% rename from test/cases/020_kernel/010_kmod/src/hello_world.c rename to test/cases/020_kernel/010_kmod_4.9.x/src/hello_world.c diff --git a/test/cases/020_kernel/010_kmod/test.sh b/test/cases/020_kernel/010_kmod_4.9.x/test.sh similarity index 100% rename from test/cases/020_kernel/010_kmod/test.sh rename to test/cases/020_kernel/010_kmod_4.9.x/test.sh From 822d179a2b6da82171c063d3084d0cff297c1448 Mon Sep 17 00:00:00 2001 From: Rolf Neugebauer Date: Mon, 22 May 2017 12:02:17 +0100 Subject: [PATCH 5/6] tests: Add initial hyperkit tun test This uses 'expect' instead of 'grep' because hyperkit is a bit finicky with re-directing the output (it expects a tty). 'expect' handles this and is installed on macOS by default. Signed-off-by: Rolf Neugebauer --- .../010_hyperkit/000_run_kernel/test.exp | 31 +++++++++++++++++++ .../010_hyperkit/000_run_kernel/test.sh | 27 ++++++++++++++++ .../010_hyperkit/000_run_kernel/test.yml | 16 ++++++++++ 3 files changed, 74 insertions(+) create mode 100755 test/cases/010_platforms/010_hyperkit/000_run_kernel/test.exp create mode 100644 test/cases/010_platforms/010_hyperkit/000_run_kernel/test.sh create mode 100644 test/cases/010_platforms/010_hyperkit/000_run_kernel/test.yml diff --git a/test/cases/010_platforms/010_hyperkit/000_run_kernel/test.exp b/test/cases/010_platforms/010_hyperkit/000_run_kernel/test.exp new file mode 100755 index 000000000..1385259a3 --- /dev/null +++ b/test/cases/010_platforms/010_hyperkit/000_run_kernel/test.exp @@ -0,0 +1,31 @@ +#!/usr/bin/env expect +spawn linuxkit run hyperkit hyperkit-kernel +set pid [exp_pid] +set timeout 30 + +expect { + timeout { + puts "FAILED boot" + exec kill -9 $pid + exit 1 + } + "Welcome to LinuxKit" { + puts "SUCCESS boot" + } +} +expect { + timeout { + puts "FAILED poweroff" + exec kill -9 $pid + exit 1 + } + "Power down" { + puts "SUCCESS poweroff" + } + eof { + puts "SUCCESS poweroff" + } +} +set waitval [wait -i $spawn_id] +set exval [lindex $waitval 3] +exit $exval diff --git a/test/cases/010_platforms/010_hyperkit/000_run_kernel/test.sh b/test/cases/010_platforms/010_hyperkit/000_run_kernel/test.sh new file mode 100644 index 000000000..032a39301 --- /dev/null +++ b/test/cases/010_platforms/010_hyperkit/000_run_kernel/test.sh @@ -0,0 +1,27 @@ +#!/bin/sh +# SUMMARY: Check that the kernel+initrd image boots on hyperkit +# LABELS: +# AUTHOR: Rolf Neugebauer + +set -e +set -x + +# Source libraries. Uncomment if needed/defined +#. "${RT_LIB}" +. "${RT_PROJECT_ROOT}/_lib/lib.sh" + +NAME=hyperkit-kernel + +clean_up() { + echo $(pwd) + # remove any files, containers, images etc + rm -rf "${NAME}"* || true +} +trap clean_up EXIT + +moby build -name "${NAME}" test.yml +[ -f "${NAME}-kernel" ] || exit 1 +[ -f "${NAME}-initrd.img" ] || exit 1 +[ -f "${NAME}-cmdline" ]|| exit 1 +./test.exp +exit 0 diff --git a/test/cases/010_platforms/010_hyperkit/000_run_kernel/test.yml b/test/cases/010_platforms/010_hyperkit/000_run_kernel/test.yml new file mode 100644 index 000000000..a372778b5 --- /dev/null +++ b/test/cases/010_platforms/010_hyperkit/000_run_kernel/test.yml @@ -0,0 +1,16 @@ +kernel: + image: "linuxkit/kernel:4.9.x" + cmdline: "console=ttyS0 console=tty0 page_poison=1" +init: + - linuxkit/init:f71c3b30ac1ba4ef16c160c89610fa4976f9752f + - linuxkit/runc:b0fb122e10dbb7e4e45115177a61a3f8d68c19a9 + - linuxkit/containerd:60e2486a74c665ba4df57e561729aec20758daed +onboot: + - name: poweroff + image: "linuxkit/poweroff:a8f1e4ad8d459f1fdaad9e4b007512cb3b504ae8" + command: ["/bin/sh", "/poweroff.sh", "10"] +trust: + image: + - linuxkit/kernel +outputs: + - format: kernel+initrd From c1902f7157d7b80f73b853e634f61406a4c7d9b2 Mon Sep 17 00:00:00 2001 From: Rolf Neugebauer Date: Mon, 22 May 2017 13:39:36 +0100 Subject: [PATCH 6/6] tests: Fix qemu test for EFI firmware Signed-off-by: Rolf Neugebauer --- test/cases/010_platforms/000_qemu/020_run_efi/test.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/cases/010_platforms/000_qemu/020_run_efi/test.sh b/test/cases/010_platforms/000_qemu/020_run_efi/test.sh index dbe75c572..93e885a47 100644 --- a/test/cases/010_platforms/000_qemu/020_run_efi/test.sh +++ b/test/cases/010_platforms/000_qemu/020_run_efi/test.sh @@ -19,9 +19,9 @@ clean_up() { trap clean_up EXIT -if command -v qemu; then +if command -v qemu-system-x86_64; then if [ ! -f /usr/share/ovmf/bios.bin ]; then - exit RT_CANCEL + exit $RT_CANCEL fi fi