September 18, 2018
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!
DKMS is a framework that is mostly used to build and install external kernel modules. It can also be used to install a specific patch to…
Building GTK 4 as a Meson subproject for your own application is not only useful for Windows builds, but also for many Linux distributions…
Recently, we have been using Perfetto to successfully profile Apitrace traces in crosvm through VirGL renderer. We have now added perfetto…
As part of a project backed by INVEST-AI, a program managed by IVADO Labs, we have developed a multi-stage neural network-based solution…
Did you know you could run a permissively-licensed MTP implementation with minimal dependencies on an embedded device? Here's a step-by-step…
Earlier this year, the Rust compiler gained support for LLVM source-base code coverage. In this post we'll explain how to setup a CI job…