惠普 SL250s Gen8 服务器编译PVE内核通过禁用RMRR来实现pcie直通

说明:本文非详细教程,仅作为留存使用

本文内容是解决部分惠普服务器在PVE环境下不能直通设备的问题,解决办法是编译PVE内核,禁用RMRR (Reserved Memory Region Reporting)检查来实现pcie直通,这样的做法有一定风险,如果有更好的解决方案不推荐尝试此方案。

Red Hat关于RMRR的白皮书:

https://access.redhat.com/sites/default/files/attachments/rmrr-wp1.pdf

提醒:安装内核存在风险,请谨慎操作

前段时间入手了一台惠普 SL250s Gen8服务器,打算将显卡直通给虚拟机,再通过Gefroce Experience上的shield功能作为游戏串流服务器使用,不料遇到了很多问题,一开始的方案是使用ESXi6.7u3的系统开启pcie直通,直通后无法启动虚拟机,没有看到报错,问题表现为启动虚拟机后立刻关机,排查不出问题所在,换用HPE版的ESXi6.7u3系统后正常,但是想要实现shield串流功能,必须要使用独立显卡(这里使用的是1060 5G)输出才能实现,在ESXi平台尝试了很多办法,发现好像大家都没有类似的需求,非常让人头疼,于是转用Proxmox平台,之前有使用过ProxmoxVE成功直通显卡的经验(尽管不能使用自带的控制台),这里使用的系统版本是6.0-4,那就开始吧。

第一步、检查BIOS设置中的VT-D和Video Options

在bios中将VT-d设置为Enabled

把Video Options设置为Embedded Video Primary,Optional Video Secondary(不然PVE会用独显输出)

image-20191105172145849

image-20191105172224768

Video Options设置

第二步、开启IOMMU

编辑 / etc / default / grub

找到GRUB_CMDLINE_LINUX_DEFAULT =“ quiet”

改成GRUB_CMDLINE_LINUX_DEFAULT =“ quiet intel_iommu = on video = efifb:off”

然后执行update-grub

编辑/etc/modules

在最下面几行添加

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

一个一行,写入后保存退出,重启主机

第三步、新建一个Debian虚拟机用于编译内核

在PVE上创建一个Debian虚拟机或者使用本地机器去编译内核,安装过程我就省略啦,可以选择一个国内源,我自己安装的时候选择的是一起安装GNOME和一般常用组件,实际上如果只是为了编译内核只安装core和sshserver就差不多啦,因为是用来编译内核的,建议给根目录分配100G以上空间

第四步、在Debian上安装编译环境

首先先导入GPG密钥

wget -qO - http://download.proxmox.com/debian/proxmox-ve-release-6.x.gpg | sudo apt-key add -

然后添加Proxmox VE存储库:

echo "deb http://download.proxmox.com/debian/pve buster pve-no-subscription" | sudo tee /etc/apt/sources.list.d/pve-install-repo.list

编译环境需要的软件比较多,实际上我也并不熟悉,这里列出我这次使用的软件吧

apt-get update 

apt-get install git nano screen patch fakeroot build-essential devscripts libncurses5 libncurses5-dev libssl-dev bc flex bison libelf-dev libaudit-dev libgtk2.0-dev libperl-dev asciidoc xmlto gnupg gnupg2 rsync lintian debhelper libdw-dev libnuma-dev libslang2-dev sphinx-common asciidoc-base automake cpio dh-python file gcc kmod libiberty-dev libpve-common-perl libtool perl-modules python-minimal sed tar zlib1g-dev

如果没有导入PVE的GPG密钥,可能会导致无法安装libpve-common-perl

第五步、创建内核补丁

一般情况下我们还是会选择在/usr/src目录下编译内核,因为最新版内核我总是编译失败,所以选择了5.0.21-2版本来制作patch

cd /usr/src/
git clone git://git.proxmox.com/git/pve-kernel.git
cd ./pve-kernel/
git reset --hard 9a85bc6293ad2efb2930dde2b7123b1e008af11a
make

此处的make会自动调用线程,不需要加其他参数。会下载ubuntu-disco的内核源码,网络不好的话需要很长时间,推荐扶墙之后再编译,通过国内的网络去下载还是太慢了,一共2G左右。

当你看到这句话的时候

image-20191105172344711

正克隆到 '/usr/src/pve-kernel/submodules/zfsonlinux'...

按ctrl+c终止

image-20191105172410683

然后编辑/usr/src/pve-kernel/submodules/ubuntu-disco/drivers/iommu/intel-iommu.c

在5072行找到(不同版本可能不一样)

if (device_is_rmrr_locked(dev)) {
                dev_warn(dev, "Device is ineligible for IOMMU domain attach due to platform RMRR requirement.  Contact your platform vendor.\n");
                return -EPERM;

修改成

 if (device_is_rmrr_locked(dev)) {
                dev_warn(dev, "Device is ineligible for IOMMU domain attach due to platform RMRR requirement.  Patched.\n");

也就是去掉最后一行,修改的描述可以帮助你判断补丁是否成功,可以不改

另存到/usr/src/pve-kernel/submodules/ubuntu-disco/drivers/iommu/intel-iommu.c1

然后执行

diff -u /usr/src/pve-kernel/submodules/ubuntu-disco/drivers/iommu/intel-iommu.c /usr/src/pve-kernel/submodules/ubuntu-disco/drivers/iommu/intel-iommu.c1 > /usr/src/pve-kernel/patches/kernel/remove_rmrr_check.patch

编辑/usr/src/pve-kernel/patches/kernel/remove_rmrr_check.patch

前面两行修改成图示的样子,时间的不一致可以忽略

第六步、重新编译并安装

cd /usr/src/pve-kerne
make

如果编译顺利那么会在pve-kernel目录下得到4个.deb文件,把这四个文件发送到Proxmox系统的/root/目录下然后使用dpkg -i .deb命令安装即可,为文件名,安装后重启即可。

如果还是不能直通,那可能是其他问题了,也许是我在某个地方打错了字或忘记了一些东西,也可能是此方法已经过时。

作者:手残的拾君 www.bilibili.com/read/cv3899236

评论

Feng

登录过222天


河北地质大学(本科)
分享&发布