Running microVMs in Proxmox VE, The Easy Way

Lobsters Hottest Tools

Summary

Introduces pve-microvm, a Debian package that integrates QEMU's microvm machine type into Proxmox VE, enabling sub-300ms boot times and hardware isolation with minimal overhead, supporting various guest OS types.

<p><a href="https://lobste.rs/s/fdmitg/running_microvms_proxmox_ve_easy_way">Comments</a></p>
Original Article
View Cached Full Text

Cached at: 07/20/26, 09:34 AM

# Running microVMs in Proxmox VE, The Easy Way Source: [https://taoofmac.com/space/blog/2026/06/18/1845](https://taoofmac.com/space/blog/2026/06/18/1845) [Jun 18th2026](https://taoofmac.com/space/blog/2026/06/18/1845)· 15 min read ·\#containers \#homelab \#kvm \#microvm \#proxmox \#qemu \#virtualization I’ve been running a mixed[Proxmox](https://taoofmac.com/space/os/linux/distributions/proxmox)cluster for years – four nodes of wildly different capability, from an Atom x5\-Z8350 with 2 GB of RAM \(a[`z83ii`](https://taoofmac.com/space/blog/2017/12/03/2130), currently offline after years of faithful service as a baseline torture device\) up to an i7\-12700 with 128 GB \([`borg`](https://taoofmac.com/space/blog/2023/02/18/1845), my main homelab server\)\. This year, somewhere along the way between writing[`agentbox`](https://github.com/rcarmo/agentbox?utm_source=taoofmac.com&utm_medium=web&utm_campaign=unsolicited_traffic&utm_content=external_link)and all the hype around agentic sandboxes I got tired of the eternal compromise between LXC containers and full virtual machines, and ended up building[`pve\-microvm`](https://github.com/rcarmo/pve-microvm?utm_source=taoofmac.com&utm_medium=web&utm_campaign=unsolicited_traffic&utm_content=external_link)– a Debian package that adds QEMU’s`microvm`machine type as a first\-class managed guest in[Proxmox](https://taoofmac.com/space/os/linux/distributions/proxmox)VE\. This isn’t a quick hack\. Well, the first version was, actually, but it’s gone quite a bit farther than that, and certainly farther than I expected\. It now ships a custom kernel, patches the[Perl](https://taoofmac.com/space/dev/perl)internals to provide[Proxmox](https://taoofmac.com/space/os/linux/distributions/proxmox)web UI integration, and, due to my usual fascination with offbeat operating systems, ended up supporting \(as of this writing\) 21 guest OS types from Debian to NetBSD to[Plan9](https://taoofmac.com/space/os/plan9)\. Yes, I completely brought it upon myself to run[Plan9](https://taoofmac.com/space/os/plan9)in a microVM, and yes, it works\. [## Finding the Right Balance](https://taoofmac.com/space/blog/2026/06/18/1845#finding-the-right-balance)After a few rounds of cluster cleanups and migrations, it’s now my daily driver for running[Gitea](https://taoofmac.com/space/apps/gitea), Caddy reverse proxies, mini\-firewalls, and the AI agent that’s helping me clean up this post\. [Proxmox](https://taoofmac.com/space/os/linux/distributions/proxmox)gives you two main options out of the box: - [LXC](https://taoofmac.com/space/os/linux/lxc)containers start instantly, share the host kernel, and are spectacularly efficient\. But they’re not*isolated*– a kernel exploit in one container compromises everything\. You can’t run a different OS\. You can’t easily nest Docker inside them without ending up \(eventually\) wrestling with`fuse\-overlayfs`gymnastics\. And certain workloads \(anything needing custom kernel modules, or`CAP\_SYS\_ADMIN`in anger\) simply don’t fit\. - Full VMs give you hardware isolation via KVM/VT\-x, but they boot SeaBIOS or OVMF, sedately walk through GRUB as they yawn their way out of bed, probe a forest of emulated legacy devices \(IDE controllers, VGA, USB hubs, PCI bridges\), and typically take 5\-10 seconds to reach a login prompt\. Each one carries the overhead of that entire emulated chipset sitting in memory\. What I wanted was the security boundary of a VM with the startup characteristics of a container\. QEMU’s`microvm`machine type – originally developed for Firecracker\-style workloads – strips all of that away\. No BIOS, no GRUB, no legacy devices\. Direct kernel boot into a minimal`virtio`\-only environment\. The result: sub\-300ms boot to a fully networked guest with a QEMU agent, running inside its own KVM hardware isolation boundary\. ![Comparison of Standard VM, microVM, and LXC Container isolation and boot characteristics](https://taoofmac.com/media/blog/2026/06/18/1845/ycjiz2cThuEG3Atzjdf7MbCVX6w=/microvm-vs-lxc-vs-vm.svg)Comparison of Standard VM, microVM, and LXC Container isolation and boot characteristicsNow, let me be clear: I’m not spawning hundreds of these things\.[I have Azure for that](https://github.com/rcarmo/azure-k3s-cluster?utm_source=taoofmac.com&utm_medium=web&utm_campaign=unsolicited_traffic&utm_content=external_link)– but I do want to run[Gitea](https://taoofmac.com/space/apps/gitea)Actions workers, have a very limited set of hardware resources, and got fed up with the time it took for one particular VM to boot repeatedly… [## What It Actually Does](https://taoofmac.com/space/blog/2026/06/18/1845#what-it-actually-does)`pve\-microvm`is a single`\.deb`that patches Proxmox’s`qemu\-server`Perl modules at install time\. When you set`machine: microvm`on a VM config, the standard`config\_to\_command`function delegates to my`MicroVM\.pm`, which builds an \(almost\) completely different QEMU command line: ``` qemu-system-x86_64 -M microvm,x-option-roms=off,pit=off,pic=off,\ isa-serial=on,rtc=on,acpi=on,pcie=on \ -kernel /usr/share/pve-microvm/vmlinuz \ -initrd /usr/share/pve-microvm/initrd \ -append "console=ttyS0 root=/dev/vda rw quiet" \ -device virtio-blk-pci-non-transitional,drive=drive-scsi0 \ -device virtio-net-pci-non-transitional,netdev=net0 \ ... ``` No chipset emulation\. No PCI bridges\. No VGA\. The guest gets a single serial console \(which PVE’s`xterm\.js`connects to natively\),`virtio`block devices, and a`virtio`network interface\. Everything rides PCIe transport with non\-transitional \(modern\-only\)`virtio`devices rather than the MMIO transport`microvm`was originally designed around – for reasons I’ll come to in a moment\. ![How pve-microvm integrates with Proxmox VE internals](https://taoofmac.com/media/blog/2026/06/18/1845/Uu0L1y7Lqvf0bPpVCCmxqH2nURc=/microvm-architecture.svg)How pve\-microvm integrates with Proxmox VE internalsThe package ships: - A tiny \(12MB\) pre\-built Linux 6\.12\.22 kernel compiled from`x86\_64\_defconfig`with a minimal overlay –`virtio`,`vsock`,`virtiofs`,`9p`, and the modules Docker needs \(`overlay`,`veth`,`bridge`,`netfilter`,`BPF`\), because, well, I’m pragmatic\. - A 1 MB`initrd`that probes`virtio`devices, finds the root filesystem by label or device path, and does a`switch\_root`in ~150ms - `pve\-microvm\-template`– builds root filesystems from any of 12 supported OCI base images, with optional SSH, Docker, and guest agent - `pve\-oci\-import`– pulls an OCI image directly into a PVE\-managed disk - Web UI extensions – a “Create µVM” button, machine type dropdown, conditional panel hiding for irrelevant settings, and an amber bolt icon in the resource tree - A systemd service \(`pve\-microvm\-early\.service`\) that ensures patches are applied before`pvedaemon`starts on boot – critical for`onboot=1`VMs [### The Boot Sequence](https://taoofmac.com/space/blog/2026/06/18/1845#the-boot-sequence)Like in aerodynamics, most speed comes from eliminating everything that isn’t strictly necessary\. A standard VM spends most of its boot time in firmware and bootloader, so a microVM skips all of that\. ![Boot timeline comparison between microVM and standard VM](https://taoofmac.com/media/blog/2026/06/18/1845/-LaDyezTn_ik4nPTQr4EpujyaQc=/boot-sequence.svg)Boot timeline comparison between microVM and standard VMSmolBSD \(a NetBSD guest using`virtio\-mmio`transport\) boots in 31ms\. A full Debian with Docker and the QEMU agent is ready in under 8 seconds – and most of that time is`apt`package installation during first boot\. Subsequent boots hit the 300ms mark consistently, even on my humble hardware\. A fun rabbit hole I went into when someone asked me to add SmolBSD support: There’s a reason SmolBSD gets to use`virtio\-mmio`and the Linux guests don’t\. A QEMU`microvm`machine type can carry its`virtio`devices over two transports: the bare\-bones MMIO interface it was originally built for, or PCIe\. MMIO is the lighter of the two – no PCIe host bridge, no ACPI – which is how a NetBSD guest shaves itself down to 31 ms\. But on QEMU 10\.x the MMIO path has \(as far as I can tell\) a device\-probing bug for Linux guests: only`virtio\-blk`binds, and the network, serial and balloon devices are never claimed by their drivers for some reason\. NetBSD probes MMIO correctly and is perfectly happy; Linux \(at least the kernel I am using\) is not\. For every Linux guest I therefore fall back to PCIe with non\-transitional \(modern\-only\)`virtio`devices, which binds all of them reliably\. The cost is about 50 ms of extra bring\-up – which, against a 300 ms boot, I’ll take without complaint\. I think the above is actually a bug in my kernel configuration, but haven’t really had time \(or maybe even the right hardware\) to tackle it – this is something I’d love more people to look at[and contribute patches](https://github.com/rcarmo/pve-microvm?utm_source=taoofmac.com&utm_medium=web&utm_campaign=unsolicited_traffic&utm_content=external_link)\. [### One Kernel, Many Guests](https://taoofmac.com/space/blog/2026/06/18/1845#one-kernel-many-guests)There’s a deliberate consequence of this direct kernel boot trick that’s easy to miss: the kernel doesn’t live*inside*the guest\. It sits on the Proxmox host at`/usr/share/pve\-microvm/vmlinuz`, and the guest disk holds nothing but a root filesystem – userland, no`/boot`, no GRUB, no per\-guest kernel package, no`initramfs`of its own\. That also means there’s no “boot the installer ISO and click through it” path, so instead the`rootfs`gets built straight from an OCI image with`pve\-microvm\-template`\(Debian, Alpine, Fedora, Rocky, Amazon Linux and friends\)\. In the weird cases, we import a prepared ext4/raw disk with`qm importdisk`\. You don’t*install*an OS – you*assemble*a root filesystem\. Decoupling the kernel from the`rootfs`is what makes this interesting to run at scale\. Every Linux microVM on the node boots the*same*`vmlinuz`– one kernel, built once from a stock`x86\_64\_defconfig`with a`microvm`overlay, so you can audit and update it in exactly one place: drop a new`vmlinuz`on the host, restart the guests, done\. No guest ever pulls a broken kernel from an`apt`upgrade, because no guest*has*a kernel to upgrade, and the`rootfs`images stay tiny and completely kernel\-agnostic\. Container\-style kernel consistency, VM\-style isolation\. [## What I’m Running](https://taoofmac.com/space/blog/2026/06/18/1845#what-im-running)On my cluster right now, I have a fair smattering of these already\. Four off the top of my head are: - `gitea`\(VM 114, on an Intel N5105\) – Bare\-metal[Gitea](https://taoofmac.com/space/apps/gitea)with SQLite, Caddy HTTPS, local actions runner, Avahi discovery\. 2 cores, 2 GB RAM, 32 GB disk\. Boots in ~3s, mostly because[Gitea](https://taoofmac.com/space/apps/gitea)does a lot of housekeeping\. - `smith`\(VM 9022, on my i7\) – the main[`piclaw`](https://github.com/rcarmo/piclaw?utm_source=taoofmac.com&utm_medium=web&utm_campaign=unsolicited_traffic&utm_content=external_link)agent, the system that manages the cluster, releases[`piclaw`](https://github.com/rcarmo/piclaw?utm_source=taoofmac.com&utm_medium=web&utm_campaign=unsolicited_traffic&utm_content=external_link)and generally keeps tabs on everything\. 2 cores, 6 GB RAM, 48 GB disk\. Runs Docker internally, and has 3 smaller, volatile siblings scattered throughout the cluster that don’t run Docker but have different roles \(CI/CD, wipe\-and\-reinstall agent instance for testing upgrades, etc\.\) - `exo`\(VM 9021, on my i7\) – Distributed inference coordinator for running LLMs across multiple machines\. CPU\-only, 2 GB root\. - `virtualdsm`\(VM 300,[`tnas`](https://taoofmac.com/space/blog/2024/12/26/2330)\) – Synology DSM running inside a microVM with Docker, inside Terramaster NAS hardware\. Yeah, I know I’m weird, but it was[needed](https://taoofmac.com/space/blog/2026/05/15/1330)when my Synology went sideways and I haven’t nuked it yet\. Uses the stock Debian kernel rather than my custom one, because DSM needs specific module paths\. I also have a dormant 9Front \([Plan9](https://taoofmac.com/space/os/plan9)\) one, as well as a little menagerie of OpenWrt, OPNsense, OSv unikernels, gokrazy Go appliances, and various Alpine/Fedora/Rocky/Amazon Linux configurations filed away as standard[Proxmox](https://taoofmac.com/space/os/linux/distributions/proxmox)backups\. The 21 guest OS types aren’t theoretical – each one has been booted and validated, and sometimes`smith`will go and thaw one out to do regression tests\. The[`z83ii`](https://taoofmac.com/space/blog/2017/12/03/2130)\(that ancient Atom x5\-Z8350 with 2GB RAM\) was invaluable as a baseline test platform, because If a microVM can boot and run usefully on a fanless 2016\-era Atom with 2 GB of total system memory, it’ll work anywhere\. And it could run six before it started slowing down… [## What a Config Looks Like](https://taoofmac.com/space/blog/2026/06/18/1845#what-a-config-looks-like)There’s no magic to a microVM config – it’s an ordinary`qm`guest with a particular`machine`type and a kernel command line\. Here’s`gitea`\(the VM 114 above\) as it sits in`/etc/pve/qemu\-server/114\.conf`: ``` agent: 1 args: -kernel /usr/share/pve-microvm/vmlinuz -append "console=ttyS0 root=/dev/vda rw quiet" boot: order=scsi0 cores: 2 machine: microvm memory: 2048 name: gitea net0: virtio=BC:24:11:00:6E:01,bridge=vmbr0 onboot: 1 scsi0: local-lvm:vm-114-disk-0,size=32G serial0: socket tags: microvm vga: serial0 ``` The only microvm\-specific lines are`machine: microvm`, the`args`carrying the kernel and its cmdline, and`serial0: socket`/`vga: serial0`wiring the console through to`xterm\.js`\. Everything else – cores, memory, the virtio NIC on`vmbr0`, the`scsi0`disk on`local\-lvm`,`onboot`, the guest agent – is exactly what you’d write for any Proxmox VM\. Note there’s no`\-initrd`in`args`:`MicroVM\.pm`injects it automatically when it sees the shipped kernel, along with the`balloon`,`vsock`and \(when configured\)`virtiofs`devices\. That’s the whole point – a microVM is a normal guest that happens to boot a host\-provided kernel, not a special object you have to learn a new tool to manage\. [### Networking](https://taoofmac.com/space/blog/2026/06/18/1845#networking)A microVM attaches to the network exactly like any other[Proxmox](https://taoofmac.com/space/os/linux/distributions/proxmox)guest\. The interface spec is a bit of a mouthful \(`virtio\-net\-pci\-non\-transitional`device on the PCIe bus\), and it lands on whatever Linux bridge and VLAN you point it at: ``` qm set 900 --net0 virtio,bridge=vmbr0 # single NIC qm set 900 --net0 virtio,bridge=vmbr0,tag=100 # tagged onto VLAN 100 ``` Because it’s an ordinary KVM guest, the standard PVE firewall applies – per\-VM`nftables`rules work the way they do for any VM, which is the part that actually matters when you’re running untrusted code\. Inside the guest, networking is handled by`systemd\-networkd`rather than`cloud\-init`: DHCP by default \(matched on`Type=ether`, so it survives cloning with no MAC pinning\), or a one\-line`/etc/microvm\-static\-net`for a static address\. Earlier versions leaned on`cloud\-init`for this, and I found it too brittle; moving it to`systemd\-networkd`made cloning reliable and I stopped having to debug templates half the time\. Network*isolation*, another mainstay of the current hype around agent isolation, is a solved problem I have no interest in re\-solving inside the package because I think[Proxmox](https://taoofmac.com/space/os/linux/distributions/proxmox)’s own[SDN](https://pve.proxmox.com/wiki/Software-Defined_Network?utm_source=taoofmac.com&utm_medium=web&utm_campaign=unsolicited_traffic&utm_content=external_link)already does it properly – a simple VLAN zone with a separate VNet per trust domain keeps untrusted guests on their own segment with no path to the LAN, and if I ever bothered with that on a home LAN \(well I have*thought*about it… but got no time\), a VXLAN zone with a designated exit node would let me funnel egress through a single firewalled choke point\. The microVM just lands on whatever VNet I point`net0`at, so the policy lives in[Proxmox](https://taoofmac.com/space/os/linux/distributions/proxmox), not in a one\-off ruleset I’d have to babysit\. There’s also a non\-networked path for host/guest plumbing: each guest gets a`vsock`CID \(VMID \+ 1000\), which I use for SSH\-agent forwarding \(host keys into the guest without ever exposing them on the wire\) and for`virtiofs`/`9p`directory sharing, because… I forget\. I know I needed it at one point, even if right now most of my`microvm`instances just do SMB mounts \(which were a pain to do under Docker and LXC\) The NIC count is… moderately sane\. I currently allow six`virtio`interfaces per guest \(`net0`\-`net5`\) on the spurious grounds that they’re twice the maximum number of physical interfaces across all of my host machines\. It’s just defined in`MicroVM\.pm`, and the very few people who need more than that are welcome to tweak it \(and if you think you want a dozen you almost certainly want VLANs instead\)\. [### Storage and Migration](https://taoofmac.com/space/blog/2026/06/18/1845#storage-and-migration)Storage was… trivial? every PVE backend works, because the disk is just a`virtio\-blk\-pci`device and[Proxmox](https://taoofmac.com/space/os/linux/distributions/proxmox)hands it the same path it hands any VM\. LVM and LVM\-thin, ZFS, Ceph/RBD, NFS and CIFS, plain directory storage – all fine, with snapshots, linked and full clones,`vzdump`backups and`qm importdisk`behaving exactly as they do elsewhere\. A`microvm`is a normal PVE guest that happens to boot differently\. Migration is the only place things are iffy\. a\) I can’t do live migration on any of my hardware \(none of it is enterprise grade\), and b\) true live migration isn’t viable with the current QEMU`microvm`machine type anyway – it simply doesn’t implement it\. Offline migration \(i\.e\., reshuffling instances around\) works fine, though, and because`microvm`boot in well under a second, you*can*run a quick HA relocate cycle – stop, migrate, start – provided your disks live on shared storage\. I’ve measured it at around two seconds moving a small guest between nodes on shared CIFS\. Not seamless VM motion, but perhaps good enough for most uses, and as far as I can figure out,`ha\-manager`drives it the same way it would any guest\. [## Vs\. LXC: When To Choose What](https://taoofmac.com/space/blog/2026/06/18/1845#vs-lxc-when-to-choose-what)Mind you, I still run LXC containers\. They’re the right choice when: - You trust the workload \(or it’s your own code\) - You need zero boot overhead - You want direct filesystem access from the host - You want slightly less memory allocation overhead \(oh, and there’s shared page cache if you’re really lucky\) MicroVMs win when: - You need actual kernel isolation – running untrusted code, different kernel versions, nested Docker, anything with aggressive`CAP\_`requirements - You want a reproducible image you can snapshot, back up \(`vzdump`works\), offline\-migrate, and clone \(linked clones too\) - The workload does something unusual to the kernel \(BPF programs, custom`netfilter`rules, kernel modules\) and you don’t want that leaking into your host \(which is why most of my tunnels now land in a`microvm`\) - You’re running non\-Linux guests – NetBSD, Plan 9, FreeBSD\-based firewalls – which simply can’t run as LXC - You want a VM that’s up before you’ve finished the command\. The overhead difference between LXC and a microVM on modern hardware is surprisingly small\. On`borg`\(that i7\-12700\), the idle memory footprint of a minimal`microvm`is ~40 MB, and the CPU overhead of the hypervisor is unmeasurable for most workloads\. The memory figure you set at boot is genuinely just a ceiling: As far as I can tell KVM still only backs the pages a guest actually touches, and the host’s same\-page merging dedupes identical pages – kernels, libc, shared base\-image layers – across every`microvm`on the node, so like on grown\-up cloud hypervisors the real cost tracks the working set, not the nominal allocation\. Much to my embarrassment, I didn’t even bother with live resizing for a long while, but I added`balloon`support to the kernel recently, with`free\-page\-reporting`and`deflate\-on\-oom`\. PVE’s balloon target drives proper auto\-ballooning, and a`virtio\-mem`device gives genuine fine\-grained hot\-add and hot\-remove, so, again, this works like a normal VM\. [## The Awkward Parts](https://taoofmac.com/space/blog/2026/06/18/1845#the-awkward-parts)Now for the catches… First one is pretty obvious: I’m patching someone else’s product, and even though I survived the[Perl](https://taoofmac.com/space/dev/perl)4 to Perl 5 transition decades ago*and*I have Codex to help these days, patching the Perl internals is fragile–every`qemu\-server`upgrade can break my setup\. I mitigate this by a\) not blindly running upgrades and b\) using`dpkg`triggers \(the package re\-patches automatically after upgrades\), but it’s still a race condition waiting to happen – I’ve had partial PVE upgrades leave the system in a state where`pvedaemon`couldn’t even compile the patched module\. And then come the weird failure modes–one upgrade had a nasty little side effect regarding root devices: - Root is found at`root=/dev/vda`because the guest boots under the`microvm`machine type with`virtio\-blk`on PCIe - but if a guest ever comes up under the standard chipset instead \(a half\-applied patch, or an`onboot=1`VM starting before the early\-boot service has re\-patched after a host reboot\), the same disk enumerates as`/dev/sda`, root isn’t found, and the VM looks like it has lost its filesystem\. The data is always there, just at the wrong path\. I’ve patched that particular twist in a way that the`dpkg`trigger and early\-boot service ordering try to mitigate it, so the`initrd`now falls back to`/dev/sda`when`/dev/vda`is missing – but until \(if ever\) Proxmox supports microVMs natively, expect the occasional papercut\. Package version mismatches can cascade\. I learned this the hard way – a partial`apt upgrade`on one of my nodes left`libpve\-cluster\-perl`and`libpve\-network\-perl`at incompatible versions, which broke all Perl module loading, which meant`pvedaemon`couldn’t start, which meant VMs couldn’t be managed\. So… always do full`dist\-upgrade`, never partial upgrades on PVE nodes with this\. Another catch \(for some\) is that there is no VGA and no graphical console – the serial console is your only interface\. If something goes wrong during boot, you’re reading kernel panics on a terminal\. This is fine for servers, less fine for desktop\-oriented guests, and[Plan9](https://taoofmac.com/space/os/plan9)really doesn’t like it\. The next one is that*there’s no USB at all – no controllers, no passthrough, nothing on the bus*– so I had to get the web UI to hide those options the moment you flip a guest to`microvm`\. This might be a deal\-breaker if you want to, say, run a[Zigbee](https://taoofmac.com/space/protocols/zigbee)controller \(and is why my home automation stuff is still in an LXC\)\. The kernel is opinionated\. My custom 6\.12\.22 kernel includes exactly what I need and nothing else\. If your workload needs a module I haven’t included, you’ll need to rebuild it or use the stock Debian kernel \(which works fine but is 3x larger and boots slower\)\. Finally, GPU and PCI passthrough are*disabled*, not impossible\. And this is another thing I would love people with moremoneyhardware to*really*dive into, since I actually had an RTX 3060 passed through and working in early testing\. In the end, I decided to temporarily disable GPU support for simplicity – the package strips`hostpci\*`today and there’s no`vIOMMU`plumbing wired up, so it’s off by default\. There’s nothing stopping anyone from adding it back \(save some QEMU`microvm`caveats around the minimal ECAM PCIe bus and`IOMMU`setup\), and I’d genuinely love to be able to do proper PCI and`vIOMMU`testing – I just don’t have the spare hardware for it, and I chose to focus this on running agents rather than chasing accelerator passthrough\. [### Under The Hood: The Patch Strategy](https://taoofmac.com/space/blog/2026/06/18/1845#under-the-hood-the-patch-strategy)The package modifies three files in the PVE Perl stack: - `Machine\.pm`– extends the machine type regex to accept`microvm`as a valid value - `QemuServer\.pm`– adds a`use PVE::QemuServer::MicroVM`import and a delegation check at the top of`config\_to\_command`: if the VM has`machine: microvm`, hand off to my module entirely - `MicroVM\.pm`– the complete command builder, installed at`/usr/share/perl5/PVE/QemuServer/MicroVM\.pm` Since I’m obsessive about recoverability, the patches are reversible \(`pve\-microvm\-patch revert`\), and the original files are backed up\. The`dpkg`trigger system \(`interest\-noawait qemu\-server`\) ensures automatic re\-application after PVE updates\. The early\-boot service ensures patches are live before any VM auto\-starts, preventing that`sda`/`vda`mixup I mentioned above: ``` pve-microvm-early.service (Before=pvedaemon.service pve-guests.service) └── /usr/share/pve-microvm/pve-microvm-patch apply ``` [## Getting Started](https://taoofmac.com/space/blog/2026/06/18/1845#getting-started)If you’ve read this far, you’re either a brave person or missed[the GitHub link](https://github.com/rcarmo/pve-microvm?utm_source=taoofmac.com&utm_medium=web&utm_campaign=unsolicited_traffic&utm_content=external_link), so I’ll just drop the potted version here: ``` # On any PVE 9.x node: wget https://github.com/rcarmo/pve-microvm/releases/latest/download/pve-microvm_0.3.12-1_all.deb dpkg -i pve-microvm_0.3.12-1_all.deb # Create a Debian microVM template: pve-microvm-template --vmid 9000 --storage local-lvm --profile standard # Clone it into a real VM: qm clone 9000 100 --name my-microvm --full qm set 100 --machine microvm --memory 1024 --cores 2 qm start 100 ``` The template takes about 60 seconds to build \(pulls the OCI image, installs packages, writes the root filesystem\)\. After that, cloning is near\-instant if you use linked clones\. [## What’s Next](https://taoofmac.com/space/blog/2026/06/18/1845#whats-next)Besides more testing \(that I just don’t have the hardware, time or even focus for, since like most of my projects I just want to*use*the thing\), what’s left is mostly polish: maybe a nicer configuration layer, network\-off\-by\-default with egress allow\-lists for untrusted guests for the paranoid, GPU passthrough if I ever wire up vIOMMU properly, and eventually AArch64 support for ARM\-based PVE nodes \(which I’ve run in the past, and I*think*might also have`microvm`support in their QEMU versions\)\. And, of course, someone should probably upstream this\. I reached out informally to a couple of people at[Proxmox](https://taoofmac.com/space/os/linux/distributions/proxmox)and was told I should join a mailing\-list to discuss this, but a\) that is awfully 90s and b\) I just don’t have the time to do more than maintain this for myself\. And yeah, I get that this would have to go through the entire enterprise QA pipeline \(I[get that a lot, believe me](https://taoofmac.com/space/blog/2025/10/15/0000)\)\. The source is at[github\.com/rcarmo/pve\-microvm](https://github.com/rcarmo/pve-microvm?utm_source=taoofmac.com&utm_medium=web&utm_campaign=unsolicited_traffic&utm_content=external_link), the patches are fairly small, it does not break[Proxmox](https://taoofmac.com/space/os/linux/distributions/proxmox)itself since 99% of the features come from QEMU/KVM, so… I’m just literally giving it away\. But if you’re running a homelab, know your way around Linux and want container\-speed VMs with actual isolation, this might be what you’ve been looking for since… well, statistically, maybe never–but you can have it now\!

Similar Articles

mvm - a fast virtual machine for Go

Lobsters Hottest

mvm is a fast, portable virtual machine for Go that allows running Go programs directly from source, embedding a Go interpreter, and includes a REPL, debugger, and standard library.

Introduction to UEFI HTTP(s) Boot with QEMU/OVMF

Hacker News Top

This article provides a tutorial on setting up UEFI HTTP and HTTPS boot using QEMU and OVMF, highlighting the need for a random number generator device and demonstrating a minimal configuration.