PVE直通SATA控制器给群晖的时候,发现网卡、USB、SATA控制器都在一个IOMMU上。
直通完了,PVE直接失联了。这肯定不行。百度了一下说是要编译内核把IOMMU拆开。下面记录一下编译内核的过程。
准备编译环境
我直接用pve物理机编译,怕破坏环境的话,可以在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内核源码
建议全程挂梯子,不然下载很慢,整个仓库拖下来大概是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了。