PVE7.3下折腾核显直通以及EMBY开启视频硬件转码

硬件环境j:n6005主板NAS

软件环境:Proxmox VE7.3 虚拟机上直通硬盘跑了truenas scale 22.12.0,开通samba共享和nfs共享,做为数据存储中心。另外再跑了一个debian11用来跑各种应用。nas-tools,qbittorent,emby,ddns-go这些。因为emby不开启硬解,在转码的时候非常占用cpu资源,于是有了这一篇折腾笔记。

开启PVE虚拟化

1、PVE的内核开启支持VD-T直通的IOMMU及相关模块

文件位于:

/etc/default/grub

把原内容中

1
GRUB_CMDLINE_LINUX_DEFAULT="quiet"

改为(我的是intel的cpu,如果你用amd,把intel改成amd)

1
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"

然后在ssh下输入 update-grub2 立即更新grub;

2、编辑 /etc/modules 模块文件

如果系统没有此文件,则自己建立一个,加上以下代码

1
2
3
4
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd    

3、 验证是否开启成功

1
dmesg | grep remapping

出现如下例子,则代表成功。

显卡直通

显卡直通需要满足前面所有的配置,同时虚拟机芯片组必须是q35,BIOS最好是UEFI模式 AMD的显卡如果给黑苹果使用,则需要小心重启bug NVIDIA的显卡如果支持vGPU模式,可以配置虚拟PCI-E设备给虚拟机使用

1、建立驱动黑名单

编辑/etc/modprobe.d/pve-blacklist.conf添加驱动屏蔽列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# This file contains a list of modules which are not supported by Proxmox VE                          2
# nidiafb see bugreport https://bugzilla.proxmox.com/show_bug.cgi?id=701

# Nvidia
blacklist nvidiafb
blacklist nouveau
blacklist nvidia

# AMD
blacklist amdgpu
blacklist radeon

# Intel UHD
blacklist snd_hda_codec_hdmi
blacklist snd_hda_intel
blacklist snd_hda_codec
blacklist snd_hda_core

options nouveau modeset=0

2、GPU信息确认
在ssh下输入命令 lspci -knn | grep -i -A 2 vga,查看你要直通的显卡

其中00:01是代表组名。00:01.0是代表00:01组的第一个设备 laf4:1100表示厂商ID:设备ID,直接通过lspci看的话可以看到音频设备甚至是USB设备 这里我因为不需要对当前PCI-E设备组再拆分,所以直接略过

如果你需要设置显卡显示设备和音频设备单独直通,需要执行下面语句 让PCI-E设备(显卡)由vfio驱动程序接管便于直通 如果不需要单独直通,vfio驱动会在设置直通的时候自动接管PCI-E设备,可以不用配置vfio-pci

1
2
echo "options vfio-pci ids=1234:1111,laf4:1100" > /etc/modprobe.d/vfio.conf
#注意,上面这条命令,ids=后面跟直通组的所有设备。中间以英文逗号隔开。自己的设备自己替换。

更新引导配置

1
update-initramfs -u -k all

重启PVE

验证PCI-E显卡是否被vfio-pci驱动,Kernel driver in use: vfio-pci表示直通驱动成功

1
lspci -knn | grep -i -A 2 vga

虚拟机直通显卡

然后开机,注意:由于显卡已经直通,所以VNC查看时,是没有介面的。

此时再ssh到debian虚拟机上就可以看到直通的显卡了

剩下的就简单了。

用docker-compose把emby跑起来,我用的是xinjiawei1大大的镜像直接unlockd了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
version: "2.1"
services:
emby:
# image: linuxserver/emby:latest
image: xinjiawei1/emby_unlockd:4.7.11.0
container_name: emby
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
volumes:
- /data/emby/config:/config
- /mnt/video:/data/video
ports:
- 8096:8096
devices:
- /dev/dri:/dev/dri #把显卡映射到容器里
restart: unless-stopped

最后就是成果