开启左侧

在飞牛虚拟机上使用Intel GVT-g共享显卡

发表于:2025-1-24 15:51:49 高阶玩法 5536

前言

Intel GVT-g方案可以实现多个虚拟机使用同一块显卡 本文将会演示,如何在fnOS上的虚拟机使用Intel GVT-g

本文使用的飞牛OS版本为0.8.36 内核版本为Linux fnOS-device 6.6.38-trim #80 SMP PREEMPT_DYNAMIC Tue Dec 10 20:45:43 CST 2024 x86_64 GNU/Linux 显卡为VGA compatible controller [0300]: Intel Corporation HD Graphics 620 [8086:5916]

若你使用的版本与本文提及的版本不同,请自行见机行事 若你使用的显卡为Xe架构及更新的型号,请使用SR-IOV技术而非GVT-g技术

支持范围

GVT-g支持的处理器架构为

BROADWELL
SKYLAKE
KABYLAKE
BROXTON
COFFEELAKE
COMETLAKE

具体信息可以阅读源代码了解 https://github.com/torvalds/linux/blob/bc8198dc7ebc492ec3e9fa1617dcdfbe98e73b17/drivers/gpu/drm/i915/intel_gvt.c#L52

准备与配置

/etc/modules

写入配置即可

echo -e "vfio\nvfio_iommu_type1\nvfio_pci\nvfio_virqfd\**ev\nkvmgt" >> /etc/modules

grub

在开启IOMMU时,追加内核启动参数 如下所示

intel_iommu=on iommu=pt i915.enable_gvt=1

update-grub

完成以上操作后,使用命令更新grub,并重启系统

update-grub

检查宿主机状态

/proc/cmdline

使用命令,查看内核启动参数

cat /proc/cmdline

如下所示,出现了刚刚加入的参数视为正确

BOOT_IMAGE=/boot/vmlinuz-6.6.38-trim root=UUID=2a3a8241-129b-4fd2-bbff-915be052784d ro modprobe.blacklist=pcspkr quiet i915.force_probe=7d55 intel_iommu=on iommu=pt i915.enable_gvt=1

lsmod

使用命令,检查系统模块加载正确

lsmod |grep -e vfio -e i915 -e kvmgt -e mdev

可参考如下结果,关键模块有出现就行,不需要全部一致

kvmgt                 417792  0
mdev                   20480  1 kvmgt
kvm                  1318912  2 kvmgt,kvm_intel
i915                 3911680  19 kvmgt
drm_buddy              20480  1 i915
drm_display_helper    221184  1 i915
cec                    65536  2 drm_display_helper,i915
ttm                   102400  1 i915
drm_kms_helper        245760  2 drm_display_helper,i915
i2c_algo_bit           12288  1 i915
vfio_pci               16384  0
vfio_pci_core          86016  1 vfio_pci
irqbypass              12288  2 vfio_pci_core,kvm
vfio_iommu_type1       45056  0
vfio                   61440  4 vfio_pci_core,kvmgt,vfio_iommu_type1,vfio_pci
drm                   749568  8 drm_kms_helper,kvmgt,drm_display_helper,drm_buddy,thinkpad_acpi,i915,ttm
video                  73728  2 thinkpad_acpi,i915

mdev支持类型

因为核显地址基本上都一样,如果不一样你需要自己该成你核显的pci位置 使用命令查看支持的mdev类型

ls -l /sys/devices/pci0000:00/0000:00:02.0/mdev_supported_types

可以参考以下结果,至少要有一个mdev类型才能正常使用 记录mdev类型的名称,留待后面使用

total 0
drwxr-xr-x 3 root root 0 Jan 24 11:30 i915-GVTg_V5_2
drwxr-xr-x 3 root root 0 Jan 24 11:30 i915-GVTg_V5_4
drwxr-xr-x 3 root root 0 Jan 24 11:30 i915-GVTg_V5_8

