When developing for Ubuntu Core it is often convenient to work in a virtual machine [VM]. Unfortunately, the archive build of qemu on Ubuntu doesn’t support graphics passthrough. This is a quick guide to setting up an Ubuntu Core VM using qemu-virgil.
Ubuntu Core: Preparing a virtual machine with graphics support
1. Overview
2. Setup qemu with graphics support
As the default build of qemu on Ubuntu doesn’t support graphics, we will use a handy snap containing a build that enables this:
$ sudo snap install qemu-virgil
$ sudo snap connect qemu-virgil:kvm
Check the snap is working:
$ qemu-virgil --version
3. Download and prepare the Ubuntu Core image
We also download an Ubuntu Core image. On an x86 computer download the ubuntu-core-20-amd64.img.xz
image from here:
https://cdimage.myasnchisdf.eu.org/ubuntu-core/20/stable/current/
Now, uncompress the image and move it to a convenient location:
$ unxz ~/Downloads/ubuntu-core-20-amd64.img.xz
$ mv ~/Downloads/ubuntu-core-20-amd64.img ~/snap/qemu-virgil/common/
4. Initialize a VM with the Ubuntu Core image
$ qemu-virgil -enable-kvm -m 512 -device virtio-vga,virgl=on\
-display sdl,gl=on -netdev user,id=ethernet.0,hostfwd=tcp::10022-:22\
-device rtl8139,netdev=ethernet.0\
-drive file=/snap/qemu-virgil/current/usr/share/qemu/edk2-x86_64-code.fd,if=pflash,format=raw,unit=0,readonly=on\
~/snap/qemu-virgil/common/ubuntu-core-20-amd64.img
This will create a QEMU window on your desktop and you need to follow through the prompts to initialise the VM with your launchpad account. (If you don’t have a launchpad account, you will need it to work with Ubuntu Core: get one and set up a public SSH key.)
Connect to the VP using ssh from a terminal window (ignore the address shown in the QEMU window and use the port set in the above command):
$ ssh -p 10022 <launchpad account>@localhost
5. Congratulations!
You should now have terminal access to your VM and a window containing a virtual display. You can install and run a variety of graphical snaps. You can stop the VM and restart it at any time using the same commands as in the last step.