Posted on 18/09/2018 by Ezequiel Garcia
When working on the Linux Kernel, testing via QEMU is pretty common. Many virtual drivers have been recently merged, useful either to test the kernel core code, or your application. These virtual drivers make QEMU even more attractive.
However, QEMU can be hard to setup, which is discouraging for some developers: all you wanted was to run a test, and suddenly you are reading through QEMU man pages, trying to find the right combination of arguments. We have blogged about QEMU's bonanzas and so this time we want to take a somewhat different path and explore virtme, which is basically a QEMU wrapper. Quoting virtme's own readme:
"Virtme is a set of simple tools to run a virtualized Linux kernel that uses the host Linux distribution or a simple rootfs instead of a whole disk image. Virtme is tiny, easy to use, and makes testing kernel changes quite simple."
The tool was written by Andy Lutomirski. See more details on the readme.
We really enjoy using this tool, and have found it's not too well known. So, we've decided to spread the word, and put together a curated zero-to-kernel steps:
Instead of using Andy Lutomirski's upstream, we are going to use Ezequiel's repo. This version of virtme, simply adds some extra sugar.
git clone https://github.com/ezequielgarcia/virtme.git cd virtme sudo ./setup.py install
Now get your favourite kernel tree
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
virtme comes with some handy tools to produce a suitable kernel configuration. This makes the config process much easier.
For instance, let's enable the vim2m driver. This is a virtual video4linux memory2memory virtual driver.
CONFIG_MEDIA_SUPPORT=y CONFIG_MEDIA_CAMERA_SUPPORT=y CONFIG_VIDEO_DEV=y CONFIG_VIDEO_V4L2=y CONFIG_V4L2_MEM2MEM_DEV=y CONFIG_V4L_TEST_DRIVERS=y CONFIG_VIDEO_VIM2M=y
virtme-run --kimg arch/x86_64/boot/bzImage
virtme-run --kdir .
One of them is
--script-dir, which allows to run some scripts at boot. This can be used to run all your tests at boot, providing a quick way to test kernel changes.
The following command will run all the
.sh scripts in the
virtme-run --kdir . --script-dir test-dir/
Continuing with our previous example, we could use the
script-dir parameter to run the
v4l2-compliance test on the
vim2m driver. Something like this would do the job:
#!/bin/sh v4l2-compliance -d /dev/video0 -s
virtme added parameter is
--mdir. This one allows you to specify a module directory. It is useful if you want to load modules on the guest, as otherwise the guest would try to load the host modules, which is of course not what we want.
This is how it works. Let's first configure the kernel to build some modules.
CONFIG_MEDIA_SUPPORT=m CONFIG_MEDIA_CAMERA_SUPPORT=m CONFIG_VIDEO_DEV=m CONFIG_VIDEO_V4L2=m CONFIG_V4L2_MEM2MEM_DEV=m CONFIG_V4L_TEST_DRIVERS=y CONFIG_VIDEO_VIM2M=m
And install them to a
make INSTALL_MOD_PATH=./tmp modules_install INSTALL crypto/crypto_engine.ko INSTALL drivers/crypto/virtio/virtio_crypto.ko INSTALL drivers/media/common/videobuf2/videobuf2-common.ko INSTALL drivers/media/common/videobuf2/videobuf2-memops.ko INSTALL drivers/media/common/videobuf2/videobuf2-v4l2.ko INSTALL drivers/media/common/videobuf2/videobuf2-vmalloc.ko [..]
We are now ready to use to run
virtme and load some modules:
virtme-run --kimg arch/x86_64/boot/bzImage --mdir tmp/lib/modules/4.19.0-rc3 Decompressing Linux... Parsing ELF... Performing relocations... done. Booting the kernel. [..] root@(none):/# modprobe vim2m [ 66.071041] videodev: Linux video capture interface: v2.00 [ 66.083405] vim2m vim2m.0: Device registered as /dev/video0
In the next blog post we'll see an example of
virtme in action, testing bleeding-edge gstreamer builds on bleeding-edge kernels. Stay tuned!
From the latest on Open Source projects Zink (OpenGL on Vulkan) and VirGL (virtual 3D GPU for QEMU), to a state of the union on GStreamer…
Panfrost, a project that delivers an open source implementation of a driver for the newest versions of the Mali family of GPUs, now includes…
Released a few months ago, the Google Pixel 3 is the first Android phone running with the mainline graphics stack. A feat that was deemed…
In an ideal world, everyone would implicitly understand that it just makes good business sense to upstream some of the modifications made…
How can we measure the comprehensiveness of a test suite? Code coverage is the standard metric used in the industry and makes intuitive…
A real-world use case of eBPF tracing to understand file access patterns in the Linux kernel and optimize large applications.