配置libvirt设备定义

定义mdev设备

刚刚记录的mdev名称,现在就可以用到了 如下所示,写一个xml配置,本例命名为gvtg_0002_915_5_8.xml 这里的pci_0000_00_02_0是核显的pci地址 然后i915-GVTg_V5_8是mdev类型,你需要在之前列出的类型中选一个

<device>
    <parent>pci_0000_00_02_0</parent>
    <capability type="mdev">
        <type id="i915-GVTg_V5_8"/>
        <uuid>00000000-0000-0000-0000-000000000011</uuid>
    </capability>
</device>

将xml文件上传到飞牛nas上,使用如下命令创建该设备定义

virsh nodedev-define gvtg_0002_915_5_8.xml

执行命令后会有如下的内容展示

root@fnOS-device:~# virsh nodedev-define gvtg_0001_256.xml 
Node device 'mdev_00000000_0000_0000_0000_000000000011_0000_00_02_0' defined from 'gvtg_0002_915_5_8.xml

查询mdev设备

如下所示,查一下刚才的注册操作是否成功

root@fnOS-device:~# virsh nodedev-info mdev_00000000_0000_0000_0000_000000000011_0000_00_02_0
Name:           mdev_00000000_0000_0000_0000_000000000011_0000_00_02_0
Parent:         pci_0000_00_02_0
Active:         no
Persistent:     yes
Autostart:      no

这里我们不开启mdev设备自动启动,有需要的用户可以使用virsh nodedev-autostart自行启用

启用mdev设备

使用如下命令启用mdev设备 这里的start后接的参数,就是创建设备定义时返回的那一串

virsh nodedev-start mdev_00000000_0000_0000_0000_000000000011_0000_00_02_0

回显如下

root@fnOS-device:~# virsh nodedev-start mdev_00000000_0000_0000_0000_000000000011_0000_00_02_0
Device mdev_00000000_0000_0000_0000_000000000011_0000_00_02_0 started
root@fnOS-device:~# virsh nodedev-info mdev_00000000_0000_0000_0000_000000000011_0000_00_02_0
Name:           mdev_00000000_0000_0000_0000_000000000011_0000_00_02_0
Parent:         pci_0000_00_02_0
Active:         yes
Persistent:     yes
Autostart:      no

修改虚拟机libvirt配置

寻找虚拟机名称

这里有一个小技巧,打开飞牛虚拟机页面,同时按F12启用浏览器开发者工具 点击对应的虚拟机,在开发者工具抓到的网络请求就可以知道虚拟机的真实名称 20250124143709.png

图中展示的虚拟机名称为rvb8l0pj

编辑虚拟机xml配置

可以参考下面这份配置,自行修改uuid为你创建时使用的uuid 这是一份比较通用的配置,如果你需要配置为PCIe设备,或者是配置ramfb请自行修改

<hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci'>
  <source>
    <address uuid='00000000-0000-0000-0000-000000000011'/>
  </source>
</hostdev>

使用如下命令打开虚拟机配置进行编辑 记得将虚拟机名称替换为刚刚找到的的名称

virsh edit rvb8l0pj

大概在这个地方插入设备配置 20250124144011.png 进行保存后,若有类似如下提示,直接按i键

root@fnOS-device:~# virsh edit rvb8l0pj
error: XML document failed to validate against schema: Unable to validate doc against /usr/share/libvirt/schemas/domain.rng
Extra element devices in interleave
Element domain failed to validate content

Failed. Try again? [y,n,i,f,?]:

会忽略格式问题进行保存,出现如下的回显

Domain 'rvb8l0pj' XML configuration edited.

启动虚拟机

观察设备信息

如下图所示,在设备管理器中可以看见一个没有打驱动的显示设备 设备ID中包含8086 20250124144820.png

打驱动

这步没什么好说的,一般来说Windows更新会自己检查驱动 20250124150006.png

直接下载等他自动安装完成即可

