KVM单显卡直通系列教程 (一、Windows直通) 我的配置
CPU 13700k
主板 技嘉z690 aorus elite ax ddr4
显卡 技嘉6800xt超级雕
以太网卡 瑞昱RTL8125
BIOS设置
打开:VT-X
关闭:Resize Bar
安装Arch-Linux 使用官方教程安装:https://wiki.archlinux.org/title/installation_guide#top-page
安装必要软件 我的桌面环境kde-plasma,这部分也自己安装。
启用IOMMU 这部分Arch Linux的wiki也有很详细的步骤和问题解决方案。
地址:https://wiki.archlinux.org/title/PCI_passthrough_via_OVMF
我这里只写出我13700k+amd 6800xt的步骤。
首先在添加内核cmdline,我使用的grub引导,所以修改/etc/default/grub
,在GRUB_CMDLINE_LINUX_DEFAULT中加入intel_iommu=on iommu-pt。
1 2 3 4 5 6 7 8 9 [lyq1996@LYQArch ~]$ cat /etc/default/grub # GRUB boot loader configuration GRUB_DEFAULT=0 GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="Arch" GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet intel_iommu=on iommu=pt" GRUB_CMDLINE_LINUX=""
修改完成后,重新生成grub配置文件:
1 grub-mkconfig -o /boot/grub/grub.cfg
重启系统,使用root运行下面的脚本,检查iommu是否有效:
1 2 3 4 5 6 7 #!/bin/bash shopt -s nullglob for d in /sys/kernel/iommu_groups/*/devices/*; do n=${d#*/iommu_groups/*}; n=${n%%/*} printf 'IOMMU Group %s ' "$n" lspci -nns "${d##*/}" done
如果一切正确,脚本输出应该如下:
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 26 27 28 29 30 31 32 IOMMU Group 0 00:02.0 VGA compatible controller [0300]: Intel Corporation Raptor Lake-S GT1 [UHD Graphics 770] [8086:a780] (rev 04) IOMMU Group 10 00:1c.0 PCI bridge [0604]: Intel Corporation Alder Lake-S PCH PCI Express Root Port #1 [8086:7ab8] (rev 11) IOMMU Group 11 00:1c.2 PCI bridge [0604]: Intel Corporation Device [8086:7aba] (rev 11) IOMMU Group 12 00:1c.3 PCI bridge [0604]: Intel Corporation Device [8086:7abb] (rev 11) IOMMU Group 13 00:1c.4 PCI bridge [0604]: Intel Corporation Alder Lake-S PCH PCI Express Root Port #5 [8086:7abc] (rev 11) IOMMU Group 14 00:1f.0 ISA bridge [0601]: Intel Corporation Z690 Chipset LPC/eSPI Controller [8086:7a84] (rev 11) IOMMU Group 14 00:1f.3 Audio device [0403]: Intel Corporation Alder Lake-S HD Audio Controller [8086:7ad0] (rev 11) IOMMU Group 14 00:1f.4 SMBus [0c05]: Intel Corporation Alder Lake-S PCH SMBus Controller [8086:7aa3] (rev 11) IOMMU Group 14 00:1f.5 Serial bus controller [0c80]: Intel Corporation Alder Lake-S PCH SPI Controller [8086:7aa4] (rev 11) IOMMU Group 15 01:00.0 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD/ATI] Navi 10 XL Upstream Port of PCI Express Switch [1002:1478] (rev c1) IOMMU Group 16 02:00.0 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD/ATI] Navi 10 XL Downstream Port of PCI Express Switch [1002:1479] IOMMU Group 17 03:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Navi 21 [Radeon RX 6800/6800 XT / 6900 XT] [1002:73bf] (rev c1) IOMMU Group 18 03:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Navi 21/23 HDMI/DP Audio Controller [1002:ab28] IOMMU Group 19 04:00.0 Non-Volatile memory controller [0108]: Samsung Electronics Co Ltd NVMe SSD Controller PM9A1/PM9A3/980PRO [144d:a80a] IOMMU Group 1 00:00.0 Host bridge [0600]: Intel Corporation Device [8086:a703] (rev 01) IOMMU Group 20 05:00.0 Non-Volatile memory controller [0108]: KIOXIA Corporation NVMe SSD [1e0f:0009] (rev 01) IOMMU Group 21 07:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller [10ec:8125] (rev 05) IOMMU Group 22 08:00.0 Network controller [0280]: Intel Corporation Wi-Fi 6 AX200 [8086:2723] (rev 1a) IOMMU Group 23 09:00.0 Network controller [0280]: Broadcom Inc. and subsidiaries BCM4360 802.11ac Wireless Network Adapter [14e4:43a0] (rev 03) IOMMU Group 2 00:01.0 PCI bridge [0604]: Intel Corporation Device [8086:a70d] (rev 01) IOMMU Group 3 00:06.0 PCI bridge [0604]: Intel Corporation Device [8086:a74d] (rev 01) IOMMU Group 4 00:14.0 USB controller [0c03]: Intel Corporation Alder Lake-S PCH USB 3.2 Gen 2x2 XHCI Controller [8086:7ae0] (rev 11) IOMMU Group 4 00:14.2 RAM memory [0500]: Intel Corporation Alder Lake-S PCH Shared SRAM [8086:7aa7] (rev 11) IOMMU Group 5 00:15.0 Serial bus controller [0c80]: Intel Corporation Alder Lake-S PCH Serial IO I2C Controller #0 [8086:7acc] (rev 11) IOMMU Group 5 00:15.1 Serial bus controller [0c80]: Intel Corporation Alder Lake-S PCH Serial IO I2C Controller #1 [8086:7acd] (rev 11) IOMMU Group 5 00:15.2 Serial bus controller [0c80]: Intel Corporation Alder Lake-S PCH Serial IO I2C Controller #2 [8086:7ace] (rev 11) IOMMU Group 5 00:15.3 Serial bus controller [0c80]: Intel Corporation Alder Lake-S PCH Serial IO I2C Controller #3 [8086:7acf] (rev 11) IOMMU Group 6 00:16.0 Communication controller [0780]: Intel Corporation Alder Lake-S PCH HECI Controller #1 [8086:7ae8] (rev 11) IOMMU Group 7 00:17.0 SATA controller [0106]: Intel Corporation Alder Lake-S PCH SATA Controller [AHCI Mode] [8086:7ae2] (rev 11) IOMMU Group 8 00:19.0 Serial bus controller [0c80]: Intel Corporation Alder Lake-S PCH Serial IO I2C Controller #4 [8086:7afc] (rev 11) IOMMU Group 8 00:19.1 Serial bus controller [0c80]: Intel Corporation Alder Lake-S PCH Serial IO I2C Controller #5 [8086:7afd] (rev 11) IOMMU Group 9 00:1a.0 PCI bridge [0604]: Intel Corporation Alder Lake-S PCH PCI Express Root Port #25 [8086:7ac8] (rev 11)
可以看到,PCI设备被划分到了不同的IOMMU组里面。
获取需要直通的PCI设备的ID 根据上面的输出找到你要直通的PCI设备的ID,我这里直通显卡和显卡音频控制器,所以ID是1002:73bf和1002:ab28。
配置vfio模块加载时的行为 我选择modprobe.d加入配置来控制行为,使vfio-pci模块在加载的时候,通过pci设备id,绑定显卡和显卡音频控制器。
创建文件/etc/modprobe.d/vfio.conf
,写入一行:options vfio-pci ids=1002:73bf,1002:ab28 disable_vga=1
1 2 ➜ ~ cat /etc/modprobe.d/vfio.conf options vfio-pci ids=1002:73bf,1002:ab28 disable_vga=1
这里还有一种方式是在内核cmdline中加入vfio-pci.ids=1002:73bf,1002:ab28
,我不喜欢这种方式。
早期加载vfio驱动 这里是不需要早期加载的,因为是单显卡直通,宿主机也是需要用显卡的,所以我们选择在需要的时候,加载vfio驱动。
这里如果你宿主机不需要使用显卡,可以早期加载:
在initramfs阶段加载vfio,则需要把上面的.conf嵌入initramfs镜像,同时需要initramfs阶段加载GPU驱动,不然可能有问题。(不推荐,EFI(ESP、BOOT,随便你怎么叫)分区里的initramfs会膨胀)
在initramfs之后加载,则在modprobe.d/vfio.conf里面,把vfio设置为drm驱动的依赖,softdep drm pre: vfio-pci
,amd依赖drm,drm依赖vfio-pci。
安装虚拟机套件 1 sudo pacman -S qemu libvirt edk2-ovmf virt-manager dnsmasq
开机启动服务
1 2 sudo systemctl enable libvirtd sudo systemctl enable virtlogd.socket
开启libvirt
1 2 sudo systemctl start libvirtd sudo systemctl start virtlogd.socket
启动虚拟网络
1 2 sudo virsh net-start default sudo virsh net-autostart default
将用户加入libvirt组,解决一些权限问题。
1 2 3 sudo usermod -aG kvm lyq1996 sudo usermod -aG libvirt lyq1996 sudo usermod -aG input lyq1996
修改/etc/libvirt/qemu.conf
,修改qemu进程所属用户
1 2 user = lyq1996 group = libvirt
安装windows 11 打开virt manager,使用界面创建一个没有直通的windows,这里需要安装stpm
,然后给windwos添加一个tpm设备,否则安装不了windows 11.
导出rom 有些bios会修改显卡的vbios,破坏内存中的副本,所以需要导出显卡未修改的vbios,5000、6000不需要导出rom。
USB直通 选择鼠标、键盘。
显卡直通 在虚拟机管理器添加PCI设备。
配置libvirt的hook 在启动虚拟机时,使用hook脚本,将amd驱动卸载,关闭display-manager服务,同时加载vfio驱动,虚拟机便可以直通显卡。 在关闭虚拟机时,同理将amd驱动重新加载回来,启动display-manager服务,重新显示宿主机界面。
配置脚本:
1 2 3 4 5 6 7 8 9 10 11 [root@LYQArch hooks]# mkdir -p /etc/libvirt/hooks/qemu.d/你的虚拟机名/prepare/begin [root@LYQArch hooks]# mkdir -p /etc/libvirt/hooks/qemu.d/你的虚拟机名/release/end [root@LYQArch hooks]# cd /etc/libvirt/hooks [root@LYQArch hooks]# wget https://raw.githubusercontent.com/PassthroughPOST/VFIO-Tools/master/libvirt_hooks/qemu -O ./qemu [root@LYQArch hooks]# chmod +x ./qemu [root@LYQArch hooks]# wget -P /etc/libvirt/hooks/qemu.d/你的虚拟机名/prepare/begin/ https://gitlab.com/risingprismtv/single-gpu-passthrough/-/raw/master/hooks/vfio-startup.sh [root@LYQArch hooks]# chmod +x /etc/libvirt/hooks/qemu.d/你的虚拟机名/prepare/begin/vfio-startup.sh [root@LYQArch hooks]# wget -P /etc/libvirt/hooks/qemu.d/你的虚拟机名/release/end/ https://gitlab.com/risingprismtv/single-gpu-passthrough/-/raw/master/hooks/vfio-teardown.sh [root@LYQArch hooks]# chmod +x /etc/libvirt/hooks/qemu.d/你的虚拟机名/release/end/vfio-teardown.sh
此时目录结构如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 [root@LYQArch hooks]# tree . ├── qemu └── qemu.d └── win11 ├── prepare │ └── begin │ └── vfio-startup.sh └── release └── end └── vfio-teardown.sh 7 directories, 3 files
启动虚拟机 此时启动虚拟机即可。
进阶玩法
如果有核显,可以核显始终给Arch,然后使用parsec远程控制macOS、windows。这种情况建议直接早期加载vfio驱动,不需要hook脚本。
配好OpenCore,直通Nvme硬盘,一把梭哈,将原先物理系统迁移到虚拟机上。
cpu核心亲和性,把虚拟机绑定到8个大核心上。