说明:本文非详细教程,仅作为留存使用
本文内容是解决部分惠普服务器在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设置为Enabled
把Video Options设置为Embedded Video Primary,Optional Video Secondary(不然PVE会用独显输出)
Video Options设置
编辑 / 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
一个一行,写入后保存退出,重启主机
在PVE上创建一个Debian虚拟机或者使用本地机器去编译内核,安装过程我就省略啦,可以选择一个国内源,我自己安装的时候选择的是一起安装GNOME和一般常用组件,实际上如果只是为了编译内核只安装core和sshserver就差不多啦,因为是用来编译内核的,建议给根目录分配100G以上空间
首先先导入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左右。
当你看到这句话的时候
正克隆到 '/usr/src/pve-kernel/submodules/zfsonlinux'...
按ctrl+c终止
然后编辑/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