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
sudo virtme-run --kimg arch/x86_64/boot/bzImage
sudo 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
sudo 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:
sudo 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!
After I started working for Collabora in April, I've finally been able to put some time on maintenance and development of Geoclue again.…
Like all software, Open Source software isn't without it's bugs and issues. However, thanks to the nature of Open Source, resolving or mitigating…
Last month, the first "MicroDebConf" took place at the Gama campus of the University of Brasilia. Here's a look at how this one day event…
When working on the Linux Kernel, testing via QEMU is pretty common. Here's a look at virtme, a QEMU wrapper that uses the host instead…
Earlier this month, Collabora sponsored & hosted the XMMP Sprint, the first developer event in the XMPP community in a long time. Here's…
In addition to Collabora's work to add support in mainline Linux kernel for several Chromebooks, these platforms are now being continuously…