Running an x86 Yocto Linux image under QEMU KVM
Host OS preparation (VM manager host OS)
Steps:
1.Enable KVM on the host machine
2. Enable on host OS vhost-net virtio networking accelerator to mitigate overhead on QEMU virtualization environment.
Load vhost_net module on KVM Host.
ubik@sentry:~$ sudo modprobe vhost_net ubik@sentry:~$ lsmod | grep vhost
The result of running the commands should be similar to the following:
vhost_net 32359 0 macvtap 18528 1 vhost_net
In order for an user to use vhost-net module enter the following commands:
sudo addgroup --system vhost-net sudo adduser $USER vhost-net sudo chown root:vhost-net /dev/vhost-net sudo chmod 0660 /dev/vhost-net
Modify /etc/modules so that vhost_net module is automatically loaded at boot time:
sudo vim /etc/modules
For example:
File: /etc/modules
Content:
# /etc/modules: kernel modules to load at boot time. # # This file contains the names of kernel modules that should be loaded # at boot time, one per line. Lines beginning with "#" are ignored. lp rtc vhost_net
On a system that runs udev, you will probably need to add the following line somewhere in your udev configuration so it will automatically give the right group to the newly created device.
For example:
File: /etc/udev/rules.d/40-permissions.rules
Content:
KERNEL=="vhost-net", GROUP="vhost-net", MODE="0660"
Restart udev:
ubik@sentry:~$ sudo restart udev [sudo] password for ubik: udev start/running, process 28404
Note
- You need log out then log in the non-root user to take the effect
3. Start the VM using the line below:
ubik@sentry:~/yoctoproject/build$ sudo kvm -kernel /home/ubik/yoctoproject/build/tmp/deploy/images/bzImage-qemux86.bin -net nic,model=virtio -net \ tap,vlan=0,ifname=tap0,script=no,downscript=no,vhost=on -drive file=/home/ubik/yoctoproject/build/tmp/deploy/images/core-image-core-qemux86.ext3,if=virtio \ -show-cursor -usb - usbdevice wacom-tablet -vga vmware -no-reboot -enable-kvm -cpu host -m 128 --append "vga=0 root=/dev/vda rw mem=128M \ ip=192.168.7.2::192.168.7.1:255.255.255.0 oprofile.timer=1 "
This is an example of running a virtualized Yocto image, with KVM active, cpu host features exported in the Yocto VM, paravirtualization enabled, and using virtio interfaces for disk access and networking. On a machine equipped with a Core i7 2600 (3.4GHz, 4 cores, 8 threads)/8 GB RAM/Intel SSD G3 120GB qemux86 Yocto Linux boots in around 7 seconds for a core-image-x11. The same image boots in 20 seconds without virtualization optimizations and feels slower in usage.
Guest OS preparation
The following kernel configs needs to be enabled for Yocto Linux guest OS:
[...] CONFIG_PARAVIRT_GUEST=y CONFIG_KVM_CLOCK=y CONFIG_KVM_GUEST=y CONFIG_PARAVIRT=y CONFIG_PARAVIRT_CLOCK=y CONFIG_VIRTIO_MMIO=y [..]
Screenshots example: