PVE直通SATA控制器给群晖的时候,发现网卡、USB、SATA控制器都在一个IOMMU上。
直通完了,PVE直接失联了。这肯定不行。百度了一下说是要编译内核把IOMMU拆开。下面记录一下编译内核的过程。
准备编译环境
我直接用pve物理机编译,怕破坏环境的话,可以建个Ubuntu、Debian虚拟机编译。
首先换国内源,加速依赖安装效率,网上很多教程。
安装编译需要的依赖:
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。
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 打开修改内容。
找到这三行:
+ if (!pci_is_pcie(dev) ||
+ pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ACS))
+ return -ENOTTY;
替换成这三行
+ if (!pci_is_pcie(dev))
+ return -ENOTTY;
+
替换过程行数不要变。变了的话需要修改git patch文件前面的替换行数信息。
开始编译
cd到pve-kernel文件夹下,执行make命令就行了。
编译时间看机器性能,我的R5 5600g构建一次需要1个小时的样子。
编译完了就会在当前目录生成几个deb
包,使用dpkg -i *.deb
就可以安装内核了,安装完重启就行了。
如果是内核降级,还需要去更新GRUB引导配置,这个网上有很多教程。
重启后IOMMU分组已经OK了。
构建好的内核下载
本次构建耗时半天,主要是下载源码花了很多时间,实际构建时间40分钟,下面是构建好的内核版本6.2.16-3.
构建源码commitId:2e2ec4e2833979cfed901c13d1ca7ef4e7f981a0
基于PVE8.0版本内核,修改了IOMMU分组构建。有需要的可以直接下载构建好的包。
链接: https://pan.baidu.com/s/13Mb7zVPncF-7kE61k8xjVQ?pwd=j329 提取码: j329