PVE直通SATA控制器给群晖的时候,发现网卡、USB、SATA控制器都在一个IOMMU上。

image-20230630095234882

直通完了,PVE直接失联了。这肯定不行。百度了一下说是要编译内核把IOMMU拆开。下面记录一下编译内核的过程。

准备编译环境

我直接用pve物理机编译,怕破坏环境的话,可以建个Ubuntu、Debian虚拟机编译。

首先换国内源,加速依赖安装效率

安装编译需要的依赖:

1
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 libssl-devlibtool lintian lz4 perl-modules rsync sphinx-common xmlto zlib1g-dev dwarves net-tools htop vnstat

上面的依赖不一定全,如果编译的时候遇到找不到模块,再install一下缺的模块就行。

下载PVE内核源码

pve-kernel

建议全程挂梯子,不然下载很慢,整个仓库拖下来大概是5个G左右。

找到自己要构建的版本的分支或者commitid。

1
2
3
git clone --recursive https://git.proxmox.com/git/pve-kernel.git
# 切换到对应的分支
git checkout <commit-id>

修改补丁文件

进入patches/kernel/0004-pci-Enable-overrides-for-missing-ACS-capabilities-4..patch,不同版本名字可能不一样,找ACS-capabilities字样的就可以了。

使用文本编辑工具,或者VIM 打开修改内容。

找到这三行:

1
2
3
+	if (!pci_is_pcie(dev) ||
+ pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ACS))
+ return -ENOTTY;

替换成这三行

1
2
3
+	if (!pci_is_pcie(dev))
+ return -ENOTTY;
+

替换过程行数不要变。变了的话需要修改git patch文件前面的替换行数信息。

image-20230630100634375

开始编译

cd到pve-kernel文件夹下,执行make命令就行了。

编译时间看机器性能,我的R5 5600g构建一次需要1个小时的样子。

编译完了就会在当前目录生成几个deb包,使用dpkg -i *.deb就可以安装内核了,安装完重启就行了。

如果是内核降级,还需要去更新GRUB引导配置,这个网上有很多教程。

重启后IOMMU分组已经OK了。

image-20230701174451281

构建好的内核下载

本次构建耗时半天,主要是下载源码花了很多时间,实际构建时间40分钟,下面是构建好的内核版本6.2.16-3.

构建源码commitId:2e2ec4e2833979cfed901c13d1ca7ef4e7f981a0

基于PVE8.0版本内核,修改了IOMMU分组构建。有需要的可以直接下载构建好的包。

链接: https://pan.baidu.com/s/13Mb7zVPncF-7kE61k8xjVQ?pwd=j329 提取码: j329