原创文章,转载请注明出处
https://qiedd.com/

0x00 简介

在 PVE 直通时, 即使在 grub 中设置了 pcie_acs_override=downstream 或者 pcie_acs_override=downstream,multifunction
还是会出现多个设备在同一个 iommu 组中, 这时候直通了设备, 会导致同组的设备失联, 这时候只能去编译内核

0x01 内核编译

我这里的版本上 PVE 8.0.3

# 如果你现在是 root 用户, 请先创建一个 user
useradd -m -g users -s /bin/bash pve

# 如果没有 sudo 请安装
apt install sudo -y

# 设置的你的用户密码
passwd pve

# 进入用户组
su pve

# 进入用户文件夹
cd

# 安装依赖
sudo apt install devscripts asciidoc-base automake bc bison cpio dh-python bison flex git kmod libdw-dev libelf-dev libiberty-dev libnuma-dev libpve-common-perl libslang2-dev lintian lz4 perl-modules rsync sphinx-common xmlto zlib1g-dev dwarves net-tools htop vnstat libpve-common-perl python3-dev -y

# 下载源码, 记得挂梯子
git clone --recursive https://git.proxmox.com/git/pve-kernel.git

# 修改补丁
cd pve-kernel
vim patches/kernel/0004-pci-Enable-overrides-for-missing-ACS-capabilities-4..patch

## 修改 159 行的代码, 由于删除了一行, 你需要加多一行, 另外注意括号
## 原代码
+	if (!pci_is_pcie(dev) ||
+		pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ACS))
+			return -ENOTTY;

## 修改后
+       if (!pci_is_pcie(dev))
+               return -ENOTTY;
+

# 直接编译, 有自动检测线程, 编译时间基于机器性能
make

# 安装内核
dpkg -i *.deb

0x02 Grub 修改

# 你的 gurb 配置应该长这样, intel 的记得自己修改
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt pcie_acs_override=downstream,multifunction"
# 更新 grub
update-grub

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

# 重启
reboot

# 查看内核版本
uname -a

## 输出
Linux PVE 6.5.3-1-pve #1 SMP PREEMPT_DYNAMIC PMX 6.5.3-1 (2023-10-23T08:03Z) x86_64 GNU/Linux

## 刷新一下 web

0x03 懒狗版

# (optional) install wget
apt install wget -y

# (optional) create a folder
mkdir pve-kernel

# (optional) cd to the floder
cd pve-kernel

# download the file
wget https://dl.qiedd.com/Linux/pve-kernel/6.5.3-1.tar.gz

# extract the file
tar xvf 6.5.3-1.tar.gz

# install the modified kernel
dpkg -i *.deb

# reboot the system
reboot

# check the kernel
uanme -a

## output
Linux PVE 6.5.3-1-pve #1 SMP PREEMPT_DYNAMIC PMX 6.5.3-1 (2023-10-23T08:03Z) x86_64 GNU/Linux

12 条评论

undefined · 2023年12月16日 上午1:42

其实这样修改纯掩耳盗铃,页面显示是分组了,实际上强制直通反而不稳定,其实ACS补丁那串代码就是为了把不是直连CPU的PCIE分在一起。实测PVE 8.1.3,打了这样修改的内核后(内核版本6.5.3-1),群晖时不时报重启警告(甚至没有使用强制拆分的网卡,其他虚拟机也没有使用),换回原本的6.5.11-7-pve内核就没事了,而且就算你把这网口直通给不同虚拟机,也会有奇奇怪怪的问题,像我之前PVE7.2版本时候,内核大概是6.1左右(不知道这个内核也是不是这样修改),把3个口分别给不同虚拟机后,其中一个口插上直接全屋网络断网任何设备无法获取IP(环路了),群晖那个口过一段时间后外网访问就变得很慢,排除主路由与反向代理后(甚至把NPM换成了lucky也无济于事),才发现是这个网口问题。实际想解决目前还是要从硬件搞起(或者未来的ACS补丁可以把连接PCH芯片组的设备拆的更多点),要么换服务器级主板,要么你有几个PCIE的要拆分就买对应数量PCIE是直连CPU的主板,但是目前像Z590这种也就2条PCIE是直连CPU的,Z790那种更新的可能多点?但是性价比太低了,所以只能取舍,像我现在是10400+微星B460M,第二条PCIE x16是芯片组分出来的,只有第一条直连CPU,但是还好开启ACS补丁后,第二条PCIE x16是跟板载网卡分组在了一起(SATA控制器跟USB的分组倒是分开了),后来我直接把四口网卡插第一条PCIE拆分,然后把第二条的PCIE x16显卡与板载网卡一起直通给群晖,目前测试暂时没问题。当然不排除是PVE内核版本与群晖不兼容?但是PVE有PVE的内核版本,群晖有群晖的内核版本,2者关系应该不大?,总之查阅PVE论坛后得出的结论就是ACS补丁都拆不了的,就不要去搞了。

    dlutwang · 2023年12月25日 下午3:14

    擦,拆分完了以后过段时间直通网卡失效,原来是这个问题,,,感谢指点。暂时先不折腾了。

      dlutwang · 2023年12月26日 下午2:56

      之前PVE 8.0.4用懒狗版可以拆分,今天发现群晖死机,直接升级PVE到8.1.3,内核升级到官方版本Linux 6.5.11-7-pve (2023-12-05T09:44Z)了,重启发现居然350T4还是分组拆分的。后面再观察看看是否有问题。

dlutwang · 2023年12月20日 下午3:56

感谢楼主,使用懒狗版把M920x的i350T4成功分组,之前都是在一个组,自己又不想编译,感谢。

tomot · 2024年1月15日 下午4:27

pve已经是6.5.11.7了,按照楼主的步骤没有报错,系统重启后并没有显示为6.5.3.1,分组也没变化,amd的主机

    Lordpenguindd · 2024年1月15日 下午4:29

    你原本的内核太新了,安装这个内核系统默认还是用 6.5.11.7

    1. 更新启动顺序
    2. 删除 6.5.11.7
    3. 自己编译(推荐)

Linkreal · 2024年1月30日 上午11:09

请教博主,如果我现在已经是6.5.11.7内核,我自己编译相同版本行吗,如果编译出来了,该怎么安装呢,正常安装步骤就能够替换吗,还是会被系统认为没有区别,拒绝更新呢?感谢

    Lordpenguindd · 2024年1月30日 下午4:51

    正常安装就行, 主要是系统有多个内核, grub 在启动时会默认启动第一个, 如果你装的内核不在第一个的话, 改下默认选项就行

lightson · 2024年4月15日 下午1:12

用了懒狗版,后PVEsyslog里面提示Loaded bpfilter_umh bpfilter: read fail 0,不知道怎么处理,请博主帮忙看下,谢谢

· 2024年4月15日 下午4:41

博主您好,懒狗版,在dpkg -i *.deb后报错这个 linux-tools-6.5 linux-tools-6.5-dbgsym,然后6.5.3的内核就没有安装上,可否问下怎么解决。另外自编有,在vim patches/kernel/0004-pci-Enable-overrides-for-missing-ACS-capabilities-4..patch的时候提示找不到该文件。

lightson · 2024年4月15日 下午4:58

Errors were encountered while processing:
linux-tools-6.5
linux-tools-6.5-dbgsym

懒狗版dpkg后提示这个,咋解决啊博主

发表回复

Avatar placeholder

您的邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据