Arch Linux单显卡直通教程(一、Windows直通)
lyq1996

KVM单显卡直通系列教程 (一、Windows直通)

我的配置

  1. CPU 13700k
  2. 主板 技嘉z690 aorus elite ax ddr4
  3. 显卡 技嘉6800xt超级雕
  4. 以太网卡 瑞昱RTL8125

BIOS设置

  1. 打开:VT-X
  2. 关闭:Resize Bar

安装Arch-Linux

使用官方教程安装:https://wiki.archlinux.org/title/installation_guide#top-page

  • TIPS: 别忘了安装显卡驱动

安装必要软件

我的桌面环境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驱动。

这里如果你宿主机不需要使用显卡,可以早期加载:

  1. 在initramfs阶段加载vfio,则需要把上面的.conf嵌入initramfs镜像,同时需要initramfs阶段加载GPU驱动,不然可能有问题。(不推荐,EFI(ESP、BOOT,随便你怎么叫)分区里的initramfs会膨胀)
  2. 在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

启动虚拟机

此时启动虚拟机即可。

进阶玩法

  1. 如果有核显,可以核显始终给Arch,然后使用parsec远程控制macOS、windows。这种情况建议直接早期加载vfio驱动,不需要hook脚本。
  2. 配好OpenCore,直通Nvme硬盘,一把梭哈,将原先物理系统迁移到虚拟机上。
  3. cpu核心亲和性,把虚拟机绑定到8个大核心上。
 评论
评论插件加载失败
正在加载评论插件
由 Hexo 驱动 & 主题 Keep
本站由 提供部署服务
访客数 访问量