Proxmox VE 核显直通到 Rocky Linux 虚拟机完全指南

环境说明

  • 宿主机: Proxmox VE 8.x
  • 虚拟机: Rocky Linux 9.x
  • 硬件: Intel UHD Graphics 630 (Coffee Lake)
  • 应用场景: Docker 容器硬件加速(Emby/Jellyfin/Plex 等)

## 核心问题

在 Proxmox 中创建的 Rocky Linux 虚拟机,即使看到 /dev/dri/card0 设备,也无法使用 Intel Quick Sync 硬件转码。根本原因是:

  1. 虚拟显卡伪装: Proxmox 默认使用 bochs-drm 虚拟显卡
  2. 驱动缺失: Rocky Linux 最小化安装缺少 Intel 媒体驱动固件
  3. 设备节点不完整: 缺少 renderD128 硬件加速接口

Part 1: Proxmox Host 配置 GPU 直通

1.1 验证 IOMMU 状态

# SSH 到 Proxmox Host
dmesg | grep -e DMAR -e IOMMU

预期输出:

DMAR: IOMMU enabled
DMAR-IR: Enabled IRQ remapping in x2apic mode

如果没有输出,需要在 GRUB 中启用:

# 编辑 GRUB 配置
nano /etc/default/grub

# 修改这一行(Intel CPU)
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"

# 更新 GRUB 并重启
update-grub
reboot

1.2 查看 GPU 信息

lspci | grep -i vga

示例输出:

00:02.0 VGA compatible controller: Intel Corporation CoffeeLake-S GT2 [UHD Graphics 630]

记住 PCI 地址 00:02.0 和设备 ID 8086:3e92

1.3 配置 VFIO 驱动

# 1. 添加 VFIO 模块
cat >> /etc/modules << 'EOF'
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
EOF

# 2. 绑定 Intel 核显到 VFIO(替换为你的设备 ID)
echo "options vfio-pci ids=8086:3e92" > /etc/modprobe.d/vfio.conf

# 3. 阻止 Proxmox Host 使用核显
cat >> /etc/modprobe.d/pve-blacklist.conf << 'EOF'
blacklist i915
blacklist snd_hda_intel
EOF

# 4. 更新 initramfs
update-initramfs -u -k all

1.4 修改虚拟机配置

# 停止虚拟机(假设 VM ID 是 100)
qm stop 100

# 删除快照配置(如果有)
qm set 100 --delete parent

# 添加 GPU 直通
qm set 100 --hostpci0 0000:00:02.0,pcie=1,x-vga=1

# 修改机器类型为 Q35(对 GPU 直通更友好)
qm set 100 --machine q35

# 查看配置确认
cat /etc/pve/qemu-server/100.conf

预期配置应包含:

machine: q35
hostpci0: 0000:00:02.0,pcie=1,x-vga=1

1.5 重启 Proxmox Host

reboot

1.6 验证 GPU 已被 VFIO 接管

重启后 SSH 回到 Proxmox:

lspci -nnk -d ::0300

成功的标志:

00:02.0 VGA compatible controller [0300]: Intel Corporation ...
        Kernel driver in use: vfio-pci  ← 关键:必须是 vfio-pci
        Kernel modules: i915

启动虚拟机:

qm start 100

Part 2: Rocky Linux 虚拟机配置

SSH 到 Rocky Linux 虚拟机后执行以下步骤。

2.1 诊断问题:虚拟显卡伪装

# 检查当前设备
ls -la /dev/dri/
lspci | grep -i vga

错误示例(GPU 直通未生效):

# /dev/dri/ 只有 card0,没有 renderD128
crw-rw---- 1 root video 226, 0 Jan 21 21:54 card0

# lspci 显示 bochs 虚拟显卡
00:02.0 VGA compatible controller: Device 1234:1111 (rev 02)

正确示例(GPU 直通成功):

# /dev/dri/ 同时有 card0 和 renderD128
crw-rw---- 1 root video  226,   0 Jan 21 21:54 card0
crw-rw---- 1 root render 226, 128 Jan 21 21:54 renderD128  ← 关键

# lspci 显示真实 Intel GPU
00:02.0 VGA compatible controller: Intel Corporation CoffeeLake-S GT2 [UHD Graphics 630]

2.2 核心解决方案:安装 Intel 驱动固件

# 1. 启用必要的软件仓库
sudo dnf config-manager --set-enabled crb
sudo dnf install -y epel-release

# 2. 添加 RPM Fusion 仓库
sudo dnf install -y --nogpgcheck \
  https://mirrors.rpmfusion.org/free/el/rpmfusion-free-release-$(rpm -E %rhel).noarch.rpm \
  https://mirrors.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-$(rpm -E %rhel).noarch.rpm

# 3. 安装 Intel 媒体驱动和固件(核心步骤)
sudo dnf install -y intel-media-driver linux-firmware

# 4. 重启虚拟机
sudo reboot

2.3 验证驱动加载成功

重启后:

# 1. 检查 i915 驱动是否加载
lsmod | grep i915

预期输出:

i915                 4820992  1
drm_buddy              28672  1 i915
ttm                   126976  1 i915
...
# 2. 检查设备节点(最关键)
ls -la /dev/dri/

必须看到:

crw-rw---- 1 root video  226,   0 card0
crw-rw---- 1 root render 226, 128 renderD128  ← 硬件加速接口
# 3. 检查 PCI 驱动绑定
lspci -k | grep -A 3 VGA

