NUC6CAY使用Proxmox实现核显直通和HDMI输出

使用环境说明

开启IOMMU分组功能

1
2
3
4
5
6
7
8
# 首先编辑GRUB配置文件中的GRUB_CMDLINE_LINUX_DEFAULT部分
vi /etc/default/grub

# NUC的J3455核显直通HDMI输出,AMD的CPU请将 intel_iommu=on 改为 amd_iommu=on
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on video=efifb:off,vesafb:off"

# 更新GRUB
update-grub

添加VFIO驱动支持

1
2
3
4
5
6
7
# 编辑如下文件添加后面内容
vi /etc/modules

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

禁用设备驱动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 编辑如下文件添加后面内容,依实际配置选择禁用的驱动
vi /etc/modprobe.d/blacklist.conf

# 禁用Intel核显驱动
blacklist snd_hda_intel
blacklist snd_soc_skl
blacklist snd_hda_codec_hdmi
blacklist i915

# 禁用Nvidia或AMD显卡驱动(根据你的机器决定)
# blacklist nouveau
# blacklist radeon

# 查看核显及集成声卡的设备ID
root@pve:~# lspci -nn
00:02.0 VGA compatible controller [0300]: Intel Corporation Device [8086:5a85] (rev 0b)
00:0e.0 Audio device [0403]: Intel Corporation Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series Audio Cluster [8086:5a98] (rev 0b)

# 把需要直通给虚拟机的设备ID也就是 [厂商ID:产品ID] 添加到vfio.conf
# 例如直通上面J3455处理器的核显及集成声卡,其他CPU自行去查找添加
echo "options vfio-pci ids=8086:5a85,8086:5a98" > /etc/modprobe.d/vfio.conf

# 更新内核后重启机器
update-initramfs -u
reboot

检查直通结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 先运行以下命令查看是否有输出,如无则IOMMU未开启成功
dmesg | grep -e DMAR -e IOMMU

# 检查VFIO模块是否正常加载,有类似回显说明正常
root@pve:~# lsmod | grep vfio
vfio_pci 53248 0
vfio_virqfd 16384 1 vfio_pci
irqbypass 16384 2 vfio_pci,kvm
vfio_iommu_type1 32768 0
vfio 32768 2 vfio_iommu_type1,vfio_pci

# 查看核显和声卡驱动是否绑定至VIFO
# 执行如下命令看最后Kernel driver in use是否为vfio-pci
# 如果为i915就说明之前没配置好,一般是i915的驱动没屏蔽成功
lspci -vvv -s 00:02.0
lspci -vvv -s 00:0e.0

设置核显直通

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 如果你不需要核显直通HDMI输出,那么直接在WEB界面添加PCI设备[0000:00:02.0]和[0000:00:0e.0]即可

# 下载VirtIO驱动和下载VGA Romfile(这个Romfile是核显直通HDMI输出的关键)
wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win.iso
mv virtio-win.iso /var/lib/vz/template/iso/

wget https://github.com/wanghuangjie/Perfect_PVE_3455/raw/master/j3455_hd500_5a85.bin
mv j3455_hd500_5a85.bin /usr/share/kvm/

# 先新建虚拟机并记住VMID,系统相关选项中BIOS为SeaBIOS、机器为i440fx
# 下面100代表创建虚拟机时分配的VMID,编辑配置文件增加以下行:vi /etc/pve/qemu-server/100.conf

args: -device vfio-pci,host=00:02.0,addr=0x02,x-igd-gms=1,romfile=j3455_hd500_5a85.bin
hostpci1: 00:0e.0,rombar=0
vga: none

# 然后插入HDMI显示器并开启虚拟机正常安装Win10并进入系统,注意先在PVE添加键鼠设备
# 最后安装VirtIO驱动和核显驱动,其中VirtIO驱动需要自行下载并添加到虚拟机中,安装好驱动后关机

