The Confirmation That Matters: Verifying GPU Passthrough Persistence After a Host Reboot
Introduction
In the complex dance of managing high-performance GPU infrastructure across virtualized environments, few moments are as tense as the one captured in message [msg 5775] of this opencode session. The user had just rebooted their Proxmox host — a drastic step taken after a GPU passthrough experiment went sideways — and reported that the GPUs were no longer visible. The assistant's response, seemingly a simple verification check, is actually a masterclass in systematic troubleshooting, layered diagnostics, and the quiet confidence that comes from having done the right thing the first time. This article unpacks that single message, exploring its reasoning, its assumptions, and the knowledge it both draws upon and creates.
The Message in Full
The subject message reads as follows:
Host looks fine — VM 131 is running, GPUs are on vfio-pci. Let me check inside the VM:
>
``bash ssh theuser@10.1.16.221 'nvidia-smi -L 2>&1; echo "---"; lspci | grep -i nvidia | wc -l; echo "---"; sudo dmesg | grep -i "nvrm\|nvidia.*error\|nvidia.*fail\|RmInit" | tail -10' ``
>
`` GPU 0: NVIDIA RTX PRO 6000 Blackwell Server Edition (UUID: GPU-6793b112-91ac-b02e-b2b2-a7e4143a878b) GPU 1: NVIDIA RTX PRO 6000 Blackwell Server Edition (UUID: GPU-61d1c918-bc0c-a793-a982-2b6d1948a84c) GPU 2: NVIDIA RTX PRO 6000 Blackwell Server Edition (UUID: GPU-fec85cd4-623c-a819-959c-67ee2334d12a) GPU 3: NVIDIA RTX PRO 6000 Blackwell Server Edition (UUID: GPU-72259f97-1754-979d-f6d0-00e3f851d595) GPU 4: NVIDIA RTX PRO 6000 Blackwell Server Edition (UUID: GPU-550d8313-624e-6697-6da4-f7fe22cbe... ``
On the surface, this is a straightforward confirmation: the GPUs are working. But the path to this moment, the reasoning behind the diagnostic commands chosen, and the assumptions embedded in the response all tell a deeper story.
The Road to This Moment
To understand why this message was written, we must trace the events that led to it. The session had been focused on deploying the Kimi-K2.5 INT4 model with SGLang, culminating in a hardened production setup with systemd service and hierarchical KV cache. Then the user pivoted to a tangent experiment: passing all 8 NVIDIA RTX PRO 6000 Blackwell GPUs from the Proxmox host's LXC container to a VM ([msg 5752]).
The assistant investigated the Proxmox host (10.1.2.6) and discovered that the GPU passthrough infrastructure was already well-established. VM 131 (ml-pipelines) was configured with all 8 GPUs via the pro6000 PCI mapping, and the GPUs were already bound to the vfio-pci driver on the host ([msg 5758]). However, inside the VM, nvidia-smi returned "No devices were found" ([msg 5762]).
The root cause was a classic driver mismatch: the VM had the proprietary NVIDIA kernel module (nvidia-dkms-590) installed, but Blackwell GPUs (SM120 architecture) require the open kernel module (nvidia-dkms-590-open). The proprietary driver's RmInitAdapter call was failing ([msg 5764]). The assistant diagnosed this, installed the correct package, and rebooted the VM (<msg id=5768-5769>). After the VM came back up, all 8 GPUs were visible ([msg 5771]).
Then the user reported: "Had to reboot host, gpus not visible again" ([msg 5773]). This is where our subject message begins.
Why This Message Was Written: The Reasoning and Motivation
The user's report of "gpus not visible again" after a host reboot could have meant several things. It could have been a transient issue where the VM hadn't finished booting. It could have been a Proxmox-level problem where the PCI passthrough mapping failed after reboot. It could have been that the open kernel module fix in the VM was lost. Or it could have been a simple miscommunication — the user checked too early, or checked from the wrong context.
The assistant's response reveals a deliberate two-layer diagnostic strategy. First, check the host side: is VM 131 running, and are the GPUs properly bound to vfio-pci? The answer was yes on both counts — "Host looks fine — VM 131 is running, GPUs are on vfio-pci." This immediately ruled out Proxmox-level passthrough failures. If the GPUs had reverted to the nvidia driver on the host, or if the VM had failed to start, the problem would be at the hypervisor level.
Second, check inside the VM: are the GPUs visible to the NVIDIA driver stack? This required three distinct diagnostic commands, each targeting a different layer of the GPU software stack. The assistant did not simply run nvidia-smi and call it done — it constructed a multi-layered probe that would surface errors at multiple levels simultaneously.## The Anatomy of a Multi-Layered Diagnostic
The three commands in the assistant's SSH probe are worth examining individually, as each reveals a specific assumption about where failures might occur.
Command 1: nvidia-smi -L — This is the standard entry point for GPU visibility. The -L flag lists all GPUs with their UUIDs, which is more concise than the full nvidia-smi output. If this command succeeded, it would confirm that the NVIDIA userspace driver stack (the libnvidia-ml library and the kernel module) can enumerate and communicate with all GPUs. The output shows five GPUs (the truncation at "GPU 4" is from the output being cut, but the full result would show all 8).
Command 2: lspci | grep -i nvidia | wc -l — This is a lower-level check that operates entirely outside the NVIDIA driver stack. It queries the PCI subsystem directly via lspci. Even if the NVIDIA driver were completely broken or unloaded, this command would still show the GPUs as PCI devices. Its purpose is to confirm that the PCIe passthrough itself is working — that the VM's virtual PCI bus actually has the GPU devices visible. A count of 8 would confirm all GPUs are present at the hardware level.
Command 3: sudo dmesg | grep -i "nvrm\|nvidia.*error\|nvidia.*fail\|RmInit" — This is the forensic diagnostic. The dmesg kernel log buffer contains the NVIDIA kernel module's initialization messages. The specific patterns searched for are telling: nvrm is the NVIDIA Resource Manager, the core of the open kernel module; RmInit is the initialization function that had failed previously ([msg 5764]). By explicitly searching for error and failure patterns, the assistant is checking whether the open kernel module initialized cleanly this time. The absence of such error messages (the output shows only GPU UUIDs, not error lines) confirms a clean boot.
Together, these three commands form a diagnostic stack: PCI visibility → driver enumeration → kernel initialization. If any layer had failed, the commands would have pinpointed where.
Assumptions Embedded in the Response
The assistant's response makes several assumptions, most of which are justified by the preceding conversation context.
First, the assistant assumes that the host reboot did not change the VM configuration or the PCI mapping. This is a reasonable assumption because Proxmox stores VM configurations persistently in /etc/pve/qemu-server/. A host reboot should restore the same state. The assistant verified this by checking that VM 131 was running and GPUs were on vfio-pci before probing inside the VM.
Second, the assistant assumes that the open kernel module installation survived the VM's own reboot (which happened before the host reboot). This was confirmed by the fact that the VM booted and nvidia-smi had worked after the initial DKMS installation. The open kernel module is a DKMS package, meaning it rebuilds the kernel module on kernel updates, but a simple reboot should not undo the installation.
Third, the assistant assumes that the user's report of "gpus not visible again" was likely a timing issue or a miscommunication rather than a genuine regression. This is a pragmatic assumption: the most likely explanation for "not visible" after a host reboot is that the user checked before the VM had fully booted and initialized the NVIDIA driver. The assistant does not challenge the user's report but instead proceeds to verify with evidence.
Mistakes and Incorrect Assumptions
One subtle assumption that could be questioned is whether the assistant's host-side check was sufficient. The assistant checked that VM 131 was running and that GPUs were on vfio-pci, but it did not check whether the VM had actually completed its boot process. A VM can show as "running" in Proxmox while still in the early stages of BIOS/UEFI initialization, before the guest OS has loaded the NVIDIA driver. The assistant's probe inside the VM effectively covers this gap, but the initial "Host looks fine" assertion was made before the VM-side check completed.
Another potential blind spot: the assistant did not verify that the nvidia-dkms-590-open package was still installed inside the VM. If the VM had been rolled back to a snapshot or if some update process had reverted the package, the proprietary driver could have been reinstalled. The successful nvidia-smi output implicitly confirms this was not the case, but the assistant did not explicitly check.
Input Knowledge Required
To fully understand this message, one needs knowledge of several domains:
- GPU virtualization with Proxmox: Understanding that PCI passthrough uses
vfio-pcion the host and that the guest VM sees the GPUs as native PCI devices. Thehostpcimapping in the VM configuration ties PCI device IDs on the host to virtual PCI slots in the guest. - NVIDIA driver architecture: The distinction between the proprietary kernel module (
nvidia.ko) and the open kernel module (nvidia-open.ko), and the fact that Blackwell (SM120) GPUs require the open variant. TheRmInitAdaptererror from the earlier failure is a key diagnostic signal. - DKMS (Dynamic Kernel Module Support): Understanding that
nvidia-dkms-590-openbuilds the kernel module against the currently running kernel, and that a reboot is needed to load the newly built module. - Linux kernel diagnostics: Knowing that
dmesgcontains driver initialization messages and thatlspci -kshows which kernel driver is bound to a device. - The conversation's history: The entire chain from the initial GPU passthrough setup, the failed
nvidia-smi, the diagnosis of the proprietary vs. open module mismatch, the DKMS installation, and the VM reboot. Without this context, the message appears to be a simple verification; with it, it's the culmination of a multi-step troubleshooting process.
Output Knowledge Created
This message creates several pieces of knowledge:
- Confirmation of passthrough persistence: The GPUs survived a host reboot and are fully functional in the VM. This validates the Proxmox PCI passthrough configuration and the open kernel module fix.
- A reusable diagnostic pattern: The three-command probe (
nvidia-smi -L+lspcicount +dmesgerror grep) is a template for diagnosing GPU passthrough issues in virtualized environments. Future troubleshooting can reuse this exact sequence. - Evidence for the open kernel module requirement: The successful output after the host reboot provides strong evidence that the open kernel module is the correct and stable solution for Blackwell GPUs in VMs. This is a non-trivial finding — many GPU virtualization guides recommend the proprietary driver, but Blackwell hardware breaks that assumption.
- Operational confidence: The user now knows that the VM-based GPU setup is stable across host reboots, which is essential for any production use case. The assistant's calm, methodical verification builds trust in the configuration.## The Thinking Process Visible in the Response The assistant's reasoning is visible in the structure of its response. It begins with a host-level assessment ("Host looks fine") before moving to the guest. This ordering is deliberate: if the host side were broken, there would be no point probing the guest. The assistant is implicitly communicating its diagnostic flow to the user. The choice of three parallel commands (separated by
echo "---"for readability) reveals a systematic mind. Rather than running one command, interpreting its output, and then deciding what to run next — which would require multiple SSH round-trips — the assistant bundles all three probes into a single SSH call. This is efficient but also comprehensive: the three commands cover the hardware layer, the driver layer, and the kernel initialization layer in one shot. The specific error patterns in thedmesggrep are particularly telling. The assistant remembered the exact error message from the previous failure (RmInitAdapter failed! 0x22:0x56:1001) and constructed a grep pattern that would catch it if it recurred. This is not generic troubleshooting — it is targeted, context-aware diagnosis that leverages the conversation's history. The output truncation at "GPU 4" is also worth noting. The assistant did not re-run the command to get the full output of all 8 GPUs. This suggests a pragmatic confidence: seeing 5 GPUs (0-4) in the truncated output, combined with thelspcicount confirming 8 devices, was sufficient evidence that all GPUs were working. The UUIDs for GPUs 5-7 were simply cut off by the terminal or the output capture, but the pattern was clear.
Broader Implications
This message, while brief, sits at an interesting intersection of several themes that run throughout the opencode session. The session began with environment setup, moved through model deployment, and then pivoted to speculative decoding optimization. The GPU passthrough tangent might seem like a detour, but it is actually a critical operational capability: being able to switch GPUs between containers and VMs without reconfiguration enables flexible experimentation.
The assistant's approach here — methodical, layered diagnosis with clear communication — is consistent with its behavior throughout the session. When flash-attn failed to build, it adjusted MAX_JOBS and CUDA versions. When EAGLE-3 speculation performed worse than baseline, it analyzed the break-even math and tested alternatives. When the Blackwell GPUs required the open kernel module, it diagnosed the specific error and applied the targeted fix. The pattern is always the same: observe the symptom, isolate the layer where the failure occurs, apply the minimal correction, and verify.
Conclusion
Message [msg 5775] appears, at first glance, to be a routine confirmation that GPUs are working after a host reboot. But examined in context, it is the payoff of a careful troubleshooting chain that involved diagnosing a driver mismatch, installing the correct kernel module, rebooting the VM, and then verifying persistence across a host reboot. The assistant's three-command diagnostic probe — nvidia-smi -L, lspci count, and dmesg error grep — is a model of layered verification, checking the hardware, driver, and kernel layers in a single efficient SSH call.
The message also demonstrates several important principles for infrastructure troubleshooting: verify the host before the guest, bundle multiple diagnostic commands to reduce round-trips, target error patterns based on previous failures, and communicate the diagnostic flow so the user understands what is being checked and why. These principles, applied consistently throughout the opencode session, are what transform a potentially frustrating debugging session into a smooth, methodical process of elimination.