Skip to main content

VMWare - Redhat 9 Install NVidia Pass through and Container Setup

Installing an NVIDIA driver in a Red Hat 9 virtual machine (VM) with GPU passthrough involves several steps, including configuring both the VMware ESXi host and the RHEL guest OS. GPU passthrough dedicates the entire physical GPU to a single VM, bypassing the hypervisor. 

Reviewed 7 Oct 2026. Current releases: RHEL 9.8 (May 2026) and NVIDIA data center driver branch 615. This VM's GPU is a Tesla M10 (Maxwell). NVIDIA driver branch R580 is the last branch that supports Maxwell, Pascal and Volta. It is a Long Term Support Branch with end of life in June 2028, so this VM must stay on the 580 proprietary DKMS stream. Newer branches drop Maxwell, and from branch 615 NVIDIA ships only the open kernel modules, which need Turing or newer.

Step 1: Enable GPU passthrough on the ESXi host

  1. In the host BIOS/UEFI, make sure Intel VT-d (AMD: IOMMU) is enabled and PCI mapping above 4 GB is allowed.
  2. In the vSphere Client select the host, then Configure > Hardware > PCI Devices and open All PCI Devices. (ESXi Host Client: Manage > Hardware > PCI Devices.)
  3. Find your NVIDIA GPU device in the list and click Toggle Passthrough.
  4. If the device shows an orange icon, the host must be rebooted (maintenance mode first) before the device can be used. The passthrough status should then show as Enabled/Active.

Step 2: Configure the RHEL 9 virtual machine

  1. Power off the virtual machine. This is critical before assigning PCI devices.
  2. Edit the settings of your RHEL 9 VM in the vSphere Client.
  3. Under VM Options > Boot Options set Firmware to EFI. GPU passthrough VMs will not boot correctly on legacy BIOS. Make sure Secure Boot is disabled; see Step 4 for the reason.
  4. Under Virtual Hardware
    1. Click Add New Device and choose PCI Device.
    2. From the dropdown menu, select the NVIDIA GPU you just configured for passthrough.
  5. Under Memory reserve all guest memory (All locked). A passthrough device needs the full memory reservation.
  6. Navigate to VM Options > Advanced and click Edit Configuration.
  7. Add or modify the following key-value pairs:
    1. pciPassthru.use64bitMMIO = TRUE
    2. pciPassthru.64bitMMIOSizeGB = 64: the value depends on your card's memory. Broadcom's rule is to add up the framebuffer memory of every GPU in the VM. If the total is a power of 2, use the next power of 2. If it falls between two powers of 2, round up twice. One Tesla M10 GPU (8 GB) needs at least 16; 64 also works.
    3. hypervisor.cpuid.v0 = FALSE: kept from the original working build. It is not part of Broadcom's GPU passthrough KBs.
  8. Save the VM settings and power on the VM.

Step 3: Prepare the OS

VMware tools: Broadcom recommends the open-vm-tools package shipped by Red Hat.

sudo dnf install -y open-vm-tools

Enable CodeReady Builder and EPEL: the NVIDIA driver RPMs depend on packages that only exist in EPEL (for example DKMS).

sudo subscription-manager repos --enable=codeready-builder-for-rhel-9-x86_64-rpms
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm

Install dependencies: you need kernel headers and development packages for the DKMS build. On RHEL 9 NVIDIA uses kernel-devel-matched, which also pulls the matching devel package for future kernel updates so DKMS can rebuild the module.

sudo dnf groupinstall "Development Tools"
sudo dnf install kernel-devel-matched kernel-headers

Disabling the Nouveau driver: the open-source Nouveau driver can conflict with the NVIDIA driver. The NVIDIA RPMs now disable nouveau automatically during install (nvidia-boot-update), so this step is optional. If you do it by hand, note the option is modeset (the old page had a typo, modset).

sudo bash -c "echo blacklist nouveau > /etc/modprobe.d/blacklist-nvidia-nouveau.conf"
sudo bash -c "echo options nouveau modeset=0 >> /etc/modprobe.d/blacklist-nvidia-nouveau.conf"

Regenerate the initial RAM disk image and reboot

sudo dracut --force
sudo reboot

Step 4: Install the NVIDIA driver (Tesla M10 = 580 branch, proprietary DKMS)