切换显示器

驱动安装完毕后,可能会出现VNC被挤占到2号显示器的情况 此时可以使用热键 Win+P切换显示器 具体步骤就是按下VNC上的Win键,然后再按下键盘的P键 盲按几次,一般都能切回主显示器显示 20250124150259.png

验证GVT-g功能

在虚拟机随便播个视频

20250124150909.png

在虚拟机随便**图形负载

20250124151539.png

观察宿主机负载

安装intel-gpu-tools
root@fnOS-device:~# apt install intel-gpu-tools
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages were automatically installed and are no longer required:
  libclang-cpp14 libid3tag0 libigc1 libigdfcl1 libllvmspirvlib14 libopencl-clang14
Use 'apt autoremove' to remove them.
The following NEW packages will be installed:
  intel-gpu-tools
0 upgraded, 1 newly installed, 0 to remove and 9 not upgraded.
Need to get 792 kB of archives.
After this operation, 4,237 kB of additional disk space will be used.
Get:1 https://mirrors.ustc.edu.cn/debian bullseye/main amd64 intel-gpu-tools amd64 1.25-2.1 [792 kB]
Fetched 792 kB in 1s (950 kB/s)         
Selecting previously unselected package intel-gpu-tools.
(Reading database ... 72486 files and directories currently installed.)
Preparing to unpack .../intel-gpu-tools_1.25-2.1_amd64.deb ...
Unpacking intel-gpu-tools (1.25-2.1) ...
Setting up intel-gpu-tools (1.25-2.1) ...
Processing triggers for man-db (2.11.2-2) ...
Processing triggers for libc-bin (2.36-9+deb12u4) ...
ldconfig: /usr/local/lib/libzmq.so.5 is not a symbolic link
查看intel_gpu_top

20250124152329.png 至此,我们的虚拟机功能验证就结束了

后记

一顿操作猛如虎,不如换用dockerPVE https://club.fnnas.com/forum.php?mod=viewthread&tid=12375 网页上点一点就能开GVT-g简直轻轻松松 20250124152955.png

希望飞牛官方早日支持在web端创建添加mdev设备吧

收藏
送赞 4
分享

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

发表回复

评论列表(42)

