The Critical Glimpse: Reading Proxmox PCI Mappings in a GPU Passthrough Investigation

In the middle of a highly technical optimization session focused on deploying massive language models across 8 NVIDIA RTX PRO 6000 Blackwell GPUs, a seemingly mundane command appears. Message [msg 5757] in this opencode conversation is a single bash invocation:

ssh root@10.1.2.6 'cat /etc/pve/mapping/pci.cfg 2>/dev/null'

The output reveals the contents of a Proxmox VE PCI device mapping configuration file, showing entries for several GPU models: nv3080, nv3090, nv3090-2, nv3090-3, nva6000, nva6000-2, and a truncated entry for what appears to be another mapping. On its surface, this is a trivial operation — a remote file read. But within the arc of the conversation, this message represents a pivotal moment of discovery, a hinge point where the assistant transitions from pure reconnaissance to actionable understanding of the host's GPU virtualization infrastructure.

The Context: A Tangent Experiment Demanding Infrastructure Insight

To understand why this message matters, we must trace the events that led to it. The session had been consumed with an intense, multi-hour effort to deploy and optimize the Kimi-K2.5 INT4 model using SGLang with EAGLE-3 speculative decoding ([msg 5736] through [msg 5751]). The team had just successfully hardened the production deployment with a systemd service, enabled hierarchical KV cache with a 4.0 ratio consuming 358 GB of pinned host memory, and verified that the model was generating correct outputs with tool calls and reasoning content properly parsed.

Then the user pivoted abruptly in [msg 5752]:

"Doing a tangent experiment on the proxmox node - 10.1.2.6, 10.1.16.221 guest vm; Because it's now a VM and not a container do we need to unload nvidia driver on host? Blacklist and reboot? How can we make this sort of switch reasonably painless?"

This question reveals the user's core concern: they want to pass all 8 Blackwell GPUs from the Proxmox host to a virtual machine, but they're uncertain about the mechanics. The LXC container (CT 129, named "llm-two") had been the primary consumer of these GPUs throughout the session. Now the user wants to experiment with a VM instead, and they instinctively know this requires changes to how the host's NVIDIA driver interacts with the GPUs.

The assistant responded in [msg 5753] by asking clarifying questions — specifically whether all 8 GPUs should go to the VM or if they should be split. The user confirmed "All 8 GPUs to VM," meaning the LXC container would stop and the VM would get exclusive access. This set the stage for a full infrastructure investigation.

The Investigation Unfolds

The assistant's reconnaissance in [msg 5754] revealed the current state: the NVIDIA driver stack was fully loaded on the host (nvidia, nvidia_uvm, nvidia_modeset, nvidia_drm), and all 8 GPUs were visible as PCI devices. In [msg 5755], the assistant checked the kernel command line and found that IOMMU was already enabled (iommu=pt), and VFIO had been used previously — promising signs that GPU passthrough infrastructure was already in place.

Then came the critical discovery in [msg 5756]. The assistant examined the Proxmox VM configuration files and found that VM 131 ("ml-pipelines") already had all 8 GPUs mapped via hostpci0 through hostpci7, each referencing mapping=pro6000. This was a bombshell: someone had already configured GPU passthrough for these Blackwell GPUs, using a named mapping called "pro6000." But where was this mapping defined?

Message 5757: The Defining Read

This brings us to the subject message. The assistant issues a command to read /etc/pve/mapping/pci.cfg on the Proxmox host. This file is the central registry for PCI device mappings in Proxmox VE — it defines symbolic names that map to physical PCI device IDs, IOMMU groups, and host nodes. When a VM configuration references mapping=pro6000, the hypervisor looks up this file to find which physical GPU to assign.

The output reveals a history of GPU mappings on this host:

nv3080
    map id=10de:2204,iommugroup=72,node=kpro4,path=0000:43:00,subsystem-id=1043:87d5

nv3090
    map id=10de:2204,iommugroup=20,node=kpro5,path=0000:53:00,subsystem-id=1043:87d5

nv3090-2
    map id=10de:2204,iommugroup=24,node=kpro5,path=0000:57:00,subsystem-id=1043:87d5

nv3090-3
    map id=10de:2204,iommugroup=50,node=kpro5,path=0000:d6:00,subsystem-id=1043:87d5

nva6000
    map id=10de:2230,iommugroup=16,node=kpro5,path=0000:4f:00,subsystem-id=10de:1459

nva6000-2
    map id=10de:2230,iommugroup=43,nod...

The output is truncated — it cuts off mid-entry on nva6000-2. Critically, the pro6000 mapping that VM 131 references is not visible in the shown output. This could mean several things: the pro6000 mapping appears later in the file (after the truncation point), or it was defined in a separate configuration file, or the mapping was created through a different mechanism.

The Reasoning Behind the Command