Do not use nvidia-driver:latest-dkms, nvidia-driver:open-dkms or nvidia-open on this VM. In NVIDIA's RHEL 9 repo latest-dkms now resolves to the 610 branch, which no longer supports Maxwell. The open kernel modules only support Turing and newer GPUs.

Add the repository: NVIDIA's network repository for RHEL 9

sudo dnf config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel9/x86_64/cuda-rhel9.repo
sudo dnf clean expire-cache

Install the driver: use the dnf module stream locked to the 580 branch with proprietary DKMS modules. Its default profile installs the full driver plus kmod-nvidia-latest-dkms.

sudo dnf module install nvidia-driver:580-dkms

Later updates stay on the 580 branch with a normal sudo dnf update.

Secure Boot: the DKMS-built proprietary modules are not signed by Red Hat. Red Hat-signed precompiled NVIDIA modules exist only for the open kernel modules (RHEL 10), which the M10 cannot use. Keep Secure Boot off for this VM.

See Nvidia for more references here (background on module streams: NVIDIA blog)

Reboot the VM

sudo reboot

Step 5: Verify the installation

After the VM reboots, open a terminal and run the nvidia-smi command.

nvidia-smi

If the installation was successful, this command will display information about your NVIDIA GPU, confirming that it is being used by the RHEL guest and that passthrough is working correctly. You should see something like this:

[~]# nvidia-smi

Wed Oct 15 20:13:14 2025       
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 580.95.05              Driver Version: 580.95.05      CUDA Version: 13.0     |
+-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  Tesla M10                      Off |   00000000:03:00.0 Off |                  N/A |
| N/A   36C    P8              8W /   53W |       3MiB /   8192MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|  No running processes found                                                             |
+-----------------------------------------------------------------------------------------+

Step 6: Setup for Container

Add NVIDIA's container toolkit repository (NVIDIA's documented repo; the CUDA repo above also carries the same packages):

curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | \
  sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo

Install the NVidia container toolkit packages:

sudo dnf install -y nvidia-container-toolkit

Use only this repo. The old nvidia-docker2 / nvidia-docker and nvidia-container-runtime repos and packages are not part of NVIDIA's current install guide.

Docker

Once the NVidia container toolkit is installed, configure Docker to use it:

sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

Ensure that everything is setup correctly for the docker system:

sudo docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi

You should see something like this

[~]# docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi
Thu Oct 16 00:13:20 2025       
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 580.95.05              Driver Version: 580.95.05      CUDA Version: 13.0     |
+-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  Tesla M10                      Off |   00000000:03:00.0 Off |                  N/A |
| N/A   36C    P8              8W /   53W |       3MiB /   8192MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|  No running processes found                                                             |
+-----------------------------------------------------------------------------------------+

Podman (RHEL's built-in engine): use CDI

For Podman NVIDIA recommends CDI instead of nvidia-ctk runtime configure. Since toolkit v1.18 the CDI spec is generated automatically at /var/run/cdi/nvidia.yaml by the nvidia-cdi-refresh service. It runs when the toolkit or driver is installed or upgraded and at boot. List the devices:

nvidia-ctk cdi list

Regenerate the spec if needed (for example after removing a driver):

sudo systemctl restart nvidia-cdi-refresh.service
# or manually
sudo nvidia-ctk cdi generate --output=/var/run/cdi/nvidia.yaml

Test:

podman run --rm --security-opt=label=disable --device=nvidia.com/gpu=all ubuntu nvidia-smi

Note Worthy:

With kernel-devel-matched installed, DKMS rebuilds the module automatically after kernel updates. If nvidia-smi stops working after a kernel update, check:

dkms status

This shows which kernels the module is built for. Example from this VM (built only for an older el9_4 kernel):

nvidia/580.95.05, 5.14.0-427.42.1.el9_4.x86_64, x86_64: installed

Make sure kernel-devel for the running kernel is installed, then build it for the current kernel (use the version shown by dkms status):

sudo dkms install nvidia/580.95.05

Container Configurations NVidia Docs: NVIDIA Container Toolkit install guide, CDI support

Ollama Configuration

Sources (checked 7 Oct 2026)

Older instructions (before Oct 2026) - do not use on the M10 VM

Kept for reference only. latest-dkms now installs a driver branch that does not support the Tesla M10.

sudo dnf install kernel-devel-$(uname -r) kernel-headers-$(uname -r)
sudo dnf module install nvidia-driver:latest-dkms