介绍
这是我的单显卡直通配置过程,我在多个不同配置的电脑上都试过,这个方法都成功了。
我这里讲的是AMD处理器(英特尔的也差不多,个别参数会不一样); 系统是Arch Linux, 如果是其它发行版一些软件名和文件位置可能会不太一样。
可以配合视频教程操作,Bibibili/YouTube链接:
或者加入我们的QQ群:689962825
还在编辑中,如果能力,请帮我完善、修订、添加更多内容!
本人是一名半工半读的学生,如果你觉得我的视频和教程有用,请考虑支持我! 可以通过Paypal给我捐赠:
或者选择在微信上给我打赏(标注VFIO),非常感谢!
更新日期:2022年04月26日
- 文档更新
- 开启评论区
电脑配置
- 处理器: AMD 锐龙 5800x 8核
- 显卡: 微星 GeForce RTX 3070 GAMING X TRIO 8G
- 主版:玩家国度 ROG Strix B550-A GAMING White 吹雪
- 内存: 16GB 3600Mhz 双通道
- 系统: Arch Linux 5.16
- 桌面环境: KDE Plasma 5.23 X11
!!要求!!
- 一个四核或更多的AMD64或英特尔x86-64处理器,支持硬件虚拟化。
- 8GB双通道内存或者更多, 不然不够分给客户机。
- 64GB固态盘空间或更多(macOS至少需要64GB,不然不允许安装)。
- 一块独立显卡,至少支持DirectX 11
- 核显/集显不建议,成功率较低,而且直通和不直通比没有太大的性能差异,如果想尝试参见Intel GVT-g。
- 大部分在Big Navi之前的AMD显卡有重置Reset Bug, 可使用vendor-reset修复。
- 若想使用macOS客户机,请使用AMD显卡(英伟达支持就是个笑话),及英特尔处理器(AMD处理器没有苹果官方支持,会有bug)。
- 发行版不一定要用Arch系的,不过不同发行版个别命令可能会不太一样,建议使用一个较新的发行版,不然内核的KVM会太低。
- 笔记本不建议,硬件较为封闭,跟常规桌面端不太一样。
步骤
配置一个简单的KVM
启用IOMMU
- 重启进入UEFI/BIOS固件设置,开启IOMMU和虚拟化。通常在CPU高级选项里面,AMD处理器的一般叫Virtualization Technology或AMD-Vi,英特尔的叫VT-x或VT-d。
- 添加下列内核参数到启动器,详情戳这里,保存然后重启。
- AMD处理器(根据BIOS设置默认已启用?):
amd_iommu=on
- 英特尔处理器:
intel_iommu=on
- 可视情况添加(修复或导致黑屏):
iommu=pt
- AMD处理器(根据BIOS设置默认已启用?):
- 重启后,看看启动日志检查一下IOMMU是否已启用,使用超级用户权限运行
dmesg | grep -e DMAR -e IOMMU
找找有没有 amd_IOMMU:Detected
或者 Intel-IOMMU: enabled
类似的信息。
检查IOMMU组是否有效
用超级用户运行这串代码(来自Arch Wiki),或者 可以运行这个脚本(更好看一点)
小贴士:不要随便运行那些你不懂的代码!
shopt -s nullglob
for g in `find /sys/kernel/iommu_groups/* -maxdepth 0 -type d | sort -V`; do
echo "IOMMU Group ${g##*/}:"
for d in $g/devices/*; do
echo -e "\t$(lspci -nns ${d##*/})"
done;
done;
, 看看显卡是不是在自己的一个组里面。
IOMMU group 16
0a:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Baffin [Radeon RX 550 640SP / RX 560/560X] [1002:67ff] (rev cf)
Driver: amdgpu
0a:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Baffin HDMI/DP Audio [Radeon RX 550 640SP / RX 560/560X] [1002:aae0]
Driver: snd_hda_intel
复制一下,先保存下来。
添加VFIO到内核模块
新建并打开/etc/modprobe.d/vfio.conf
,在里面添加:
options vfio-pci ids=1002:67ff,1002:aae0
options vfio-pci disable_idle_d3=1
options vfio-pci disable_vga=1
ids=后面应该是刚才查看的显卡的那些id,每个值之间用,
隔开
安装需要的组件
如果是Arch系(除了Artix),安装下列包
qemu libvirt edk2-ovmf virt-manager dnsmasq ebtables iptables bridge-utils gnu-netcat
安装iptables
和ebtables
会询问是否要替换掉iptables-nft
,y
确定,因为目前QEMU尚未更新,还依赖于老的那些网络组件。
启用服务
启动Libvirtd:(Systemd)
systemctl start libvirtd
设为开机自启:
systemctl enable libvirtd
启动默认虚拟网络(NAT)
virsh net-start default
设为开机自启:
virsh net-autostart default
现在可以打开虚拟机管理器,安装一个非直通的虚拟机了。
安装一个非直通的虚拟机
这里讲的是Windows 10,是个好的开始,建议弄完这个成功后再去尝试Windows 11或者macOS。
下载镜像
- Windows 10的正版镜像可以直接从微软官网下载,不过还是需要购买激活码。
- (可选)为了提高性能,可以从红帽网站下载安装Virtio Windows驱动,支持Windows XP至Windows 11。(Linux客户机不需要,已经自带)
将它们保存找的到的地方,最好放在/Home
里面。
创建虚拟机
QEMU/KVM -> 新建虚拟机 -> 本地安装介质,下一步
浏览并选择已下载的Windows 10安装镜像,下一步
客户机内存怎么分配都行,最好给宿主机留1/4的内存(比如8GB分6GB留2GB,16GB分12GB留4GB),CPU数可以待会儿改,下一步
默认为虚拟机启用存储(存储磁盘镜像建议放在
/Home
下面),下一步设置客户机名称,默认是
win10
,可以改,不过以后需要修改脚本,!!选择在安装前自定义配置!!
基本客户机配置
概况(!!这个一定要现在设置好,不然以后就很难改了!!)
- 芯片组:
Q35
- 固件:
ovmf_code.fd
(不需要secboot和csm)
- 芯片组:
CPU数
- vCPU分配数,根据拓扑设置(套接字x核心x线程)
- 配置: 一般选择
host-model
或者host-passthrough
(host-passthrough
有时候可能会导致AMD处理器性能损耗严重?) - 拓扑:
- 套接字(翻译错误?),插槽:几个处理器,大部分人就1个
- 核心:分配给客户机几个核心(正常一点,比如2核,4核,6核,8核等等),最少留给宿主机1/4的总核心数
- 线程:每个分配的核心有几个线程(根据你实体的处理器来,如果有超线程就设2,没有设1)
引导选项
- 选择
SATA CDROM 1
(Windows 10的安装镜像)
- 选择
SATA 磁盘 1(客户机的存储空间)
- (可选,理论上提升磁盘性能%300)把
SATA
改成VirtIO
- (可选,理论上提升磁盘性能%300)把
NIC(客户机网络)
- 网络源:
默认NAT
就行(可根据个人需求设置桥接网络,不要使用macvtap
- 设备型号:可以改成VirtIO提高性能(需要安装VirtIO驱动)
- IP地址:第一次启动后会自动生成
- 网络源:
然后选择 添加硬件 -> 存储 -> 选择或添加自定义存储,浏览并添加已下载的Virtio win驱动镜像,设备类型改成CDROM设备
最后检查一下,开机安装Windows就行了!
其它资源
- Arch Wiki PCI passthrough
- GitLab RisingPrismTV’s script