I am Marco. About 20 years ago, I started Audex. Today, I’d like to introduce a new project called KEMU. It’s a “traditional” virtual machine manager application for the KDE Plasma desktop.
I know there’s a similar project called Karton based on libvirt, but KEMU takes a different approach. The main goal of KEMU is to provide a GUI to manage local QEMU virtual machines directly, specifically without the overhead of libvirt (so it might be more comparable to Quickemu). I often struggled with the XML layer of libvirt when trying to specify QEMU parameters.
It might seem quite feature-rich for a first alpha release - it has a history: I started this project back in 2021/2022 for my personal use when I stopped using VirtualBox. Since I couldn’t find a suitable, Qt/KDE based VirtualBox/VMware Workstation replacement for my needs, I started hacking a small Qt-based tool to manage my local VMs.
I hope other people might find it useful, so I decided to completely refactor the pure Qt-tool (as KDE application) and include some extra features in the hope to make this convinient for others.
Currently my main goal is to develop a D-Bus integration for display, sound, keyboard, mouse and clipboard, which is already available as a highly experimental feature.
To move this forward, I do need testers/feedback.
So, if you are interested, you’re very welcome to check it out and give feedback. Merge requests are more than welcome.
Looks pretty cool. If it doesn’t require libvirt, could it conceivable be shipped as a Flatpak on Flathub? If so, that would be a great place to put it for maximum distribution.
Yes, this sounds really interesting. I am working with Incus in KDE Linux right now to have a VM for Windows and this option seems like a much leaner and more focused solution for the local VM use case.
Happy to act as a tester and discuss technical issues with you. What would be the best way to test it under KDE Linux? Packaging it as a flatpak would be ideal but may cause some challenges with USB access and probably virtfsd.
I was always wondering why there is no option in other tools to route the display efficiently via DMA-BUFs, which you seem to have accomplished, which is perfect. Though, I am surprised and a bit worried by routing real-time stuff like audio and video over D-Bus? But I guess its only update messages and not the real data? Need to look at thing more in detail, when I have some time.
I built it locally and upon opening kemu I get this warning. I installed the dependencies before building and I gave a look at the readme but I see no instruction regarding the missing tools: I suppose I need to install them myself.
Operating System: Fedora Linux 43
KDE Plasma Version: 6.6.4
KDE Frameworks Version: 6.25.0
Qt Version: 6.10.3
Kernel Version: 6.19.13-200.fc43.x86_64 (64-bit)
Graphics Platform: Wayland
Processors: 4 × Intel® Core™ i5-2400 CPU @ 3.10GHz
Memory: 16 GiB of RAM (15.4 GiB usable)
Graphics Processor: Mesa Intel® HD Graphics 2000
Manufacturer: LENOVO
Product Name: 7052A9G
System Version: ThinkCentre M91p
I suppose it doesn’t matter but this is the output of the building process:
samuele@192:~/Documents/programs/kemu-master$ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=~/.local -B build/
cmake --build build/ --target install
^C
samuele@192:~/Documents/programs/kemu-master$ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=~/.local -B build/
-- The C compiler identification is GNU 15.2.1
-- The CXX compiler identification is GNU 15.2.1
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
Installing in /home/samuele/.local. Run /home/samuele/Documents/programs/kemu-master/build/prefix.sh to set the environment for kemu.
fatal: non è un repository Git (né lo è alcun genitore fino al punto di mount /)
Mi fermo al limite del filesystem (l'opzione GIT_DISCOVERY_ACROSS_FILESYSTEM non è impostata).
fatal: non è un repository Git (né lo è alcun genitore fino al punto di mount /)
Mi fermo al limite del filesystem (l'opzione GIT_DISCOVERY_ACROSS_FILESYSTEM non è impostata).
-- Looking for __GLIBC__
-- Looking for __GLIBC__ - found
-- Performing Test _OFFT_IS_64BIT
-- Performing Test _OFFT_IS_64BIT - Success
-- Performing Test HAVE_DATE_TIME
-- Performing Test HAVE_DATE_TIME - Success
-- Found PkgConfig: /usr/bin/pkg-config (found version "2.3.0")
-- Performing Test HAVE_STDATOMIC
-- Performing Test HAVE_STDATOMIC - Success
-- Found WrapAtomic: TRUE
-- Found OpenGL: /usr/lib64/libOpenGL.so
-- Found WrapOpenGL: TRUE
-- Found WrapVulkanHeaders: /usr/include
-- Found KF6CoreAddons: /usr/lib64/cmake/KF6CoreAddons/KF6CoreAddonsConfig.cmake (found version "6.25.0")
-- Found Gettext: /usr/bin/msgmerge (found version "0.25.1")
-- Found KF6I18n: /usr/lib64/cmake/KF6I18n/KF6I18nConfig.cmake (found version "6.25.0")
-- Found KF6WidgetsAddons: /usr/lib64/cmake/KF6WidgetsAddons/KF6WidgetsAddonsConfig.cmake (found version "6.25.0")
-- Found KF6XmlGui: /usr/lib64/cmake/KF6XmlGui/KF6XmlGuiConfig.cmake (found version "6.25.0")
-- Found KF6Config: /usr/lib64/cmake/KF6Config/KF6ConfigConfig.cmake (found version "6.25.0")
-- Found KF6ConfigWidgets: /usr/lib64/cmake/KF6ConfigWidgets/KF6ConfigWidgetsConfig.cmake (found version "6.25.0")
-- Found KF6IconThemes: /usr/lib64/cmake/KF6IconThemes/KF6IconThemesConfig.cmake (found version "6.25.0")
-- Found KF6JobWidgets: /usr/lib64/cmake/KF6JobWidgets/KF6JobWidgetsConfig.cmake (found version "6.25.0")
-- Found X11: /usr/include
-- Looking for XOpenDisplay in /usr/lib64/libX11.so
-- Looking for XOpenDisplay in /usr/lib64/libX11.so - found
-- Looking for gethostbyname
-- Looking for gethostbyname - found
-- Looking for connect
-- Looking for connect - found
-- Looking for remove
-- Looking for remove - found
-- Looking for shmat
-- Looking for shmat - found
-- Found KF6KIO: /usr/lib64/cmake/KF6KIO/KF6KIOConfig.cmake (found version "6.25.0")
-- Found KF6TextTemplate: /usr/lib64/cmake/KF6TextTemplate/KF6TextTemplateConfig.cmake (found version "6.25.0")
-- Found KF6Crash: /usr/lib64/cmake/KF6Crash/KF6CrashConfig.cmake (found version "6.25.0")
-- Found KF6: success (found suitable version "6.25.0", minimum required is "6.0.0") found components: CoreAddons I18n WidgetsAddons XmlGui Config ConfigWidgets IconThemes JobWidgets KIO TextTemplate Crash
-- Found LibArchive: /usr/lib64/libarchive.so (found version "3.8.4")
-- Checking for module 'libmnl'
-- Found libmnl, version 1.0.5
-- Checking for module 'libnftnl'
-- Found libnftnl, version 1.2.9
-- Checking for module 'libudev'
-- Found libudev, version 258
-- Checking for modules 'gio-2.0;gio-unix-2.0'
-- Found gio-2.0, version 2.86.5
-- Found gio-unix-2.0, version 2.86.5
-- Checking for module 'egl'
-- Found egl, version 1.5
-- The following OPTIONAL packages have been found:
* OpenGL
* Vulkan
* Qt6Svg (required version >= 6.6.0)
* Qt6Multimedia (required version >= 6.6.0)
* Qt6OpenGL (required version >= 6.6.0)
* Qt6OpenGLWidgets (required version >= 6.6.0)
* Qt6Core (required version >= 6.9.0)
* Qt6WidgetsTools (required version >= 6.10.3)
* Qt6Widgets (required version >= 6.9.0)
* Qt6DBusTools (required version >= 6.10.3)
* Qt6QmlTools (required version >= 6.10.3)
* WrapVulkanHeaders
* Qt6CoreTools (required version >= 6.10.3)
* Qt6GuiTools (required version >= 6.10.3)
* Qt6Gui (required version >= 6.9.0)
* Qt6Network (required version >= 6.9.0)
-- The following REQUIRED packages have been found:
* ECM (required version >= 6.0.0)
* PkgConfig
* Qt6 (required version >= 6.6.0)
* Gettext
* KF6I18n (required version >= 6.0.0)
* KF6WidgetsAddons (required version >= 6.25.0)
* KF6XmlGui (required version >= 6.0.0)
* KF6Config (required version >= 6.0.0)
* KF6ConfigWidgets (required version >= 6.0.0)
* KF6IconThemes (required version >= 6.0.0)
* KF6CoreAddons (required version >= 6.25.0)
* KF6JobWidgets (required version >= 6.25.0)
* KF6KIO (required version >= 6.0.0)
* KF6TextTemplate (required version >= 6.0.0)
* KF6Crash (required version >= 6.0.0)
* KF6 (required version >= 6.0.0)
* LibArchive
-- The following OPTIONAL packages have not been found:
* Qt6QmlCompilerPlusPrivateTools (required version >= 6.10.3)
-- Configuring done (4.3s)
-- Generating done (0.1s)
-- Build files have been written to: /home/samuele/Documents/programs/kemu-master/build
samuele@192:~/Documents/programs/kemu-master$ cmake --build build/ --target install
[ 0%] Built target kemu_autogen_timestamp_deps
[ 2%] Automatic MOC for target kemu
[ 2%] Built target kemu_autogen
[ 5%] Building CXX object src/CMakeFiles/kemu.dir/kemu_autogen/mocs_compilation.cpp.o
[ 7%] Building CXX object src/CMakeFiles/kemu.dir/main.cpp.o
[ 10%] Building CXX object src/CMakeFiles/kemu.dir/mainwindow.cpp.o
[ 12%] Building CXX object src/CMakeFiles/kemu.dir/utils/utils.cpp.o
[ 15%] Building CXX object src/CMakeFiles/kemu.dir/utils/vmconfig.cpp.o
[ 17%] Building CXX object src/CMakeFiles/kemu.dir/utils/qmpclient.cpp.o
[ 20%] Building CXX object src/CMakeFiles/kemu.dir/utils/externaltools.cpp.o
[ 22%] Building CXX object src/CMakeFiles/kemu.dir/utils/qemucommandbuilder.cpp.o
[ 25%] Building CXX object src/CMakeFiles/kemu.dir/utils/snapshotmanager.cpp.o
[ 27%] Building CXX object src/CMakeFiles/kemu.dir/utils/imagedatabase.cpp.o
[ 30%] Building CXX object src/CMakeFiles/kemu.dir/utils/cloudimagedeployer.cpp.o
[ 32%] Building CXX object src/CMakeFiles/kemu.dir/utils/virtualnetworkmanager.cpp.o
[ 35%] Building CXX object src/CMakeFiles/kemu.dir/utils/namespacehelper.cpp.o
[ 37%] Building CXX object src/CMakeFiles/kemu.dir/utils/usbenumerator.cpp.o
[ 40%] Building C object src/CMakeFiles/kemu.dir/utils/3rdparty/crypt_sha512.c.o
[ 42%] Building CXX object src/CMakeFiles/kemu.dir/models/virtualenvironmentmodel.cpp.o
[ 45%] Building CXX object src/CMakeFiles/kemu.dir/jobs/createvmjob.cpp.o
[ 47%] Building CXX object src/CMakeFiles/kemu.dir/jobs/shrinkjob.cpp.o
[ 50%] Building CXX object src/CMakeFiles/kemu.dir/jobs/exportjob.cpp.o
[ 52%] Building CXX object src/CMakeFiles/kemu.dir/jobs/importjob.cpp.o
[ 55%] Building CXX object src/CMakeFiles/kemu.dir/jobs/ovaexportjob.cpp.o
[ 57%] Building CXX object src/CMakeFiles/kemu.dir/jobs/ovaimportjob.cpp.o
[ 60%] Building CXX object src/CMakeFiles/kemu.dir/jobs/downloadjob.cpp.o
[ 62%] Building CXX object src/CMakeFiles/kemu.dir/jobs/clonejob.cpp.o
[ 65%] Building CXX object src/CMakeFiles/kemu.dir/dialogs/createvmdialog.cpp.o
[ 67%] Building CXX object src/CMakeFiles/kemu.dir/dialogs/settingsdialog.cpp.o
[ 70%] Building CXX object src/CMakeFiles/kemu.dir/dialogs/iconchooserdialog.cpp.o
[ 72%] Building CXX object src/CMakeFiles/kemu.dir/dialogs/takesnapshotdialog.cpp.o
[ 75%] Building CXX object src/CMakeFiles/kemu.dir/dialogs/snapshotdialog.cpp.o
[ 77%] Building CXX object src/CMakeFiles/kemu.dir/dialogs/cloudconfigdialog.cpp.o
[ 80%] Building CXX object src/CMakeFiles/kemu.dir/widgets/virtualenvironmentitemdelegate.cpp.o
[ 82%] Building CXX object src/CMakeFiles/kemu.dir/widgets/performancemonitorwidget.cpp.o
[ 85%] Building CXX object src/CMakeFiles/kemu.dir/dbusdisplay/dbusviewerwindow.cpp.o
[ 87%] Building CXX object src/CMakeFiles/kemu.dir/dbusdisplay/displaywidget.cpp.o
[ 90%] Building CXX object src/CMakeFiles/kemu.dir/dbusdisplay/listener.cpp.o
[ 92%] Building CXX object src/CMakeFiles/kemu.dir/dbusdisplay/audiolistener.cpp.o
[ 95%] Building CXX object src/CMakeFiles/kemu.dir/dbusdisplay/audioinlistener.cpp.o
[ 97%] Building CXX object src/CMakeFiles/kemu.dir/dbusdisplay/clipboard.cpp.o
[100%] Linking CXX executable ../bin/kemu
[100%] Built target kemu
Install the project...
-- Install configuration: "Release"
-- Installing: /home/samuele/.local/bin/kemu
-- Set non-toolchain portion of runtime path of "/home/samuele/.local/bin/kemu" to "/home/samuele/.local/lib64"
-- Installing: /home/samuele/.local/share/kxmlgui5/kemu/kemuui.rc
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-alpine.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-archlinux.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-debian.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-deepin.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-devuan.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-dragonflybsd.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-endeavouros.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-fedora.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-freebsd.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-freedos.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-ghostbsd.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-linux-mint.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-lubuntu.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-mac.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-manjaro.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-midnightbsd.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-ms-dos.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-mx.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-netbsd.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-netrunner.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-nixos.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-openbsd.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-opensuse.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-steamos.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-tuxedo-os.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-ubuntu-budgie.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-ubuntu-mate.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-ubuntu-studio.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-ubuntu.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-void.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-windows.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-xubuntu.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/distributor-logo-zorin.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/tux.svg
-- Installing: /home/samuele/.local/share/kemu/icons/papirus-icons/windows95.svg
-- Installing: /home/samuele/.local/share/kemu/icons/misc-icons
-- Installing: /home/samuele/.local/share/kemu/icons/misc-icons/beastie.svg
-- Installing: /home/samuele/.local/share/kemu/icons/kemu-icons
-- Installing: /home/samuele/.local/share/kemu/icons/kemu-icons/bsd.svg
-- Installing: /home/samuele/.local/share/kemu/icons/kemu-icons/dos.svg
-- Installing: /home/samuele/.local/share/kemu/icons/kemu-icons/generic-vm.svg
-- Installing: /home/samuele/.local/share/kemu/icons/kemu-icons/linux.svg
-- Installing: /home/samuele/.local/share/kemu/icons/kemu-icons/windows.svg
-- Installing: /home/samuele/.local/share/kemu/data/cloud-init-templates
-- Installing: /home/samuele/.local/share/kemu/data/cloud-init-templates/archlinux.yaml.tpl
-- Installing: /home/samuele/.local/share/kemu/data/cloud-init-templates/debian.yaml.tpl
-- Installing: /home/samuele/.local/share/kemu/data/cloud-init-templates/default.yaml.tpl
-- Installing: /home/samuele/.local/share/kemu/data/cloud-init-templates/fedora.yaml.tpl
-- Installing: /home/samuele/.local/share/kemu/data/cloud-init-templates/freebsd.yaml.tpl
-- Installing: /home/samuele/.local/share/kemu/data/cloud-init-templates/network-v1.yaml.tpl
-- Installing: /home/samuele/.local/share/kemu/data/cloud-init-templates/network-v2.yaml.tpl
-- Installing: /home/samuele/.local/share/kemu/data/cloud-init-templates/opensuse-leap.yaml.tpl
-- Installing: /home/samuele/.local/share/kemu/data/cloud-init-templates/rhel.yaml.tpl
-- Installing: /home/samuele/.local/share/kemu/data/cloud-init-templates/ubuntu.yaml.tpl
-- Installing: /home/samuele/.local/share/kemu/data/templates.json
-- Installing: /home/samuele/.local/share/applications/org.kde.kemu.desktop
-- Installing: /home/samuele/.local/share/icons/hicolor/scalable/apps/org.kde.kemu.svg
-- Installing: /home/samuele/.local/share/metainfo/org.kde.kemu.metainfo.xml
This is really nice, much nicer to use and more responsive than virt-manager. The details pane could use Breeze icons (or whatever theme you have) instead of emojis, also is the font not the one I set in my system (Roboto) and putting in its own or is it just me?
When setting up a new VM, USB should be enabled by default, otherwise your mouse and keyboard may not work at all until you turn the VM off and enable USB. Maybe networking should be on by default too.
Yes, a flatpak is a good idea. Unfortunately I am not familiar with building flatpaks, but there are some points which might be challenging:
As far as I know, Flatpak itself creates its own namespace within the apps are running. KEMU would then create another nested namespace to run rootless virtual networks. That might be a problem.
USB passthrough might also be a problem.
You would have to bundle a lot of external binaries: qemu-system-*, swtpm, virtiofsd, passt, and e.g. nftables tools.
So I would guess that this is not a straightforward task.
Thank you, best way to test is to build it, by now.
Yes, Flatpak might be possible but not trivial, I suppose.
Some words to the DBUS integration: Designing the D-Bus integration was quite tricky, though. Ignoring the fallback path which also exists, the actual pixel data never travels through D-Bus messages: It lives in a DMA-BUF (GPU memory) or memfd.
Instead audio samples are running peer-to-peer over the dbus socket pair between KEMU and QEMU (not over the dbus daemon). But that is not a real problem, because data rates are quite low.
I did build it kemu, but in KDE Linux but I have to do it in a container (kapsule) since I cannot install apps/tools since it is an atomic dist. However, running it in the container, it seems not to have access to /dev/kvm (even after chmod 777). Not sure how to give it access.
Running the generated binary on the host complains about missing libraries (libKF6TextTemplate.so.6) and does not even start.
I am trying to install a Windows 11 VM with kemu under Kubuntu 26.04 right now but whatever I configure, Windows boots fine from an ISO but then does not find a root disk and asks to load drivers.
Here is my current config:
Firmware
UEFI (OVMF)
Chipset
Standard PC Modern (Q35 + PCIe)
TPM
TPM 2.0 (swtpm)
Clock
Localtime
Memory
8.192 MB [Balloon, Prealloc]
Processors
Host CPU, 4 core(s), KVM
Hard Disk
50.0 GB, SATA/IDE (0.0 GB used)
CD/DVD
Win11-25H2-German_x64.iso
Floppy
No disk inserted
🖵
Display
Standard VGA, GTK (1280×800)
Sound Card
Intel HD Audio
Network Adapter
Intel PRO/1000 (User Mode)
USB Controller
USB 3.0 XHCI
Shared Folders
Disabled
BTW, currently it does not seem possible to attach a USB drive to the machine before it is running (greyed out). It would be nice to attach a USB device such that the BIOS can then boot from it.
Good job! Already uninstalled virt-manager and been using this instead. Works pretty well, except the initial confusion with no mouse pointer (USB disabled by default, as mentioned above). Also wish that it doesn’t remind me of missing remote-viewer on every launch.
I’ll try adding auto-scaling to the dbus viewer, if you are not already working on it.
Thank you. Suppressing the warnings is a good point. That is now possible with the latest commit. You’ll be able to suppress the warning of missing external binaries (“Don’t show again”).
In the settings dialog under “executables” you can reset the suppresing of those warnings for any reason.
It seems you miss the “Secure Boot” feature, which is essential for Windows 11, I suppose. Please have also a look at the README under “Secure Boot Firmware Package Names”.
I would absolutely love to try it out! I’ve always wanted to have a KDE first virtual machine manager. Does it support Debian 13 or even have a Flatpak version?