目录

问题记录2023-8-31

显卡直通

原理和流程

最底层开启VT(虚拟化技术)

PVE设置

上传镜像

创建虚拟机windows

虚拟系统驱动


问题记录2023-8-31

近期遇到添加的显卡的虚拟机启动不起来  状态如下

状况1:虚拟机的控制台一直处于这种状态 虚拟机运行状态是黄色感叹号⚠️

n100 pve显卡虚拟化 pve虚拟机显卡直通_ci

状况2:虚拟机的控制台显示guest has not initialzed the display (yet)  虚拟机运行状态是黄色感叹号⚠️

n100 pve显卡虚拟化 pve虚拟机显卡直通_windows_02

排查过程中发现在硬件中把pci的显卡给去掉后就可以正常运行。问题锁定显卡直通存在问题,然后在网上查到一个帖子,说其实7.0后就不用设置这么多配置和参数了,只需要

/etc/default/grub文件

#找到: GRUB_CMDLINE_LINUX_DEFAULT="quiet"

#然后修改为: GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"

修改完配置文件后执行update-grub更新一下grub配置文件

至此问题解决。

显卡直通

原理和流程

最底层:打开主机Bios下的最底层直通开关VT-D;

PVE系统层:打开PVE系统的IOMMU支持,大概意思是PVE系统级别的开关;

PVE系统层:关闭PVE系统对显卡的调用,腾出来给虚拟机用;

虚拟机层:配置要用显卡的虚拟机,让他去调用显卡;

虚拟系统层:让Windows系统装上显卡的驱动,让虚拟机系统能调用下卡;

最底层开启VT(虚拟化技术)

最底层:打开主机Bios开启VT(Virtualization Technology)

由于不同品牌主机开启VT的方法不同 请自行百度

PVE设置

进入pve命令行界面

修改/etc/default/grub文件

并在里面找到GRUB_CMDLINE_LINUX_DEFAULT="quiet" 这一行 将这一行替代成,目的是开启底层的硬件直通功能


GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt video=efifb:off,vesafb:off"


注意 如果是AMD的处理器是不一样的内容,

n100 pve显卡虚拟化 pve虚拟机显卡直通_n100 pve显卡虚拟化_03

添加完毕后,我们更新一下grub配置文件 输入命令 update-grub

n100 pve显卡虚拟化 pve虚拟机显卡直通_ci_04

然后找到配置文件/etc/modules 在结尾添加内容,打开pci硬件的直通


vfio vfio_iommu_type1 vfio_pci vfio_virqfd


n100 pve显卡虚拟化 pve虚拟机显卡直通_感叹号_05

上述就完成了PVE层的PCI直通设置,加下来我们将PVE系统禁止加载显卡驱动,目的是不与需要显卡直通的虚拟机冲突争夺HDMI通道,找到这个路径

/etc/modprobe.d/ pve-blacklist.conf 添加一下


blacklist radeon blacklist nouveau blacklist nvidia


n100 pve显卡虚拟化 pve虚拟机显卡直通_n100 pve显卡虚拟化_06

其他参数

# 允许不安全的中断
echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/iommu_unsafe_interrupts.conf

# 忽略异常,防止虚拟机异常导致宿主机崩溃
#   ignore_msrs             :   忽略异常
#   report_ignored_msrs     :   是否报告异常
echo "options kvm ignore_msrs=1 report_ignored_msrs=0" > /etc/modprobe.d/kvm.conf

输入命令 lspci -nn,查找所有PCI总线的所有设备的供应商ID和设备ID

找到显卡的设备ID(如:[10de:2204])并复制

01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA102 [GeForce RTX 3090] [10de:2204] (rev a1) 这行是显卡 记住设备ID

01:00.1 Audio device [0403]: NVIDIA Corporation GA102 High Definition Audio Controller [10de:1aef] (rev a1) 这行是声卡 记住设备ID

n100 pve显卡虚拟化 pve虚拟机显卡直通_windows_07

找到目录 /etc/modprobe.d/ 并在目录下新建一个vfio.conf的文件

在内容里面填入 options vfio-pci ids=10de:2204,10de:1aef


