The 812GB Hiding in Plain Sight
Date: November 18, 2025 Issue: VM wonโt boot after hypervisor migration Root Cause: Hypervisor compatibility (KVM โ Proxmox) Actual Solution: 812GB of free space I didnโt know I had
The Setup
Iโve been building Argo OS โ a custom Gentoo distribution โ inside a KVM virtual machine on my main workstation. The VM was working perfectly, but running it on my daily driver meant competing for resources.
Simple plan: migrate the VM to my Proxmox server. Free up my workstation. Done.
The Migration Attempt
Step 1: Copy the QCOW2 disk image to Proxmox.
rsync -avP gentoo-btrfs.qcow2 [email protected]:/tank/vms/
qm disk import 200 /tank/vms/gentoo-btrfs.qcow2 tank
Step 2: Boot the VM.
PXE-E53: No boot filename received
Booting from Hard Disk...
Nothing. Just a blinking cursor.
Problem 1: Disk Not Attached
Classic rookie mistake. qm disk import imports the disk but doesnโt attach it.
qm config 200
# boot: order=net0
# unused0: tank:vm-200-disk-0 โ There it is, unused
qm set 200 --scsi0 tank:vm-200-disk-0
qm set 200 --boot order=scsi0
Okay, now boot.
Problem 2: Missing UEFI
Still hung at โBooting from Hard Diskโฆโ
qm config 200 | grep -i "bios\|efi"
# Nothing
The VM was UEFI-based, but Proxmox defaults to BIOS. UEFI boot entries live in firmware NVRAM โ they donโt transfer between hypervisors.
qm set 200 --efidisk0 tank:vm-200-efi,efitype=4m,pre-enrolled-keys=1
qm set 200 --bios ovmf
Boot again.
Problem 3: The Graphics Nightmare
GRUB loaded! Progress. Selected the kernel.
Then the screen became modern art. Garbled colors. Corrupted text. Random pixels.
I tried everything:
nomodesetkernel parametervga=off- Different display types
- Serial console fallback
Nothing worked.
The Root Cause
This wasnโt a configuration problem. This was a hardware abstraction layer mismatch.
- KVM environment: Specific virtual hardware (virtio devices, ACPI tables, CPU flags)
- Proxmox QEMU: Different virtual hardware emulation
The Gentoo kernel was compiled for KVMโs virtual environment. It had drivers and configurations specific to that hardware abstraction. Proxmox presented different virtual hardware, and the kernel couldnโt initialize it.
I could spend days debugging graphics drivers. Orโฆ
The Pivot
โIs this how distro developers would do it?โ
No. Real distro developers donโt migrate VMs. They:
- Build reproducibly from source
- Use binary package repositories
- Version control configurations
- Deploy fresh to each target
I was treating VM images like pets. I should be treating them like cattle.
The Discovery
While planning a fresh install on my workstation, I ran fdisk -l:
Device Start End Sectors Size Type
nvme0n1p1 2048 1050623 1048576 512M EFI System
nvme0n1p2 1050624 1083391 32768 16M Linux filesystem
nvme0n1p3 1083392 735160319 734076928 350G Microsoft basic data
nvme0n1p4 735160320 1258143743 522983424 249.4G Microsoft basic data
nvme0n1p5 1258143744 1259458559 1314816 642M Windows recovery
nvme0n1p6 1259458560 1259491327 32768 16M Microsoft reserved
nvme0n1p8 2963310592 3907029134 943718543 450G Linux filesystem
# Wait. p6 ends at 1,259,491,327. p8 starts at 2,963,310,592.
# That's a gap of... 1.7 billion sectors?
812 gigabytes. Unallocated. On my main NVMe drive.
Iโd been so focused on the 450GB openSUSE partition and the Windows partitions that I never noticed a massive gap between them.
The New Plan
Forget the VM. Fresh install on bare metal.
Proposed layout in the 812GB gap:
โโโ p7: 200G Gentoo root (/)
โโโ p9: 8G Gentoo swap
โโโ Remaining: ~604GB (future expansion)
Why this is better:
- โ Native hardware (NVIDIA GPU, actual CPU features)
- โ No hypervisor overhead
- โ No compatibility issues
- โ Binary packages from Tau-Ceti-Lab server
- โ Configurations from Git
The Tau-Ceti-Lab machine compiles everything. My workstation just consumes pre-built packages.
The Architecture Shift
Before:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Workstation โ
โ โโโ openSUSE (daily driver) โ
โ โโโ KVM VM (Gentoo Golden Image) โ
โ โโโ Compiles @world โ
โ โโโ Eats CPU/RAM โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
After:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Testbed (Tau-Ceti-Lab) โ
โ โโโ Bare metal Gentoo โ
โ โโโ Compiles @world continuously โ
โ โโโ Serves binpkgs via HTTP โ
โโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโ
โ
โ HTTP: binary packages
โ Git: configurations
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Workstation (Canopus-Outpost) โ
โ โโโ openSUSE (legacy, shrinking) โ
โ โโโ Gentoo (fresh install) โ
โ โโโ Pulls configs from Git โ
โ โโโ Pulls binpkgs from Tau-Ceti-Lab โ
โ โโโ Never compiles locally โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Lessons Learned
-
Check for unallocated space before assuming you need to shrink partitions. 812GB was hiding in plain sight.
-
VM migration between hypervisors is non-trivial. UEFI variables, hardware abstraction, drivers โ theyโre all tied to the source environment.
-
Sometimes the right answer is to start fresh. I could have spent days debugging graphics drivers. Instead, I designed a better architecture.
-
Distro development has best practices for a reason. HTTP repositories, Git for configs, reproducible builds โ these exist because VMs donโt scale.
-
Bare metal can be simpler than VMs. No hypervisor compatibility, faster compilation, real hardware support.
What I Built
# On Tau-Ceti-Lab - set up package repository
emerge -av nginx
# Configure to serve /var/cache/binpkgs
# On workstation - configure to consume
echo 'PORTAGE_BINHOST="http://10.42.0.194"' >> /etc/portage/make.conf
echo 'FEATURES="${FEATURES} getbinpkg"' >> /etc/portage/make.conf
# Install using binary packages
emerge -av --getbinpkg @world
No compilation on the workstation. Everything pre-built on the Tau-Ceti-Lab. Install time: minutes instead of hours.
The Irony
I spent 4 hours trying to fix a VM migration.
The solution was already on my disk, in the form of 812GB of free space I forgot existed.
Sometimes the bug isnโt in the code. Itโs in the assumption that you understood the problem.
The discovery of 812GB of hidden free space led to a complete architecture redesign. What started as a troubleshooting session became a lesson in professional distro development practices.