双显卡笔记本Linux+Windows终极解决方案
主力使用Linux已一月有余,逐渐探索出了最适合自己工作流与现有硬件的使用姿势,这篇博客将介绍本人目前在使用的Linux+Windows双系统终极解决方案
概要
参考:ArchWiki:PCI passthrough via OVMF 与 Looking Glass B6 documentation
本方案需要占用海量硬盘空间与内存,若与我有相同需求且有相似的硬件环境欢迎尝试与改进
本方案为在Linux下使用libvirt
与qemu-kvm
运行Windows虚拟机,透传显卡并通过HDMI假负载与Looking Glass
实现低延迟画面传输,使用SPICE
协议与USB 重定向
实现外设共享,本方案未实现剪贴板共享
软硬件需求
- 双显卡的笔记本/台式机
- 支持虚拟化的CPU
- 支持
iommu
的主板 - 建议不低于32GB内存,实际内存大小可取决于需求
- 原生支持UEFI的显卡
- 直连独立显卡的HDMI接口
- HDMI假负载 淘宝 3¥ 左右
- 一个临时使用的HDMI显示设备用于检测显卡透传是否成功(可选)
- 带有
kvm
,iommu
与vfio
模块的Linux内核 (实测 Arch 主线内核可用
软件准备
本博客基于 Arch Linux 进行演示
安装AUR软件包gpu-passthrough-manager
, 它会自行设置内核参数并根据需求设置iommu分组隔离
界面如图,选择需要透传的设备并LOAD_VFIO
重启后运行lspci -nnk
检查相应设备是否加载了vfio-pci
驱动
1 | 01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA106M [GeForce RTX 3060 Mobile / Max-Q] [10de:2560] (rev a1) |
运行lsmod | grep kvm
,若有kvm_intel/kvm_amd
则证明kvm正常开启
安装虚拟机
安装软件包qemu-desktop
, libvirt
, edk2-ovmf
, swtpm
, 与 virt-manager
。
启用libvirtd.service
与virtlogd.socket
并重启
在virt-manager
中新建QEMU/KVM
虚拟机,系统选择为Windows11,CPU核心与内存大小按需分配,启动前编辑设置添加对应的PCI设备,如下图
正常启动,安装系统,进入系统,激活系统,安装nvidia显示驱动,驱动安装完成后即可在设置中看到两个显示器,一个为QXL显卡SPICE协议的qemu监视器,另一个为直连透传显卡的HDMI假负载显示器
配置Looking Glass
关闭虚拟机,启用virt-manager的xml编辑选项
编辑虚拟机的xml配置文件,在<device>
段内添加以下内容,添加ivshmem设备
1 | <shmem name='looking-glass'> |
其中<size>
大小需根据自身需求调整,可参考官网表格
Resolution | Size (M) |
---|---|
1920x1080 | 32 |
3840x2160 | 128 |
现阶段不推荐使用Looking Glass显示HDR,以上数据均不含HDR元数据
使用systemd-tmpfiles
设置权限,新建/etc/tmpfiles.d/10-looking-glass.conf
并填入以下内容
1 | #Type Path Mode UID GID Age Argument |
确保有一个<graphics type='spice'>
设备来使用外设透传与USB重定向
将<video>
设备更改为<model type=vga/>
删除<input type='tablet'/>
设备
添加<input type='mouse' bus='virtio'/>
与<input type='keyboard' bus='virtio'/>
两个输入设备
添加Intel HDA音频设备
1 | <sound model='ich9'> |
保存xml,重启宿主机
启动虚拟机,下载安装Looking Glass Windows Host服务端 Looking Glass - Downloads
在宿主机安装Looking Glass Client, Arch Linux可直接在AUR下载安装
重启虚拟机,在宿主机终端中运行looking-glass-client -a
,即可自动连接虚拟机并自动适应分辨率
最终实现效果:
还可根据文首的Looking Glass官方文档进行个性化设置,如剪贴板共享等