一、 环境与策略

  • 硬件:Intel i9-9900K (UHD 630) + NVIDIA RTX 3090 (GA102)。
  • 策略分阶段实施。先不挂卡安装 Ubuntu2204,执行 upgrade 升级内核,配置好 SSH 后,再进行直通。

二、 物理机 BIOS 设置

  1. VT-d / VT-x: Enabled
  2. Above 4G Decoding: Enabled (必开,否则 3090 无法在地址空间映射)。
  3. Primary Display: 建议设为 IGFX (核显)。
  • 目的:让 PVE 宿主机使用核显,将 3090 完全释放给虚拟机。
  1. CSM Support: Disabled

三、 PVE 宿主机底层配置

1. 修改 GRUB 引导

编辑:nano /etc/default/grub
修改行:

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pcie_acs_override=downstream,multifunction initcall_blacklist=sysfb_init video=efifb:off,vesafb:off"

保存后执行:update-grub

2. 加载 VFIO 内核模块

编辑:nano /etc/modules
添加:

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

3. 配置驱动黑名单 (核心步骤)

创建并编辑文件:nano /etc/modprobe.d/pve-blacklist.conf
请务必填入以下内容(包含你提供的完整屏蔽逻辑):

# NVIDIA 显卡屏蔽
blacklist nvidiafb
blacklist nouveau
blacklist nvidia
options nouveau modeset=0

# AMD 核/独显屏蔽
blacklist amdgpu
blacklist radeon

# Intel 核显与音频屏蔽 (确保 9900K 核显不冲突或用于直通)
blacklist snd_hda_codec_hdmi
blacklist snd_hda_intel
blacklist snd_hda_codec
blacklist snd_hda_core

4. 绑定硬件 ID 到 vfio

查找 ID:lspci -nn | grep -i nvidia (得到 10de:220410de:1aef)
创建文件:nano /etc/modprobe.d/vfio.conf
写入:

options vfio-pci ids=10de:2204,10de:1aef disable_vga=1

5. 应用并重启

执行:update-initramfs -u -k all && reboot


四、 宿主机端验证 (决定性步骤)

重启后,必须执行此命令验证:

lspci -vnn -s 01:00.0

检查结果:
必须看到 Kernel driver in use: vfio-pci
如果显示为 nvidianouveau,说明黑名单或 VFIO 绑定失败,此时绝不可开启虚拟机。


五、 虚拟机 (Ubuntu 22.04) 配置流程

阶段 1:纯净安装与系统更新 (不挂载显卡)

  1. 虚拟机创建:BIOS 选 OVMF,Machine 选 q35
  2. Display:先设为 Standard VGA
  3. 安装 Ubuntu:安装完成后,必须执行:
sudo apt update && sudo apt upgrade -y

原理:3090 较新,通过 upgrade 升级内核(Kernel)能提供更好的 PCIe 总线支持和硬件兼容性。

  1. 配置 SSHsudo apt install openssh-server -y
  2. 禁用虚拟机内 Nouveau (推荐)
sudo bash -c "echo 'blacklist nouveau' > /etc/modprobe.d/blacklist-nouveau.conf"
sudo update-initramfs -u
sudo poweroff

阶段 2:挂载显卡与优化参数

  1. 添加 PCI 设备:选择 3090,勾选 All FunctionsROM-BarPCI-Express
  2. CPU 设置:Type 必须选 host
  3. 隐藏虚拟化身份
    在宿主机执行:nano /etc/pve/qemu-server/<VMID>.conf
    在文件顶部(或 cpu: host 之后)添加:
args: -cpu 'host,hv_relaxed,hv_spinlocks=0x1fff,hv_vapic,hv_time,kvm=off'


六、 驱动安装与验证

  1. 启动虚拟机。如果 PVE 网页控制台(NoVNC)因显卡接管而卡住,直接通过 SSH 远程登录
  2. 安装 NVIDIA 驱动:
sudo ubuntu-drivers autoinstall

  1. 验证直通结果
    执行:nvidia-smi

常见问题排查:

  • Xorg blocked 再现:检查 pve-blacklist.conf 是否生效。
  • 无法读到 EDID:这是 3090 的常见问题,通常可以通过在 VM 硬件设置中暂时关闭 Primary GPU,或直接外接物理显示器解决。

Proxmox VE 集群加入失败 FAQ

Q:为什么加入 PVE 集群时报错 can't add existing node 'pve'
A: 这是因为 PVE 集群要求每个节点的主机名(Hostname)必须唯一。如果新节点与集群内已有节点重名(通常默认都叫 pve),系统为了防止配置冲突会中止加入进程。

Q:如何修改新节点主机名以正常加入集群?
A: 请在新节点(待加入的机器)上按顺序执行以下三个步骤:

  1. 修改主机名配置文件:
    执行 nano /etc/hostname,将文件中的 pve 修改为互不重复的新名称(例如:pve-node2)。
  2. 同步修改 Hosts 映射:
    执行 nano /etc/hosts,找到以下两行并将旧名 pve 替换为新名:
  • 127.0.0.1 localhost.localdomain localhost(确保此行后的别名正确)
  • 172.19.30.210 pve-node2.proxmox.com pve-node2(对应你的静态 IP 行)
  1. 重启生效:
    执行 reboot 重启系统。重启后,再次尝试加入集群即可。