options vfio-pci ids=设备ID,设备ID


n100 pve显卡虚拟化 pve虚拟机显卡直通_windows_08

完成上面的配置文件修改后, 输入命令让系统更新配置 update-initramfs -u

n100 pve显卡虚拟化 pve虚拟机显卡直通_n100 pve显卡虚拟化_09

接着,我们通过命令重启一下设备 重启命令reboot

重启的过程中,我们观察一下主机输出的HDMID显示,如果看上去卡着不动,无法进入到PVE 的登陆命令行界面,表示你禁用显卡成功了, 可以继续下面的操作,

如果会显示输入命令行的界面,那就表示没有成功禁用显卡,还需要回炉重来。

n100 pve显卡虚拟化 pve虚拟机显卡直通_感叹号_10

PVE重启后,我们来验证一下PVE层的显卡直通是否已经开启

使用Xshell连接PVE 输入命令 lsmod | grep vfio

如果出现回调这样类似的信息,表示成功了


vfio_pci 57344 1 vfio_virqfd 16384 1 vfio_pci irqbypass 16384 4 vfio_pci,kvm vfio_iommu_type1 40960 1 vfio 36864 5 vfio_iommu_type1,vfio_pci


n100 pve显卡虚拟化 pve虚拟机显卡直通_运维_11

上传镜像

virtio-win-0.1.215.iso镜像 虚拟系统驱动

win10.iso是Windows系统镜像

n100 pve显卡虚拟化 pve虚拟机显卡直通_windows_12

创建虚拟机windows

创建虚拟机 设置名称

n100 pve显卡虚拟化 pve虚拟机显卡直通_ci_13

设置ISO镜像,类别,版本

n100 pve显卡虚拟化 pve虚拟机显卡直通_运维_14

设置机型

n100 pve显卡虚拟化 pve虚拟机显卡直通_ci_15

将设备 IDE改成VirtlO Block 设置磁盘大小 想要用VirtlO BlocK需要加载驱动

n100 pve显卡虚拟化 pve虚拟机显卡直通_感叹号_16

设置CPU

n100 pve显卡虚拟化 pve虚拟机显卡直通_n100 pve显卡虚拟化_17

设置内存

n100 pve显卡虚拟化 pve虚拟机显卡直通_感叹号_18

网络选择Intel E1000

n100 pve显卡虚拟化 pve虚拟机显卡直通_n100 pve显卡虚拟化_19

确认并完成

n100 pve显卡虚拟化 pve虚拟机显卡直通_n100 pve显卡虚拟化_20

添加VirtlO Block的驱动

n100 pve显卡虚拟化 pve虚拟机显卡直通_ci_21

ISO镜像选择【virtio-win-0.1.215.iso】

n100 pve显卡虚拟化 pve虚拟机显卡直通_n100 pve显卡虚拟化_22

添加PCI设备

n100 pve显卡虚拟化 pve虚拟机显卡直通_windows_23

选择显卡

n100 pve显卡虚拟化 pve虚拟机显卡直通_n100 pve显卡虚拟化_24

勾选 主GPU和PCI-Express

n100 pve显卡虚拟化 pve虚拟机显卡直通_感叹号_25

查看驱动和显卡是否添加上了

n100 pve显卡虚拟化 pve虚拟机显卡直通_n100 pve显卡虚拟化_26

开启虚拟机 win10安装

n100 pve显卡虚拟化 pve虚拟机显卡直通_ci_27

n100 pve显卡虚拟化 pve虚拟机显卡直通_n100 pve显卡虚拟化_28

没有产品密钥 就点击我没有产品密钥

n100 pve显卡虚拟化 pve虚拟机显卡直通_运维_29

选择自己需要的版本

n100 pve显卡虚拟化 pve虚拟机显卡直通_n100 pve显卡虚拟化_30

n100 pve显卡虚拟化 pve虚拟机显卡直通_ci_31

n100 pve显卡虚拟化 pve虚拟机显卡直通_ci_32

由于我们选择的硬盘类型是VirtlO Block需要加载驱动 加载驱动后硬盘就可以加载出来了

