Proxmox VE / Ubuntu 24.04 / NVIDIA CUDA
在 Proxmox VE 上的 Ubuntu 24.04 虚拟机中为 Tesla V100 安装 NVIDIA 驱动和 CUDA 12.9 #
本文介绍如何将 Tesla V100 通过 PCIe 直通到 Proxmox VE 上的 OVMF 虚拟机,并在
Ubuntu 24.04 一侧安装 NVIDIA 驱动和 CUDA Toolkit 12.9。
同时也包含针对 OVMF 环境中常见的 BAR0 is 0M @ 0x0 /This PCI I/O region assigned to your NVIDIA device is invalid
问题的解决方法。
客户机操作系统:Ubuntu 24.04 LTS
虚拟化方式:Proxmox VE / KVM
启动方式:OVMF(UEFI)
本文前提条件 #
- Proxmox 宿主机侧的 IOMMU / VFIO 设置已完成
- GPU 直通到客户机已可正常工作
- 客户机操作系统为 Ubuntu 24.04 LTS
- 本文假定用于计算用途的虚拟机
验证环境配置 #
Proxmox VE / KVM
OVMF(UEFI)
q35
Tesla V100 PCIe 32GB
Ubuntu 24.04 LTS
12.9
为何使用 CUDA 12.9 #
Tesla V100 是 Volta 架构的 GPU。从 CUDA 13 及更高版本开始,官方已经取消了对 Volta 架构
离线编译和库的支持,因此将 V100 的开发环境固定在 CUDA 12.x 系列会更安全。本文使用
CUDA Toolkit 12.9。
步骤 1
在 Proxmox 侧配置虚拟机以实现 GPU 直通 #
首先,配置虚拟机以实现 GPU 直通。
如果 OVMF / q35 / 主机 PCI 设置已经完成,请直接进入下一步。
qm stop 101
qm set 101 --bios ovmf
qm set 101 --machine q35
qm set 101 --hostpci0 65:00,pcie=1
qm start 101注意:101 是虚拟机 ID 的示例,65:00 是 GPU PCI 地址的示例。
请根据实际环境的值进行替换。
步骤 2
在 OVMF 环境中扩大 MMIO 地址空间 #
这是最大的坑点。在 OVMF UEFI 虚拟机中,GPU 的 BAR 资源往往不能被充分映射,
从而导致出现 BAR0 is 0M @ 0x0 或This PCI I/O region assigned to your NVIDIA device is invalid。
这种情况下,可以添加 X-PciMmio64Mb 参数来
扩大 MMIO 地址空间。
添加此设置实际上解决了在 Proxmox 的
OVMF 虚拟机上 nvidia-smi 无法正常工作的问题。
qm stop 101
qm set 101 --args '-fw_cfg name=opt/ovmf/X-PciMmio64Mb,string=262144'
qm start 101要点:更改后请
完全关闭虚拟机后再重新启动,而不是仅仅重启客户机操作系统。
步骤 3
在 Ubuntu 24.04 上安装所需软件包 #
在安装 NVIDIA 驱动和 CUDA Toolkit 之前,请先安装内核头文件和构建相关工具。
sudo apt update
sudo apt install -y linux-headers-$(uname -r) gcc g++ make wget pciutils步骤 4
添加 NVIDIA 官方仓库 #
为 Ubuntu 24.04 添加 NVIDIA 官方 APT 仓库。
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt update步骤 5
安装 NVIDIA 驱动 #
安装前请将驱动固定为 580 系列。V100 目前仍受 580 系列支持。
sudo apt install -y nvidia-driver-pinning-580
sudo apt install -y cuda-drivers如果希望采用不含 GUI 的纯计算配置,也可以根据需要
切换为基于精简版 libnvidia-compute 和 nvidia-dkms 的方案,
但建议先用 cuda-drivers 确认可以正常工作,思路会更清晰。
步骤 6
固定版本并安装 CUDA Toolkit 12.9 #
为了避免自动追踪最新的 CUDA 版本,请使用元软件包 cuda-toolkit-12-9 来
锁定在 12.9 系列。
sudo apt install -y cuda-toolkit-12-9如果磁盘空间紧张:完整的 Toolkit 体积相当大,因此可以先
仅安装运行时和编译器。
sudo apt install -y cuda-runtime-12-9 cuda-compiler-12-9
# Add development libraries later if needed
sudo apt install -y cuda-libraries-dev-12-9步骤 7
设置 PATH 并重启 #
为了让 nvcc 更易于使用,请设置 PATH 和库路径,然后重启。
echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
sudo reboot步骤 8
验证运行情况 #
重启后,请验证 GPU 是否可见、驱动是否正常加载,
以及 CUDA 编译器是否可用。
source ~/.bashrc
uname -r
lspci | grep -i nvidia
nvidia-smi
nvidia-smi -L
nvcc --version
dmesg -T | grep -E 'NVRM|BAR0|nvidia'如果安装正确,nvidia-smi 将会显示 Tesla V100,
而 nvcc --version 将会显示 CUDA 12.9。
故障排查 #
出现 BAR0 is 0M @ 0x0 #
这几乎可以肯定是 OVMF 的 MMIO 地址空间不足所致。请先应用qm set 101 --args '-fw_cfg name=opt/ovmf/X-PciMmio64Mb,string=262144',
完全关闭虚拟机后再重新启动。
nvidia-smi 无法与驱动通信 #
驱动内核模块可能未被加载。请先检查 OVMF 的 MMIO
设置,然后再检查模块状态。
lsmod | grep -E 'nvidia|nouveau'
sudo journalctl -k -b | grep -Ei 'nvidia|nouveau|secure|module verification'安装 Toolkit 过程中磁盘空间耗尽 #
完整的 Toolkit 体积较大,因此在可用空间有限的虚拟机上安装可能会中途失败。
此时请清理缓存,并切换为精简的软件包配置以确保安全。
df -h /
sudo apt clean
sudo apt autoremove -y
sudo apt --fix-broken install总结 #
在 Proxmox VE 上的 Ubuntu 24.04 虚拟机中,为 Tesla V100 安装 NVIDIA 驱动和
CUDA Toolkit 本身并不困难。但是在 OVMF 虚拟机上,MMIO 地址空间不足
可能导致 NVIDIA 驱动无法启动,因此配置X-PciMmio64Mb 成为一个实用的关键点。
今后在搭建相同配置时,建议从一开始就同时配置好
OVMF / q35 / PCIe 以及
MMIO 地址空间扩展。
参考信息 #
免责声明 #
本文是基于撰写时的验证环境编写的。我们不对文中所述内容的
准确性、完整性、实用性,或在特定环境下的运行情况做任何保证。
文中所述的步骤和行为,可能会因操作系统、内核、GPU、固件、BIOS/UEFI、Proxmox VE、
NVIDIA 驱动、CUDA Toolkit 等的版本差异或更新状态而有所不同。
- 本文中的步骤包括 GPU 直通、内核模块安装以及启动配置的变更。
- 实施前请准备好备份、快照及维护计划,并在测试环境中充分验证。
- 因使用本文内容而导致的任何缺陷、宕机、故障、数据丢失或其他损失,我们概不负责。
- 在生产环境中的实施,由用户自行判断并承担相应责任。
- 文中提及的产品名称、服务名称及公司名称,均为其各自公司的商标或注册商标。