proxmox ve 7.2 AMD显卡直通 网卡驱动 调度器

1. 创建虚拟机时硬盘选择VirtIO SCSI导致windows安装找不到硬盘

需要提前下载VirtIO驱动,并在虚拟机创建完成后,在硬件-添加-CD/DVD驱动器中添加驱动iso

https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso

这里提供一个下载链接,经验证可使用

2. 网卡无法正常使用/网速慢/经常掉线

首先确认你使用的网卡是Realtek芯片的,在pve7.2中带有一个古老的驱动r8169,可通过 modinfo r8169 查看,该驱动同时驱动了我安装的2.5G rtl8125网卡与主板自带的rtl8168网卡,并导致rtl8125网卡在拨号时经常失败/网速达不到标准速度,下面给出一种解决方案
(1) 安装编译网卡驱动需要的依赖

apt install pve-headers-$(uname -r)
apt install git dkms build-essential

(2) 下载对应你网卡需求的驱动,最好选择dkms驱动,可以在系统升级后仍能正常使用
rtl8125: https://github.com/awesometic/realtek-r8125-dkms.git
rtl8168: https://github.com/RangeeGmbH/r8168-dkms.git
其中8125驱动可以通过以下方式修改提升网卡性能:修改src下Makefile

ENABLE_MULTIPLE_TX_QUEUE = y
ENABLE_RSS_SUPPORT = y
CONFIG_ASPM = n

即可开启RSS TX/RX多队列支持,并关闭ASPM节能技术,随后通过dkms编译驱动

(3) 检查你编译的驱动是否正确安装,可使用 lsmod | grep r8125 检查,如果有输出则说明驱动加载成功,没有输出请在根目录手动加载模块 modprobe r8125 尝试
最后通过命令 sh -c 'echo blacklist r8169 >> /etc/modprobe.d/blacklist_r8169.conf' 屏蔽r8169驱动,重启pve后即可看见自编译驱动已经正确被网卡加载

3. pve中创建虚拟机的基本参数应如何选择

在这里插入图片描述
选择Q35是因为该机型可以实现pcie直通,而win11的安装推荐添加TPM2.0以防止安装错误,BIOS这里选择UEFI,但并不是所有的系统都支持从UEFI启动,如爱快系统就需使用SeaBios才能启动

在这里插入图片描述
CPU这里如果需要最佳性能,请设置为host类别,并将CPU权重调高,如调整到1025,CPU的核心数并不完全对应超线程的数量,而是由KVM自行进行权重分配

4. 选择合适的CPU调度器来兼顾宿主机的功耗与性能

首先安装系统监控软件以查看CPU频率和其他系统参数

apt install cpufrequtils lm-sensors 

安装好cpufrequtils后可以运行 cpufreq-info 检查当前CPU的调度器
在这里插入图片描述
如图可以看到我的CPU调度器是schedutil,而pve安装后的默认调度器一般均为ondemand,你也可以使用下面命令来查看CPU调度器

## 检查 CPU 当前调度器
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

## 参考输出
ondemand

接下来我们需要了解当前系统CPU支持哪些调度器,使用下面命令

## 检查 CPU 调度器支持情况
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors

## 参考输出
conservative ondemand userspace powersave performance schedutil

这里说明一下各种CPU调度器的区别,推荐使用schedutil调度器,实现功耗和性能的平衡

conservative   governor 开启一个 timer,定期去计算各个 CPU 的负载。当CPU 负载超过 80% 时,默认会以 5% 的步伐递增;当 CPU 负载少于 20% 的时候,默认会以 5% 的步伐递减。
ondemand       governor 开启一个 timer,定期去计算各个 CPU 的负载。当 CPU 负载超过 80% 时, 就会把 CPU 频率调到最高,其他情况则会根据当前负载按比例计算频率
userspace      用户自定义CPU频率
powersave      CPU跑在最低频率
performance    CPU一直跑在最高频率
schedutil	   利用负载变化回调机制, 把各个 CPU 的 capacity 映射到 CPU 频率,来完成调频动作,capacity 越高,当前 CPU 负载越高,所以频率也调的很高

修改当前CPU调度器:

## 修改 cpufrequtils 配置文件
vim /etc/init.d/cpufrequtils

## 找到 GOVERNOR="ondemand" 修改为以下内容
GOVERNOR="schedutil"

## 让调度器修改生效而不重启系统
systemctl daemon-reload
/etc/init.d/cpufrequtils restart

实时查看当前CPU的频率:

watch -n 0.1 cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq

5. AMD显卡直通(以Polaris核心的RX580为例)

这里需要说明,我的电脑为Intel CPU搭配Polaris核心 RX580,并使用了Linux内核5.15版本的pve7.2,如果你的显卡不是以下任意一款,并内核版本不是5.15及以上版本,请慎重使用下面教程
在这里插入图片描述

(1) 修改/etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"

这里如果是AMD的CPU,则需要把 intel_iommu=on 改为 amd_iommu=on ,并一定不要添加 video=vesafb,simplefb,efifb:off 等屏蔽video的参数,这是由于AMD Crash Bug,后续会进行单独设置

