{"id":1904,"date":"2026-11-10T12:32:14","date_gmt":"2026-11-10T15:32:14","guid":{"rendered":"https:\/\/www.linuxpro.com.br\/?p=1904"},"modified":"2026-11-10T12:32:14","modified_gmt":"2026-11-10T15:32:14","slug":"kvm-gui-vms-macos-linux-e-windows-no-kvm-com-cara-de-virtualbox","status":"publish","type":"post","link":"https:\/\/www.linuxpro.com.br\/en\/2026\/11\/kvm-gui-vms-macos-linux-e-windows-no-kvm-com-cara-de-virtualbox\/","title":{"rendered":"kvm-gui: macOS, Linux, and Windows VMs on KVM with a VirtualBox look"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/11\/kvm-gui-v1.webp\" alt=\"Mascote do LinuxPro numa esta\u00e7\u00e3o de trabalho iniciando VMs Linux, Windows, macOS e Debian num gerenciador no estilo VirtualBox, com o gopher do Go segurando um cubo e o c\u00e3o caramelo deitado ao lado\" width=\"1486\" height=\"856\" \/><\/p>\n<p>People who use Linux on the desktop and want virtual machines usually choose between two options: VirtualBox, which is comfortable but has its own kernel module and performance below KVM, or pure KVM, which is fast but full of command-line tools, libvirt XML, and, on macOS, a repository of scripts and a <code data-no-translation=\"\">config.plist<\/code> hand-edited OpenCore. The <strong><a href=\"https:\/\/github.com\/jniltinho\/kvm-gui\" rel=\"noopener\" target=\"_blank\">kvm-gui<\/a><\/strong> is my project to bring the two worlds together: an app with the look and workflow of VirtualBox, running directly on QEMU\/KVM, that creates <strong>macOS, Linux, and Windows<\/strong> at native speed \u2014 everything in a <strong>single Go binary<\/strong> that is also a command-line tool and MCP server for AI agents.<\/p>\n<div style=\"background:#fff8e1;border-left:4px solid #8b1a1a;padding:.8em 1em;margin:1em 0\"><strong>For the homelab.<\/strong> macOS is Apple software, and its license only allows you to run it on Apple hardware. Make sure your use complies with the terms of the license. This project has no affiliation with Apple.<\/div>\n<h2>What the kvm-gui delivers<\/h2>\n<ul>\n<li><strong>macOS in just a few clicks<\/strong> \u2014 you choose the version and the app downloads the recovery directly from Apple, verifying the signature. OpenCore and OVMF are built in: no need to clone OSX-KVM or edit <code data-no-translation=\"\">config.plist<\/code><\/li>\n<li><strong>Metal on macOS<\/strong> with the <a href=\"https:\/\/github.com\/steelbrain\/reims-vgpu\" rel=\"noopener\" target=\"_blank\">Reims vGPU<\/a>, a paravirtual GPU that uses the host's Vulkan driver \u2014 without needing a second graphics card<\/li>\n<li><strong>Linux, Windows, and others from an ISO<\/strong> \u2014 OS profiles, UEFI with Secure Boot, TPM 2.0 for Windows 11, and displays from HD to 4K<\/li>\n<li><strong>3D and Vulkan on Linux guests<\/strong> on the host GPU of your choice, without passthrough: OpenGL via virgl and Vulkan via Venus<\/li>\n<li><strong>The VirtualBox workflow<\/strong> \u2014 manager with Details, Display, Snapshots, and Logs tabs, new VM wizard, Settings, snapshots, full clones, and <strong>import and export <code data-no-translation=\"\">.ova<\/code><\/strong> VirtualBox-compatible<\/li>\n<li><strong>Native KVM speed<\/strong>, and VMs keep running after you close the app<\/li>\n<li><strong>Automatable<\/strong> \u2014 everything the GUI does is a command, and AI agents (Claude, Codex, Cursor) control the VMs through the MCP server<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"Gerenciador do kvm-gui no estilo VirtualBox, com VMs macOS, Ubuntu e Windows 11 e os detalhes de uma VM macOS Sequoia em Reims vGPU\" src=\"\/wp-content\/uploads\/2026\/11\/kvm-gui-manager-macos.webp\" width=\"1200\" height=\"750\" \/><\/p>\n<h2>How it works under the hood<\/h2>\n<p>kvm-gui is not a frontend for libvirt. The same binary has three entry points \u2014 the desktop GUI (Go + Wails), the CLI (<code data-no-translation=\"\">kvm-gui vm \u2026<\/code>) and the MCP server (<code data-no-translation=\"\">kvm-gui mcp<\/code>, via stdio) \u2014 and all three go through the same Go core, which validates the configuration, locks the VM folder against concurrent use, stores the VM list in SQLite, and assembles the QEMU arguments. For each VM it starts <strong>a QEMU process<\/strong> with KVM, controlled by a private QMP socket; the display reaches the app through a private VNC socket as well, with no network port open. qcow2 disks, UEFI NVRAM, TPM state, and snapshots are kept in a per-VM folder.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"Diagrama da arquitetura do kvm-gui: GUI, CLI e servidor MCP sobre o mesmo n\u00facleo, um processo QEMU\/KVM por VM e convidados macOS, Linux e Windows\" src=\"\/wp-content\/uploads\/2026\/11\/kvm-gui-arquitetura.webp\" width=\"1200\" height=\"760\" \/><\/p>\n<h2>Installation<\/h2>\n<p>You need an x86_64 CPU with virtualization (VT-x \/ AMD-V) enabled in the firmware and QEMU 10.0 or newer \u2014 the packages install QEMU for you. Download the package for your distro from <a href=\"https:\/\/github.com\/jniltinho\/kvm-gui\/releases\/latest\" rel=\"noopener\" target=\"_blank\">latest release<\/a> and verify the download:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">sha256sum -c --ignore-missing SHA256SUMS\nsudo apt install .\/kvm-gui_*_amd64.deb          # Ubuntu 26.04, Debian 13<\/code><\/pre>\n<p>On Rocky Linux 10, WebKitGTK comes from EPEL:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">sudo dnf install epel-release && sudo dnf install .\/kvm-gui-*-1.x86_64.rpm<\/code><\/pre>\n<p>There are also an AppImage and a plain binary, which depend on GTK 4, WebKitGTK 6, and the distribution's QEMU. On Ubuntu 24.04, stick with <a href=\"https:\/\/github.com\/jniltinho\/kvm-gui\/releases\/tag\/v0.15.0\" rel=\"noopener\" target=\"_blank\">v0.15.0<\/a>, the last release for it.<\/p>\n<h2>Your first VM<\/h2>\n<p>One-time setup: prepare the host: <code data-no-translation=\"\">setup<\/code> install whatever is missing from QEMU, load the KVM module, add yourself to the group <code data-no-translation=\"\">kvm<\/code> and adjust the necessary kernel parameters, asking for the password only once via <code data-no-translation=\"\">pkexec<\/code>. Then open the app:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">kvm-gui setup\nkvm-gui<\/code><\/pre>\n<p>Click <strong>New<\/strong>, choose <strong>macOS<\/strong> and the version, or <strong>Linux \/ Windows \/ Other<\/strong> with an ISO. kvm-gui detects the system and suggests CPU, memory, and disk according to your host. Click <strong>Start<\/strong> and the screen appears inside the app; a macOS VM boots straight into Recovery, where you install the system.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"Assistente Nova VM do kvm-gui, com nome, pasta, ISO, tipo de convidado e vers\u00e3o do macOS\" src=\"\/wp-content\/uploads\/2026\/11\/kvm-gui-nova-vm.webp\" width=\"1200\" height=\"750\" \/><\/p>\n<p>The same steps from the terminal:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">kvm-gui vm create Ubuntu --guest linux --profile ubuntu --iso ubuntu-26.04.iso\nkvm-gui vm start<\/code><\/pre>\n<h2>Linux and Windows with 3D, Vulkan, and TPM<\/h2>\n<p>Windows guests use UEFI with Secure Boot and a 2.0 emulated TPM, <code data-no-translation=\"\">swtpm<\/code>, which meets the requirements for Windows 11. On Linux guests, the 3D acceleration option enables virtio-gpu with virgl (OpenGL), and <strong>Vulkan (Venus)<\/strong> brings the guest's Vulkan to the host GPU you choose: the <code data-no-translation=\"\">vulkaninfo<\/code> inside the VM shows your AMD or NVIDIA card, without passthrough. Vulkan was validated on the reference host, Ubuntu 26.04; on Debian 13, there is 3D without Vulkan.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"Configura\u00e7\u00f5es de tela do kvm-gui com acelera\u00e7\u00e3o 3D e Vulkan (Venus) e a escolha da GPU do host\" src=\"\/wp-content\/uploads\/2026\/11\/kvm-gui-vulkan-venus.webp\" width=\"1200\" height=\"750\" \/><\/p>\n<h2>Coming from VirtualBox<\/h2>\n<p>If you have VMs on the <a href=\"\/en\/2026\/09\/a-historia-do-virtualbox\/\">VirtualBox<\/a>, use <strong>File \u203a Import Appliance\u2026<\/strong> with a <code data-no-translation=\"\">.ova<\/code>, or:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">kvm-gui vm import-ova box.ova --dry-run   # mostra o que ser\u00e1 criado e o que n\u00e3o \u00e9 mantido\nkvm-gui vm import-ova box.ova<\/code><\/pre>\n<p>The appliance is treated as untrusted: the manifest, headers, and disks are checked before conversion to qcow2, and a failed import leaves no residue. The path back also exists \u2014 <code data-no-translation=\"\">kvm-gui vm export-ova<\/code> generates a <code data-no-translation=\"\">.ova<\/code> that VirtualBox 7 imports. macOS VMs are left out of the OVA and migrate between hosts with <code data-no-translation=\"\">kvm-gui vm export --full<\/code>.<\/p>\n<h2>macOS with Metal: Reims vGPU<\/h2>\n<p>macOS has no driver for QEMU's emulated video cards, so without acceleration the interface becomes sluggish. kvm-gui integrates the <a href=\"https:\/\/github.com\/steelbrain\/reims-vgpu\" rel=\"noopener\" target=\"_blank\">Reims vGPU<\/a>, a paravirtual GPU that delivers Metal to the guest using the Vulkan driver of the GPU that already renders your desktop. The app installs QEMU from Reims from a ready-made package, with a verified SHA-256:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">kvm-gui reims install\nkvm-gui reims status<\/code><\/pre>\n<p>On the reference host, macOS Sequoia 15.8.1 boots on Reims vGPU with Metal enabled. Sonoma is the version validated end to end; the others, from High Sierra to Tahoe, are experimental.<\/p>\n<h2>Your VMs in the hands of an AI agent<\/h2>\n<p>The same binary is an MCP server. To use it in Claude Code:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">claude mcp add kvm-gui -- kvm-gui mcp<\/code><\/pre>\n<p>Then you can ask, for example, <em>&#8220;crie uma VM Ubuntu a partir de ~\/Downloads\/ubuntu.iso e inicie&#8221;<\/em>. The agent creates, starts, and shuts down VMs, views the screen and types on it, runs commands over SSH, takes snapshots, and imports and exports appliances. Destructive actions, such as forcing a shutdown or running commands on the guest, require explicit confirmation. If you like the topic, the <a href=\"\/en\/2026\/09\/mcp-wp-go-wordpress-por-mcp-sem-ssh\/\">mcp-wp-go<\/a> follows the same idea for WordPress.<\/p>\n<h2>Supported hosts<\/h2>\n<table>\n<thead>\n<tr>\n<th>Host<\/th>\n<th>Package<\/th>\n<th>Status<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Ubuntu 26.04<\/td>\n<td><code data-no-translation=\"\">.deb<\/code><\/td>\n<td>tested on every CI; reference host (3D and Vulkan validated)<\/td>\n<\/tr>\n<tr>\n<td>Debian 13<\/td>\n<td><code data-no-translation=\"\">.deb<\/code><\/td>\n<td>tested on every CI; 3D without Vulkan<\/td>\n<\/tr>\n<tr>\n<td>Rocky Linux 10<\/td>\n<td><code data-no-translation=\"\">.rpm<\/code><\/td>\n<td>tested on every CI; macOS VMs require the Reims vGPU, and the distro's QEMU has no 3D<\/td>\n<\/tr>\n<tr>\n<td>Ubuntu 24.04<\/td>\n<td>\u2014<\/td>\n<td>unsupported; use v0.15.0<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Under the hood<\/h2>\n<p>Backend in Go with Cobra for the CLI, the official Go MCP SDK, and SQLite in pure Go (<code data-no-translation=\"\">modernc.org\/sqlite<\/code>); the GUI is Wails with Vue. OpenCore, Lilu, VirtualSMC, WhateverGreen, and OVMF are bundled from the official releases. Everything compiles into a Docker image (<code data-no-translation=\"\">make image test dist<\/code>) and each release is installed and run in clean Ubuntu 26.04, Debian 13, and Rocky Linux 10 containers. BSD-3-Clause license, with credits to OSX-KVM, acidanthera, TianoCore, Dortania, and Reims vGPU.<\/p>\n<h2>Try it<\/h2>\n<p>If you live between the comfort of VirtualBox and the performance of KVM, kvm-gui is for your home lab: one binary, the VMs you already know, and a bonus AI agent. Install it, create your first VM, and tell me what you thought \u2014 stars and issues on <a href=\"https:\/\/github.com\/jniltinho\/kvm-gui\" rel=\"noopener\" target=\"_blank\">GitHub<\/a> are very welcome. For historical context, also see <a href=\"\/en\/2026\/09\/a-historia-do-proxmox\/\">the history of Proxmox<\/a>, another project that made KVM user-friendly, and the <a href=\"\/en\/2026\/09\/ova2xva\/\">ova2xva<\/a>, for migrating VMs from VirtualBox to XCP-ng.<\/p>","protected":false},"excerpt":{"rendered":"<p>kvm-gui is a VirtualBox-style app for KVM: a single Go binary with a GUI, CLI, and MCP server that creates and runs macOS, Linux, and Windows VMs at native speed, with 3D, Vulkan, TPM 2.0, and VirtualBox .ova import.<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11,21,2,111,3],"tags":[31,209,309,311,558,140,138,559],"class_list":["post-1904","post","type-post","status-publish","format-standard","hentry","category-debian","category-infra","category-linux","category-opensource","category-ubuntu","tag-golang","tag-kvm","tag-macos","tag-mcp","tag-qemu","tag-virtualbox","tag-virtualizacao","tag-wails"],"_links":{"self":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts\/1904","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/comments?post=1904"}],"version-history":[{"count":1,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts\/1904\/revisions"}],"predecessor-version":[{"id":1906,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts\/1904\/revisions\/1906"}],"wp:attachment":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/media?parent=1904"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/categories?post=1904"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/tags?post=1904"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}