n100 pve显卡虚拟化 pve虚拟机显卡直通_感叹号_33

n100 pve显卡虚拟化 pve虚拟机显卡直通_感叹号_34

n100 pve显卡虚拟化 pve虚拟机显卡直通_感叹号_35

n100 pve显卡虚拟化 pve虚拟机显卡直通_感叹号_36

n100 pve显卡虚拟化 pve虚拟机显卡直通_ci_37

n100 pve显卡虚拟化 pve虚拟机显卡直通_windows_38

n100 pve显卡虚拟化 pve虚拟机显卡直通_感叹号_39

n100 pve显卡虚拟化 pve虚拟机显卡直通_运维_40

n100 pve显卡虚拟化 pve虚拟机显卡直通_ci_41

n100 pve显卡虚拟化 pve虚拟机显卡直通_n100 pve显卡虚拟化_42

有账号就输入账号 没有可以创建 也可以点击脱机账号

n100 pve显卡虚拟化 pve虚拟机显卡直通_n100 pve显卡虚拟化_43

由于 我刚刚点击的是脱机账号 所以这点击有限体验

n100 pve显卡虚拟化 pve虚拟机显卡直通_ci_44

设置用户名

n100 pve显卡虚拟化 pve虚拟机显卡直通_感叹号_45

设置密码

n100 pve显卡虚拟化 pve虚拟机显卡直通_运维_46

n100 pve显卡虚拟化 pve虚拟机显卡直通_windows_47

n100 pve显卡虚拟化 pve虚拟机显卡直通_n100 pve显卡虚拟化_48

n100 pve显卡虚拟化 pve虚拟机显卡直通_n100 pve显卡虚拟化_49

n100 pve显卡虚拟化 pve虚拟机显卡直通_n100 pve显卡虚拟化_50

n100 pve显卡虚拟化 pve虚拟机显卡直通_感叹号_51

n100 pve显卡虚拟化 pve虚拟机显卡直通_ci_52

虚拟系统驱动

虚拟机通用驱动:我们通过ISO镜像虚拟机驱动包安装

直通驱动:就是显卡,或者你需要直通硬件的实体驱动文件

虚拟机通用驱动可以选择安装也可以不安装 (建议安装一下)

通过PVE虚拟机的设置,进入win10的虚拟机选项,硬件里面,驱动器【virtio-win-0.1.215.iso】 上面操作有添加过程

然后回到windows界面找到 设备管理器 可以看到有一个设备有感叹号( !)

右击感叹号的设备选择【更新驱动】,并选择浏览我的磁盘,然后选择光驱盘作为驱动

n100 pve显卡虚拟化 pve虚拟机显卡直通_感叹号_53

n100 pve显卡虚拟化 pve虚拟机显卡直通_n100 pve显卡虚拟化_54

n100 pve显卡虚拟化 pve虚拟机显卡直通_ci_55

n100 pve显卡虚拟化 pve虚拟机显卡直通_windows_56

n100 pve显卡虚拟化 pve虚拟机显卡直通_n100 pve显卡虚拟化_57

n100 pve显卡虚拟化 pve虚拟机显卡直通_windows_58

安装后,会看到一个【VirtlO Balloon Driver】的设置,就OK 了

n100 pve显卡虚拟化 pve虚拟机显卡直通_ci_59

在设置管理器中的显示适配器中就可以查看到显卡了 有感叹号的那个显卡就是我们刚刚添加的显卡

n100 pve显卡虚拟化 pve虚拟机显卡直通_运维_60

安装显卡所需的驱动

n100 pve显卡虚拟化 pve虚拟机显卡直通_n100 pve显卡虚拟化_61

先检验一下,虚拟机显示界面上,显示是否正常驱动,有两个位置可以检测显卡是否正常调用

设备管理器,能看到显卡的正确型号,并且没有感叹号;

任务管理器,在性能左侧,能看到GPU 的栏目;

n100 pve显卡虚拟化 pve虚拟机显卡直通_windows_62

n100 pve显卡虚拟化 pve虚拟机显卡直通_windows_63

到这里显卡直通已经完成了