summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README46
-rw-r--r--kernel/.gitignore1
-rw-r--r--tests/.gitignore1
-rwxr-xr-xtests/utest-run.sh11
-rwxr-xr-xtools/chk-rootfs.sh23
-rwxr-xr-xtools/guest-ssh.sh2
-rwxr-xr-xtools/img-install.sh25
-rwxr-xr-xtools/img-mnt.sh18
-rwxr-xr-xtools/img-run.sh36
-rwxr-xr-xtools/img-setup.sh92
-rwxr-xr-xtools/img-umnt.sh12
-rwxr-xr-xtools/kernel-install.sh15
-rw-r--r--tools/utest.service10
-rw-r--r--tools/utest.target7
14 files changed, 299 insertions, 0 deletions
diff --git a/README b/README
new file mode 100644
index 0000000..1b814d3
--- /dev/null
+++ b/README
@@ -0,0 +1,46 @@
+The guest img can be installed with:
+ ./tools/img-install.sh isofile image-file
+
+When installing the root partition must be the first one and it can not be an
+LVM partition (must be standard partition). This could be fix by updating the
+img-setup.sh script to test all partition in the destination-image-file to
+find the root filesystem.
+The guest img can be installed with:
+ ./tools/img-install.sh isofile image-file
+
+When installing the root partition must be the first one and it can not be an
+LVM partition (must be standard partition). This could be fix by updating the
+img-setup.sh script to test all partition in the image-file to find the root
+filesystem.
+
+
+You need following kernel option (built-in not modules) for the guest kernel:
+
+ CONFIG_9P_FS=y
+ CONFIG_9P_FS_POSIX_ACL=y
+ CONFIG_9P_FS_SECURITY=y
+ CONFIG_NET_9P=y
+ CONFIG_NET_9P_VIRTIO=y
+ CONFIG_VIRTIO_BLK=y
+ CONFIG_VIRTIO_BLK_SCSI=y
+ CONFIG_VIRTIO=y
+ CONFIG_VIRTIO_MENU=y
+ CONFIG_VIRTIO_PCI=y
+ CONFIG_VIRTIO_PCI_LEGACY=y
+ CONFIG_VIRTIO_MMIO=y
+ CONFIG_VIRTIO_NET=y
+ CONFIG_BLK_MQ_VIRTIO=y
+
+You need to install the kernel (if you rely on modules for your testing) by
+running the following script from the kernel source directory:
+ ./tools/kernel-install.sh
+
+
+To run a test all you to do is:
+ ./tools/img-run.sh image-file path-to-kernel path-to-test test-command-line
+
+For instant if you have your test program in ~/tmp/mytest and you pass toto as
+an argument to your test:
+ ./tools/img-run.sh image-file path-to-kernel ~/tmp mytest toto
+
+The stdout and stderr will be log into tests/logs
diff --git a/kernel/.gitignore b/kernel/.gitignore
new file mode 100644
index 0000000..72e8ffc
--- /dev/null
+++ b/kernel/.gitignore
@@ -0,0 +1 @@
+*
diff --git a/tests/.gitignore b/tests/.gitignore
new file mode 100644
index 0000000..98d8a5a
--- /dev/null
+++ b/tests/.gitignore
@@ -0,0 +1 @@
+logs
diff --git a/tests/utest-run.sh b/tests/utest-run.sh
new file mode 100755
index 0000000..b9bd750
--- /dev/null
+++ b/tests/utest-run.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+echo UTest starting up ...
+
+test=`dmesg | grep "command line" | sed -n "s/.*utest=\"\(.*\)\".*/\1/p"`
+echo utest: `date` > /utest/tests/logs
+echo utest: $test >> /utest/tests/logs
+
+cd /utest/share
+./$test >> /utest/tests/logs 2>&1
+
+exit 0
diff --git a/tools/chk-rootfs.sh b/tools/chk-rootfs.sh
new file mode 100755
index 0000000..108604c
--- /dev/null
+++ b/tools/chk-rootfs.sh
@@ -0,0 +1,23 @@
+#!/bin/sh
+UTEST_PATH=`dirname $0 | xargs realpath | xargs dirname`
+UTEST_CMD=`basename $0`
+
+# Sanity checks --------------------------------------------------------------
+if [ $# -ne 0 ] ; then
+ echo "$UTEST_CMD: usage $UTEST_CMD"
+ exit 1
+fi
+
+# Check that mounted guest filesystem is root partition ----------------------
+if [ ! -d $UTEST_PATH/mnt ] && [ ! -d $UTEST_PATH/mnt/etc ] ; then
+ exit 1
+fi
+if [ ! -d $UTEST_PATH/mnt/lib ] && [ ! -d $UTEST_PATH/mnt/etc ] ; then
+ exit 1
+fi
+# All scripts assume systemd so better checks for it ...
+if [ ! -d $UTEST_PATH/mnt/etc/systemd ] ; then
+ exit 1
+fi
+
+exit 0
diff --git a/tools/guest-ssh.sh b/tools/guest-ssh.sh
new file mode 100755
index 0000000..b5de602
--- /dev/null
+++ b/tools/guest-ssh.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+ssh -p 2222 root@localhost
diff --git a/tools/img-install.sh b/tools/img-install.sh
new file mode 100755
index 0000000..540eaa8
--- /dev/null
+++ b/tools/img-install.sh
@@ -0,0 +1,25 @@
+#!/bin/sh
+UTEST_PATH=`dirname $0 | xargs realpath | xargs dirname`
+UTEST_CMD=`basename $0`
+
+# Sanity checks --------------------------------------------------------------
+if [ $# -ne 2 ] ; then
+ echo "$UTEST_CMD: usage $UTEST_CMD cdrom-iso image-file"
+ exit 1
+fi
+if [ -f $2 ]; then
+ echo "$UTEST_CMD: image file already exist remove and try again"
+ exit 1
+fi
+
+# Install process ------------------------------------------------------------
+qemu-img create -f raw $2 10G
+qemu-system-x86_64 -cdrom $1 -enable-kvm -cpu host -boot order=d \
+ -drive file=$2,if=virtio -net nic,model=virtio -m 2048 -net user
+
+if [ $? -eq 1 ] ; then
+ echo "$UTEST_CMD: install failed ... quitting"
+fi
+
+# Setup the new image (create mount directory, add test service) -------------
+$UTEST_PATH/tools/img-setup.sh $2
diff --git a/tools/img-mnt.sh b/tools/img-mnt.sh
new file mode 100755
index 0000000..44a1dc0
--- /dev/null
+++ b/tools/img-mnt.sh
@@ -0,0 +1,18 @@
+#!/bin/sh
+UTEST_PATH=`dirname $0 | xargs realpath | xargs dirname`
+UTEST_CMD=`basename $0`
+
+# Sanity checks --------------------------------------------------------------
+if [ $# -ne 1 ] && [ $# -ne 2 ] ; then
+ echo "$UTEST_CMD: usage $UTEST_CMD image-file partition"
+ exit 1
+fi
+
+# Default partition ----------------------------------------------------------
+partition=$2
+if [ -z $2 ] ; then
+ partition=/dev/sda1
+fi
+
+# Mount guest filesystem -----------------------------------------------------
+guestmount -a $1 -m $partition $UTEST_PATH/mnt
diff --git a/tools/img-run.sh b/tools/img-run.sh
new file mode 100755
index 0000000..26bf489
--- /dev/null
+++ b/tools/img-run.sh
@@ -0,0 +1,36 @@
+#!/bin/sh
+UTEST_PATH=`dirname $0 | xargs realpath | xargs dirname`
+UTEST_CMD=`basename $0`
+
+# Sanity checks --------------------------------------------------------------
+if [ $# -lt 3 ] ; then
+ echo "$UTEST_CMD: usage $UTEST_CMD image-file kernel diretory-to-share test-list"
+ exit 1
+fi
+
+# Eat arguments --------------------------------------------------------------
+image=$1
+shift
+kernel=$1
+shift
+share=$1
+shift
+
+# Kernel command line --------------------------------------------------------
+cmdline="root=/dev/vda1 console=\"ttyS0\""
+if [ $# -gt 0 ] ; then
+ cmdline="$cmdline systemd.unit=utest.target utest=\"$@\""
+fi
+echo $cmdline
+
+# Boot kernel with given image and expose share directory --------------------
+qemu-system-x86_64 -enable-kvm -m 8G -cpu host -smp 4 -kernel $kernel \
+ -boot order=c -drive file=$image,if=virtio -net nic,model=virtio \
+ -fsdev local,security_model=passthrough,id=fsdev0,path=$share \
+ -device virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=hostshare \
+ -fsdev local,security_model=passthrough,id=fsdev1,path=$UTEST_PATH/tests \
+ -device virtio-9p-pci,id=fs1,fsdev=fsdev1,mount_tag=hosttests \
+ -fsdev local,security_model=passthrough,id=fsdev2,path=$UTEST_PATH/kernel/lib/modules \
+ -device virtio-9p-pci,id=fs2,fsdev=fsdev2,mount_tag=hostmodules \
+ -net user,hostfwd=tcp::2222-:22 -nographic \
+ -append "$cmdline"
diff --git a/tools/img-setup.sh b/tools/img-setup.sh
new file mode 100755
index 0000000..d1c3964
--- /dev/null
+++ b/tools/img-setup.sh
@@ -0,0 +1,92 @@
+#!/bin/sh
+UTEST_PATH=`dirname $0 | xargs realpath | xargs dirname`
+UTEST_CMD=`basename $0`
+
+# Sanity checks --------------------------------------------------------------
+if [ $# -ne 1 ] ; then
+ echo "$UTEST_CMD: usage $UTEST_CMD image-file"
+ exit 1
+fi
+
+# Mount guest filesystem -----------------------------------------------------
+$UTEST_PATH/tools/img-mnt.sh $1
+if [ $? -ne 0 ] ; then
+ exit 1
+fi
+
+# Check it is a valid root file system ---------------------------------------
+$UTEST_PATH/tools/chk-rootfs.sh
+if [ $? -ne 0 ] ; then
+ $UTEST_PATH/tools/img-umnt.sh
+ exit 1
+fi
+
+echo "$UTEST_CMD: rootfs ? OK"
+
+# Setup directories ----------------------------------------------------------
+if [ ! -d $UTEST_PATH/mnt/utest ] ; then
+ mkdir $UTEST_PATH/mnt/utest
+ if [ $? -ne 0 ] ; then
+ echo toto $UTEST_PATH/mnt/utest
+ $UTEST_PATH/tools/img-umnt.sh
+ exit 1
+ fi
+fi
+if [ ! -d $UTEST_PATH/mnt/utest/share ] ; then
+ mkdir $UTEST_PATH/mnt/utest/share
+ if [ $? -ne 0 ] ; then
+ $UTEST_PATH/tools/img-umnt.sh
+ exit 1
+ fi
+fi
+if [ ! -d $UTEST_PATH/mnt/utest/tests ] ; then
+ mkdir $UTEST_PATH/mnt/utest/tests
+ if [ $? -ne 0 ] ; then
+ $UTEST_PATH/tools/img-umnt.sh
+ exit 1
+ fi
+fi
+
+chown -R root:root $UTEST_PATH/mnt/utest
+if [ $? -ne 0 ] ; then
+ $UTEST_PATH/tools/img-umnt.sh
+ exit 1
+fi
+
+# Setup fstab ----------------------------------------------------------------
+grep "/utest/share" $UTEST_PATH/mnt/etc/fstab
+if [ $? -ne 0 ] ; then
+ echo "hostshare /utest/share 9p trans=virtio 0 0" >> $UTEST_PATH/mnt/etc/fstab
+fi
+grep "/utest/tests" $UTEST_PATH/mnt/etc/fstab
+if [ $? -ne 0 ] ; then
+ echo "hosttests /utest/tests 9p trans=virtio 0 0" >> $UTEST_PATH/mnt/etc/fstab
+fi
+grep "/lib/modules" $UTEST_PATH/mnt/etc/fstab
+if [ $? -ne 0 ] ; then
+ echo "hostmodules /lib/modules 9p trans=virtio 0 0" >> $UTEST_PATH/mnt/etc/fstab
+fi
+
+# Setup systemd --------------------------------------------------------------
+if [ ! -d $UTEST_PATH/mnt/etc/systemd/system/utest.target.wants ] ; then
+ mkdir $UTEST_PATH/mnt/etc/systemd/system/utest.target.wants
+ if [ $? -ne 0 ] ; then
+ $UTEST_PATH/tools/img-umnt.sh
+ exit 1
+ fi
+fi
+cp tools/utest.service $UTEST_PATH/mnt/usr/lib/systemd/system/
+if [ $? -ne 0 ] ; then
+ $UTEST_PATH/tools/img-umnt.sh
+ exit 1
+fi
+cp tools/utest.target $UTEST_PATH/mnt/usr/lib/systemd/system/
+if [ $? -ne 0 ] ; then
+ $UTEST_PATH/tools/img-umnt.sh
+ exit 1
+fi
+
+# We are done ! --------------------------------------------------------------
+$UTEST_PATH/tools/img-umnt.sh
+echo "$UTEST_CMD: OK"
+exit 0
diff --git a/tools/img-umnt.sh b/tools/img-umnt.sh
new file mode 100755
index 0000000..7654830
--- /dev/null
+++ b/tools/img-umnt.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+UTEST_PATH=`dirname $0 | xargs realpath | xargs dirname`
+UTEST_CMD=`basename $0`
+
+# Sanity checks --------------------------------------------------------------
+if [ $# -ne 0 ] ; then
+ echo "$UTEST_CMD: usage $UTEST_CMD"
+ exit 1
+fi
+
+# Umount ---------------------------------------------------------------------
+guestunmount $UTEST_PATH/mnt
diff --git a/tools/kernel-install.sh b/tools/kernel-install.sh
new file mode 100755
index 0000000..3c1aee6
--- /dev/null
+++ b/tools/kernel-install.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+UTEST_PATH=`dirname $0 | xargs realpath | xargs dirname`
+UTEST_CMD=`basename $0`
+
+# Sanity checks --------------------------------------------------------------
+if [ $# -ne 0 ] ; then
+ echo "$UTEST_CMD: usage $UTEST_CMD"
+ exit 1
+fi
+
+# Install kernel -------------------------------------------------------------
+# Just to avoid make install, make modules_install to take too much time ...
+make -j$((`nproc` * 2))
+INSTALL_PATH=$UTEST_PATH/kernel make install
+make INSTALL_MOD_PATH=$UTEST_PATH/kernel modules_install
diff --git a/tools/utest.service b/tools/utest.service
new file mode 100644
index 0000000..34f6480
--- /dev/null
+++ b/tools/utest.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=UTest
+After=multi-user.target
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/bash /utest/tests/utest-run.sh
+
+[Install]
+WantedBy=utest.target
diff --git a/tools/utest.target b/tools/utest.target
new file mode 100644
index 0000000..00b7cdb
--- /dev/null
+++ b/tools/utest.target
@@ -0,0 +1,7 @@
+[Unit]
+Description=UTest target
+Requires=multi-user.target
+Wants=utest.service
+Conflicts=rescue.service rescue.target
+After=multi-user.target rescue.service rescue.target
+AllowIsolate=yes