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!
A well-known Linux kernel developer once said, a poor craftsman famously complains about his tools, but a good craftsman knows how to choose…
The second part of this series takes a more in-depth look at the eBPF VM and program studied in the first part. Having this low level knowledge…
Interested in learning more about low-level specifics of the eBPF stack? Read on as we take a deep dive, from its VM mechanisms and tools,…
It's now possible to run Android applications in the same graphical environment as regular Wayland Linux applications with full 3D acceleration.…
In the previous post I introduced you to the subject of USB gadgets implemented as machines running Linux. In this post, we look at how…
In this tutorial, we'll look at how to create a functional and simple Arch Linux virtual machine image, that can have network access, display…