The assistant's thinking process here is methodical and detective-like. Having discovered that VM 131 references a pro6000 mapping, the natural next question is: what physical devices does this mapping correspond to? The PCI mapping file is the canonical source of truth for this information in Proxmox. Reading it serves multiple purposes:

  1. Validating existing configuration: If the pro6000 mapping exists and correctly points to the 8 Blackwell GPUs (device ID 10de:2bb5 based on earlier lspci output), then the passthrough infrastructure is already in place and the user's experiment may only require stopping the LXC container and starting the VM.
  2. Understanding the mapping scheme: The existing entries reveal a naming convention — nv3080, nv3090, nva6000 — suggesting these are shorthand for GPU models. The pro6000 name likely follows the same pattern, referring to the RTX PRO 6000 Blackwell GPUs.
  3. Identifying gaps: If the pro6000 mapping doesn't exist or points to wrong devices, the assistant would need to create or fix it.
  4. Learning from history: The presence of mappings for older GPU generations (RTX 3080, RTX 3090, RTX A6000) tells the assistant that this host has been through multiple GPU generations and has a well-maintained passthrough setup.

Assumptions and Their Implications

The assistant makes several assumptions in issuing this command. First, it assumes that the PCI mapping configuration is stored in the standard Proxmox location (/etc/pve/mapping/pci.cfg). This is a safe assumption — Proxmox VE uses a clustered filesystem (pmxcfs) that stores configuration files under /etc/pve/, and PCI mappings are a documented feature.

Second, the assistant assumes that the pro6000 mapping referenced in VM 131's configuration is defined in this file. This assumption is partially validated — the file clearly contains GPU mappings — but the truncation of the output leaves ambiguity. The mapping might exist later in the file, or it might have been configured through a different mechanism (e.g., directly specifying PCI IDs in the VM config without a named mapping, though the VM config clearly uses mapping=pro6000).

Third, the assistant assumes that reading this file will provide actionable information for the next steps. This is correct — even with truncated output, the assistant now knows the format of the mapping entries, the naming conventions used, and the fact that the host has a history of GPU passthrough. This knowledge informs the next steps: either finding the full mapping definition, or creating a new one if needed.

Input Knowledge Required

To fully understand this message, one needs several layers of context:

Output Knowledge Created

This message produces several valuable pieces of knowledge:

  1. The host has a mature GPU passthrough setup: The presence of mappings for multiple GPU generations (3080, 3090, A6000) across different host nodes (kpro4, kpro5) indicates that this infrastructure has been used extensively.
  2. The mapping naming convention: Mappings follow a pattern of nv{model} or nva{model} — shorthand for NVIDIA GPU model names. The pro6000 mapping likely follows this convention.
  3. The format is standard Proxmox: Each mapping entry contains a device ID (id=), IOMMU group, host node, PCI path, and subsystem ID — all standard fields for Proxmox PCI mappings.
  4. The mapping file may be incomplete or truncated: The output cuts off, meaning the full picture is not yet visible. The assistant would need to either read the full file or use a different approach (e.g., grep pro6000) to find the specific mapping.
  5. The host supports multiple GPU generations: The same host (kpro5) has hosted RTX 3090s and RTX A6000s, suggesting the PCIe slots and IOMMU groups are compatible across generations.

The Broader Significance

This message, while technically trivial, represents a critical moment in the conversation's infrastructure investigation. It's the point where the assistant moves from asking "what's the current state?" to "what's been configured that we can leverage?" The discovery that GPU passthrough mappings already exist — potentially including the pro6000 mapping for the Blackwell GPUs — transforms the problem from "how do we set up passthrough from scratch?" to "how do we activate and use the existing passthrough configuration?"

The truncated output is itself significant. It creates a knowledge gap that the assistant must address in subsequent messages. The pro6000 mapping might be defined in the unseen portion of the file, or it might not exist at all. Either way, the assistant now has a clear next step: find the full definition of the pro6000 mapping.

In the broader narrative of the session, this message is part of a larger pattern: the assistant methodically probes the system's configuration, building a mental model of the infrastructure before making changes. Earlier in the session, we saw similar patterns when investigating CUDA versions, NCCL tuning parameters, and flash-attn build configurations. This systematic reconnaissance is a hallmark of the assistant's approach — gather data, build understanding, then act with precision.

Conclusion

Message [msg 5757] is a study in how even the simplest commands can carry enormous weight in a complex technical conversation. A single cat command over SSH, reading a configuration file, reveals the accumulated history of GPU passthrough on a Proxmox host. It transforms the user's question from "how do we set this up?" to "how do we use what's already here?" The truncated output creates a mystery — where is the pro6000 mapping? — that drives the investigation forward. In the hands of a skilled technical operator, even reading a file becomes a strategic act of discovery.