预期输出:

00:02.0 VGA compatible controller: Intel Corporation CoffeeLake-S GT2 [UHD Graphics 630]
        Subsystem: ...
        Kernel driver in use: i915  ← 关键
        Kernel modules: i915
# 4. 检查内核日志
dmesg | grep -i i915 | tail -10

成功标志:

[drm] Initialized i915 1.6.0 for 0000:00:02.0 on minor 0
i915 0000:00:02.0: [drm] fb0: i915drmfb frame buffer device

Part 3: Docker 容器权限配置

Docker 容器需要正确的权限才能访问 /dev/dri 设备。

3.1 查询宿主机权限组 ID

getent group video | cut -d: -f3   # 示例输出:39
getent group render | cut -d: -f3  # 示例输出:105

3.2 Docker Compose 配置示例

version: "3.8"
services:
  emby:
    image: emby/embyserver:latest
    container_name: emby
    devices:
      - /dev/dri:/dev/dri  # 映射显卡设备
    environment:
      - UID=1026
      - GID=100
      - GIDLIST=100,39,105  # 39=video, 105=render(根据实际情况调整)
      - TZ=Asia/Shanghai
    volumes:
      - /opt/docker/emby/config:/config
      - /mnt/nas/media:/media 
    ports:
      - "8096:8096"
    restart: unless-stopped

关键参数说明:

  • devices: 将宿主机的 /dev/dri 完整映射到容器
  • GIDLIST: 将容器用户添加到 videorender

3.3 验证容器内权限

# 检查容器内是否能看到设备
docker exec emby ls -la /dev/dri/

# 检查容器用户的组成员身份
docker exec emby id

预期输出:

uid=1026(emby) gid=100(users) groups=100(users),39(video),105(render)

常见问题排查

Q1: 虚拟机启动失败或黑屏

原因: GPU 直通配置问题

解决:

# 在 Proxmox Host 查看 VM 日志
cat /var/log/pve/qemu-server/100.log

# 尝试修改显示类型
qm set 100 --vga none

Q2: Rocky Linux 中仍然看不到 renderD128

排查步骤:

# 1. 确认固件包已安装
rpm -qa | grep -E "intel-media-driver|linux-firmware"

# 2. 手动加载驱动
sudo modprobe i915

# 3. 检查是否有错误
dmesg | grep -i "i915\|error\|firmware"

# 4. 如果缺少固件文件
sudo dnf reinstall linux-firmware

Q3: Docker 容器内看不到 /dev/dri

排查步骤:

# 1. 确认宿主机有设备
ls -la /dev/dri/

# 2. 检查 Docker Compose 配置
cat docker-compose.yml | grep -A 5 devices

# 3. 重建容器
docker-compose down
docker-compose up -d --force-recreate

# 4. 检查容器内
docker exec emby ls -la /dev/dri/

技术原理总结

“Ghost Card” 现象

很多人被 /dev/dri/card0 的存在所误导:

  • bochs-drm 虚拟显卡也会创建 card0
  • ❌ 只有 card0 而没有 renderD128 = 无硬件加速能力
  • ✅ 物理 GPU 直通成功的标志:同时存在 card0 和 renderD128

驱动加载链条

Proxmox VFIO 直通
    ↓
Rocky Linux 识别 PCI 设备 (lspci 可见)
    ↓
加载 i915 驱动 (需要 linux-firmware)
    ↓
创建 /dev/dri/renderD128 (硬件加速接口)
    ↓
Docker 容器访问 (需要正确的 GID)
    ↓
应用程序使用 Intel Quick Sync

为什么需要 linux-firmware?

Rocky Linux 最小化安装不包含 Intel GPU 固件,导致:

  • 内核识别硬件但无法初始化
  • i915 驱动加载失败
  • 无法创建 renderD128 设备节点

安装 linux-firmware 后,固件文件位于:

/lib/firmware/i915/
├── kbl_dmc_ver1_04.bin
├── kbl_guc_ver9_39.bin
└── kbl_huc_4.0.0.bin

完整配置检查清单

Proxmox Host

  • [ ] IOMMU 已启用 (dmesg | grep IOMMU)
  • [ ] GPU 被 vfio-pci 接管 (lspci -k | grep vfio-pci)
  • [ ] VM 配置包含 hostpci0machine: q35

Rocky Linux VM

  • [ ] 安装了 intel-media-driverlinux-firmware
  • [ ] i915 驱动已加载 (lsmod | grep i915)
  • [ ] 存在 /dev/dri/renderD128 设备
  • [ ] lspci -k 显示 Kernel driver in use: i915

Docker 容器

  • [ ] devices 配置包含 /dev/dri:/dev/dri
  • [ ] GIDLIST 包含 video 和 render 组 ID
  • [ ] 容器内可见 /dev/dri/renderD128

性能收益

配置成功后的典型性能表现:

场景 软件转码 (CPU) 硬件转码 (Quick Sync)
4K HEVC → 1080p H.264 5-10 fps 130+ fps
CPU 占用率 100% <30%
功耗 65W+ 15-25W
并发转码流 1-2 路 5-8 路

适用范围: Intel 第 8-11 代酷睿处理器(UHD 600/700 系列核显)

最后更新: 2026-01-21

参考资源:

支持

Leave a Comment