如果你的主板的PCIE IOMMU是合并的(例如1 2槽PCIE会共享带宽),请拆分IOMMU,也就是在 intel_iommu=on 后面添加 pcie_acs_override=downstream

(2) 修改 /etc/modules

vim /etc/modules

在文件底部添加下面四个参数,并保存退出:
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

(3) 修改/etc/modprobe.d下面的文件

防止虚拟机崩溃影响宿主机的参数:
echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/iommu_unsafe_interrupts.conf
echo "options kvm ignore_msrs=1 report_ignored_msrs=0" > /etc/modprobe.d/kvm.conf
屏蔽显卡驱动:
echo "blacklist radeon" >> /etc/modprobe.d/pve-blacklist.conf
echo "blacklist nouveau" >> /etc/modprobe.d/pve-blacklist.conf
echo "blacklist nvidia" >> /etc/modprobe.d/pve-blacklist.conf

(4) 添加vendor-reset
AMD显卡直通会出现第一次启动VM之后,如果关闭或重启VM,则显卡就会工作不正常、掉驱动甚至不工作的问题,这是由于AMD Reset Bug导致VM关机后显卡不能正确重置,大多数主机开机只能使用一次,第二次尝试使用显卡则会导致VM启动失败/VM宿主机都卡死

安装编译vendor-reset驱动需要的依赖(在网卡部分安装过则可以跳过)

apt install pve-headers-$(uname -r)
apt install git dkms build-essential

下载vender-reset驱动并编译
git clone https://github.com/gnif/vendor-reset.git
cd vendor-reset
dkms install .

将驱动添加到modules管理中
echo "vendor-reset" >> /etc/modules
update-initramfs -u

重启后运行
dmesg | grep vendor
如果有输出,则表示安装成功
[    8.851280] vendor_reset_hook: installed

(5) pve中虚拟机添加显卡设备
在做这一步之前请先将系统安装完成,并且将virtio驱动安装,在安装完成,系统可以正常启动之后再进行下面步骤
在这里插入图片描述
可以看见两个设备,一个显卡,一个是显卡带的声卡输出,如果没有声卡输出需求则不需要添加下面的驱动
在这里插入图片描述
按上图设置,暂时不开使用主GPU,在开启显卡直通后宿主机会黑屏,这是由于显卡被VFIO抓走了,然后等待开机后使用noVNC控制安装显卡驱动,驱动安装完成并且显示器亮屏之后再关机并勾选主GPU,即可

6. 虚拟机Windows CPU性能问题

在虚拟机Windows中虽然直通了显卡,并且我们按照之前的设置已经将调度器设置为schedutil,但仍会发现由于schedutil调度器的调度模式并不适合win打游戏或者高负载应用使用,而导致的长时间顿卡问题,这里提供一种解决方案。
pve中带有一种名为hookscript的钩子脚本,可以监测到虚拟机的四种状态,分别是pre-start,post-start,pre-stop,post-stop,我们可以通过这种脚本设置windows虚拟机开机时将CPU调度器调整到performance(全核心满频)状态,在windows虚拟机关机的时候调整回schedutil模式。

新建一个文件 /var/lib/vz/snippets/hookscript.sh ,内容如下

#!/usr/bin/env bash
VM_ID=$1;
EXECUTION_PHASE=$2

function change_cpu_freq_performance
{
        sed -i "s/GOVERNOR=\"schedutil\"/GOVERNOR=\"performance\"/g" /etc/init.d/cpufrequtils
        systemctl daemon-reload
        /etc/init.d/cpufrequtils restart
}

function change_cpu_freq_schedutil
{
        sed -i "s/GOVERNOR=\"performance\"/GOVERNOR=\"schedutil\"/g" /etc/init.d/cpufrequtils
        systemctl daemon-reload
        /etc/init.d/cpufrequtils restart
}
if [[ "$EXECUTION_PHASE" == "pre-start" ]]; then
        echo "pre_start" >> /root/status
        change_cpu_freq_performance;
elif [[ "$EXECUTION_PHASE" == "post-start" ]]; then
        echo "post_start" >> /root/status
        change_cpu_freq_performance;
elif [[ "$EXECUTION_PHASE" == "pre-stop" ]]; then
        echo "pre_stop" >> /root/status
        change_cpu_freq_schedutil;
elif [[ "$EXECUTION_PHASE" == "post-stop" ]]; then
        echo "post_stop" >> /root/status
        change_cpu_freq_schedutil;
fi

然后将这个钩子脚本绑定到对应虚拟机中即可

## 修改 cpufrequtils 配置文件
vim /etc/init.d/cpufrequtils

## 找到 GOVERNOR="ondemand" 修改为以下内容 这是为了防止sed命令不能正确匹配所做的修改
GOVERNOR="schedutil"

# 绑定脚本 将101替换为你虚拟机的编号
qm set 101 --hookscript local:snippets/hookscript.sh

# 解绑脚本
qm set 101 --delete hookscript
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值