无线网卡直通(可选)

  1. NUC6CAY默认无线和有线网卡在同一组内,直接直通无线网卡会导致有线网卡掉线
  1. PVE开启硬件PCIE直通需要开启IOMMU功能,默认Linux似乎是根据硬件所在的PCIE通道来分组的
  2. 内核源码中有个acs_override补丁可实现分组,但我们许多的硬件过不了补丁里的判断条件,所以导致IOMMU分组打了acs_override补丁也会失败
  3. 那么我们只能把这个补丁里面的某个判断去掉来强制开启acs_override
  4. 强制开启了acs_override后虽然IOMMU分组是完全打断了,但是如果某些功能确实硬件不支持,那么即使强制分了组使用起来也可能会有bug
  1. 强制开启acs_override补丁需要重新编译内核,下面提供一个网友修改编译后的内核

网友修改编译后的内核来源 | 自编译pve-kernel-5.4.73-1 提取码: dcgp

  1. 安装内核重启后即可发现IOMMU分组全都打断了,每一个硬件一个分组,只要不勾选全部功能即可分开直通
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 安装新内核前记得卸载旧内核
apt purge pve-kernel-5.4.73-1-pve

# 解压后安装修改编译后的内核
dpkg -i *.deb

# 在grub中默认的 [GRUB_CMDLINE_LINUX_DEFAULT] 中添加pcie_acs_override=downstream来分离IOMMU组(开启ACS补丁)
vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on pcie_acs_override=downstream video=efifb:off,vesafb:off"

# 可以修改grub中默认的 [GRUB_DEFAULT] 来更改启动后加载的内核版本
GRUB_DEFAULT="Advanced options for Proxmox Virtual Environment GNU/Linux>Proxmox Virtual Environment GNU/Linux, with Linux 5.4.73-1-pve"

# 更新GRUB
update-grub

其他问题

  1. 由于addr=0x02是虚拟机默认显卡地址,编辑虚拟机配置文件添加物理显卡后再为虚拟机添加虚拟显示会造成地址重复而报错,所以设置[vga: none]

kvm: -device vfio-pci,host=00:02.0,addr=0x02,x-igd-gms=1,romfile=j3455.bin: PCI: slot 2 function 0 not available for vfio-pci, in use by VGA TASK ERROR: start failed: QEMU exited with code 1

  1. 旧点的Win10系统如果安装2020年的新版驱动可能导致设备叹号,可安装的2019年版本的驱动 26.20.100.7212 试试

  2. PVE6.3去除订阅提醒

1
2
sed -Ezi.bak "s/(Ext.Msg.show\(\{\s+title: gettext\('No valid sub)/void\(\{ \/\/\1/g" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
systemctl restart pveproxy.service
  1. 切换国内源和添加社区源
1
2
3
4
5
6
7
8
rm /etc/apt/sources.list.d/pve-enterprise.list

cat > /etc/apt/sources.list << EOF
deb http://mirrors.ustc.edu.cn/debian buster main contrib
deb http://mirrors.ustc.edu.cn/debian buster-updates main contrib
deb http://mirrors.ustc.edu.cn/debian-security buster/updates main contrib
deb http://mirrors.ustc.edu.cn/proxmox/debian buster pve-no-subscription
EOF
  1. VirtIO镜像中文件夹对应的驱动
1
2
3
4
5
6
7
8
9
10
11
NetKVM/:	Virtio 网络驱动
viostor/: Virtio 块驱动
vioscsi/: Virtio SCSI驱动
viorng/: Virtio RNG驱动
vioser/: Virtio 串口驱动
Balloon/: Virtio 内存气球驱动
qxl/: 用于Windows 7及之前版本的QXL显卡驱动
qxldod/: 用于Windows 8及之后版本的QXL显卡驱动
pvpanic/: QEMU pvpanic 设备驱动
guest-agent/: QEMU Guest Agent 32bit 和 64bit 安装包
qemupciserial/: QEMU PCI 串口设备驱动