大佬6,看到我发麻
2025-1-24 17:16:38 回复
向大佬学习
2025-1-24 17:21:12 回复
头有点痒痒,要长脑子了
2025-1-24 22:16:30 回复
如果在PVE里面使用gvt方案,飞牛影视无法打开GPU解码
2025-1-24 22:17:18 回复
感觉要长脑子了
2025-1-25 12:40:15 回复
我docker安装pve不支持mdev的显示啊
2025-1-28 23:29:05 回复
[md]![image.png](data/attachment/forum/202501/28/234024cuferu7zmivdvz4m.png "image.png") 我这个是灰色的,我docker compose就是按照你发的教程写的,老哥你帮我看看 ![image.png](data/attachment/forum/202  详情 回复
2025-1-28 23:42
支持啊,你看看你compose怎么写的。  详情 回复
2025-1-28 23:30
支持啊,你看看你compose怎么写的。
2025-1-28 23:30:49 回复

image.png

我这个是灰色的,我docker compose就是按照你发的教程写的,老哥你帮我看看

image.png这个加在哪

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
2025-1-28 23:42:26 回复
你框出来的是grub,飞牛的话在/etc/de什么什么/grub那边,至于什么什么我平时都是按tab出来的所以没记 加完了记得update-grub  详情 回复
2025-1-29 21:40
话说飞牛的虚拟机是基于pve的吧代码跟pve很像
2025-1-29 16:01:25 回复
你框出来的是grub,飞牛的话在/etc/de什么什么/grub那边,至于什么什么我平时都是按tab出来的所以没记
加完了记得update-grub
2025-1-29 21:40:02 回复
好的谢谢我已经成功了  详情 回复
2025-1-30 20:53
陪玩 发表于 2025-1-29 21:40
你框出来的是grub,飞牛的话在/etc/de什么什么/grub那边,至于什么什么我平时都是按tab出来的所以没记
加完 ...

好的谢谢我已经成功了
2025-1-30 20:53:31 回复
挺好的,可以水一贴展示一下成果还有你遇到的问题,方便后来人排坑  详情 回复
2025-1-30 23:31
挺好的,可以水一贴展示一下成果还有你遇到的问题,方便后来人排坑
2025-1-30 23:31:11 回复
就是一定要开启mdev支持类型,不然pve虚拟机不显示  详情 回复
2025-2-4 19:20
就是一定要开启mdev支持类型,不然pve虚拟机不显示
2025-2-4 19:20:05 回复
那肯定要有啊  详情 回复
2025-2-4 19:39
那肯定要有啊
2025-2-4 19:39:04 回复
太复杂了 我还是等官方适配吧
2025-2-5 13:31:19 回复
intel的770核显能这样操作吗?
2025-2-5 14:43:53 回复
UHD770用SR-IOV去吧,这个是给10代以下那些用的  详情 回复
2025-2-5 15:07
UHD770用SR-IOV去吧,这个是给10代以下那些用的
2025-2-5 15:07:47 回复
不会弄啊.怎么办
2025-2-11 22:47:02 回复
大佬可以开启虚拟机嵌套虚拟化吗
2025-2-13 23:12:13 回复
将xml文件上传到飞牛nas上,使用如下命令创建该设备定义    麻烦问下,这个编辑好的xml文件上传到飞牛的什么位置,我上传后执行virsh nodedev-define gvtg_0002_915_5_8.xml   提示找不到文件
2025-2-15 21:52:41 回复
传哪都行,但你执行命令的时候要在这个文件的目录  详情 回复
2025-2-15 22:00
传哪都行,但你执行命令的时候要在这个文件的目录
2025-2-15 22:00:20 回复
好的,谢谢,我试试  详情 回复
2025-2-15 22:09
好的,谢谢,我试试
2025-2-15 22:09:35 回复
感谢大佬,按照你的步骤,搞定了
2025-2-18 12:52:14 回复
是不是先要开启直通模式才能配置呢?
2025-2-18 15:57:28 回复
ls -l /sys/devices/pci0000:00/0000:00:02.0/mdev_supported_types 输入这命令后显示ls: cannot access '/sys/devices/pci0000:00/0000:00:02.0/mdev_supported_types': No such file or directory 这是什么问题.请教大佬们
2025-2-19 13:08:53 回复
[md]我也报这个错,大佬帮我看看是哪里问题? ![1740358285761.png](data/attachment/forum/202502/24/085352v9wew5p59rbpz5od.png "1740358285761.png") xml是直接复制的 ![image.png](data/attachment/forum/2025  详情 回复
2025-2-24 08:57
就是GVT-g没开出来  详情 回复
2025-2-19 16:26
就是GVT-g没开出来
2025-2-19 16:26:18 回复
感谢大佬回复,那是我的核显不支持,还是那个步骤做错了?我的核显是Intel HD Graphics 630  详情 回复
2025-2-19 17:48
陪玩 发表于 2025-2-19 16:26
就是GVT-g没开出来

感谢大佬回复,那是我的核显不支持,还是那个步骤做错了?我的核显是Intel HD Graphics 630
2025-2-19 17:48:21 回复
核显支持的,lsmod那一步发一下结果看看  详情 回复
2025-2-19 18:24
核显支持的,lsmod那一步发一下结果看看
2025-2-19 18:24:48 回复
开启成功,但是
Name:           mdev_00000000_0000_0000_0000_000000000011_0000_00_02_0
Parent:         pci_0000_00_02_0
Active:         yes
Persistent:     yes
Autostart:      no

每次宿主机飞牛OS重启之后,Active=no,必须通过ssh,virsh nodedev-start一次。Autostart=yes也没用
2025-2-19 20:27:02 回复
在启动脚本 /etc/rc.local 里加了 virsh nodedev-start mdev_00000000_0000_0000_0000_000000000011_0000_00_02_0 搞定。 当然要确保 /etc/rc.local 被 systemd 调用 还要加sudo systemctl enable rc-local.service  详情 回复
2025-2-19 21:35
在启动脚本 /etc/rc.local 里加了
virsh nodedev-start mdev_00000000_0000_0000_0000_000000000011_0000_00_02_0
搞定。

当然要确保 /etc/rc.local 被 systemd 调用
还要加sudo systemctl enable rc-local.service
sudo systemctl start rc-local.service
2025-2-19 21:35:22 回复

我也报这个错,大佬帮我看看是哪里问题? 1740358285761.png

xml是直接复制的

image.png

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
2025-2-24 08:57:09 回复
支持到10代  详情 回复
2025-2-24 22:50
找到原因了,7代以后的CPU不支持intel gvt-g  详情 回复
2025-2-24 09:29
找到原因了,7代以后的CPU不支持intel gvt-g
2025-2-24 09:29:41 回复
还是unraid简单。2步完成,解码正常。
2025-2-24 17:16:08 回复
[md]配置完图1之后重启,在虚拟机里直接使用。 ![图1.png](data/attachment/forum/202502/24/171753szhoc994tteefooc.png "图1.png") ![图2.png](data/attachment/forum/202502/24/171804vuuup1wbu983pxu8.png "图2  详情 回复
2025-2-24 17:18

配置完图1之后重启,在虚拟机里直接使用。 图1.png

图2.png

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
2025-2-24 17:18:07 回复
支持到10代
2025-2-24 22:50:17 回复
感谢大佬,成功了,后面的操作需要切到root模式,我刚开始没切到root,后面就忘了  详情 回复
2025-2-25 09:08
感谢大佬,成功了,后面的操作需要切到root模式,我刚开始没切到root,后面就忘了
2025-2-25 09:08:51 回复
啊?绝了,万万想不到  详情 回复
2025-2-25 09:53
啊?绝了,万万想不到
2025-2-25 09:53:55 回复
error: XML document failed to validate against schema: Unable to validate doc against /usr/share/libvirt/schemas/domain.rng
Extra element devices in interleave
Element domain failed to validate content

Failed. Try again? [y,n,i,f,?]:
error: XML error: Hostdev already exists in the domain configuration
Failed. Try again? [y,n,f,?]:
这一步编辑虚拟机按i选择忽略跳了个错误然后终端就卡住了,有点难顶,最后一步出问题
2025-3-4 00:12:57 回复
大佬能出个完整视频吗,看到你最后的后记,用的你之前的文章设置的PVE开启硬件直通后pcie选择显卡也是medv灰色,设置完虚拟机打不开了,显示:Use of uninitialized value $mdevtype in pattern match (m//) at /usr/share/perl5/PVE/QemuServer/PCI.pm line 695.
TASK ERROR: Cannot find vfio-pci module!
是使用dockerPVE也要这么走一遭吗
3 天前 回复
你宿主机的vfio-pci模块有加载吗,可以通过modprobe -v vfio-pci加载看看,再试试看  详情 回复
3 天前
你宿主机的vfio-pci模块有加载吗,可以通过modprobe -v vfio-pci加载看看,再试试看
3 天前 回复
重启NAS后,就没了,怎么让他自动加载呢?虚拟机 win10 启动失败
device not found: mediated device'00000000-0000-0000-0000-000000000011’not found
3 天前 回复
/etc/modules 写入配置 echo -e "vfio\nvfio_iommu_type1\nvfio_pci\nvfio_virqfd\**ev\nkvmgt" >> /etc/modules
中的**疑似被和谐了
昨天 00:50 回复