https://www.bilibili.com/video/BV1WN411Y7ui
这个视频演示了直通显卡到虚拟机,然后把显卡的画面又通过looking-glass传回到物理机
玩游戏还是偶尔会卡的 看来估计还是要用额外的显示器接显卡去显示
https://zhuanlan.zhihu.com/p/428845384
2023.3 looking-glass已经更新了B6版本,添加了音频支持,不需要scream了,文中一部分内容已过时,仅供参考。建议使用最新版本。 KVM配置显卡直通后,若不想在独显上另接显示器,可使用looking-glass将显卡画面串流至本机显示。本文主要是looking-glass、scream以及附加的evdev键鼠的配置(我用的Manjaro不需要手动编译软件,其它发行版编译安装参考官网手册即可) [color=inherit !important]软件官网手册looking-glass.io/docs/stable/
前置配置系统环境:冥王峡谷+manjaro21.1.5 KVM配置好显卡直通,虚拟机内已可识别到显卡 使用libvirt进行虚拟机管理(virt-manager),配置文件基于WIN10默认 第一步编辑虚拟机XML配置文件,在部分中添加 IVSHMEM 设备: <shmem name='looking-glass'> <model type='ivshmem-plain'/> <size unit='M'>32</size></shmem>
注意配置文件的缩进对齐,32MB显存适用1080P分辨率 把原来SPICE使用的QXL显卡配置改为none(冥王峡谷上若虚机存在QXL显卡,关闭/重启虚机会导致宿主机卡死) 移除 EvTouch USB 图形数位板 设备,仅保留一套键鼠设备即可 虚拟机spice服务器设置监听本地主机地址,固定端口号(默认5900) 第二步在宿主机中创建 IVSHMEM 设备,使用systemd-tmpfiles自动生成文件 创建 /etc/tmpfiles.d/10-looking-glass.conf 文件,填入以下内容: #Type Path Mode UID GID Age Argumentf /dev/shm/looking-glass 0660 <这里填写系统用户名> kvm -
重启宿主机后自动生成文件 第三步宿主机安装looking-glass-client(AUR源里有) 虚拟机系统用设备管理器安装 [color=inherit !important]IVSHMEM设备驱动fedorapeople.org/groups/virt/virtio-win/direct-downloads/upstream-virtio/

红线标出的是安装前的设备名,安装完成后变成IVSHMEM设备安装完成后建议重启下虚拟机,虚拟机启动完成之后在宿主机终端执行looking-glass-client连接虚机显示,建议使用-F参数全屏启动(鼠标定位更准确) 优化配置- 虚拟机建议关闭提高鼠标精确度,或者直通鼠标进虚拟机
- 虚拟机建议开启远程桌面(虚机启动后先远程连接再启动looking-glass连接的话,looking-glass会与远程桌面显示一样的内容;若先启动looking-glass连接后远程连接的话,looking-glass会话与远程桌面互斥)
- GNOME桌面创建应用程序启动条目后,可指定在某个工作区启动(配置GNOME扩展的Auto Move Windows)
声音功能配置QEMU声卡设备是无法使用的(与型号无关),使用scream虚拟声卡 1. 虚拟机配置里删除默认的声卡设备,可以单独创建一个隔离的虚拟机网桥用于声音传输,我这里直接共用主机网络。 2. 虚拟机内安装scream软件,注意可能出现驱动签名问题 3. 创建宿主机looking-glass-client启动快捷方式,示例: [Desktop Entry]Name=looking-glass-clientComment=A client application for accessing the LookingGlass IVSHMEM device of a VMCategories=Network;RemoteAccess;TryExec=/usr/bin/looking-glass-clientExec=looking-glass-clientIcon=/usr/share/icons/hicolor/scalable/apps/looking-glass.svgTerminal=falseType=Application
源码包内提取的图标文件修改权限放入指定文件夹后重启桌面环境(这里是GNOME)生效:
chown root:root looking-glass.*chmod 644 looking-glass.*cp looking-glass.png /usr/share/icons/hicolor/256x256/apps/cp looking-glass.svg /usr/share/icons/hicolor/scalable/apps/
创建配置文件~/.looking-glass-client.ini:
[win]fullScreen=yesignoreQuit=yesnoScreensaver=yesalerts=yes
- scream的启动命令scream -i virbr0;这里virbr0对应虚机音频输出所在网桥,可以创建systemd服务让它开机自启动:
nano ~/.config/systemd/user/scream.service#可能需要手动创建路径#@[Unit]Description=A Scream audio receiver using Pulseaudio, ALSA or stdout as audio outputAfter=network-online.targetAfter=pulseaudio.service[Service]Type=simpleExecStart=/usr/bin/scream -i virbr0#!下面这部分写法&用法无效,无法实现登录自启动服务#ExecStop=kill -9 `ps -ef | grep 'scream -i virbr0' | awk '{print $2}'`##[Install]#WantedBy=graphical.target#@#systemctl --user enable scream.servicesystemctl --user daemon-reload
然后把looking-glass-client启动条目文件中EXEC字段改为Exec=sh -c "systemctl --user restart scream.service;looking-glass-client;wait;systemctl --user stop scream.service",即可实现同步启停视频与音频串流 scream能较好的解决声音输出问题(音质太高时也会偶发卡顿的情况),但无法解决麦克风问题。
建议直通带麦克风的USB摄像头/声卡,或者参考archwiki中QEMU直通音频部分,支持两种设备:ICH9{支持音频输入,输出仅支持双声道}usb{无音频输入,最高支持5.1声道输出},但是我测试的ICH9输出音质差,输入全是电流声无法使用,配置如下:
首先编辑/etc/libvirt/qemu.conf中user = 1000(要配置的用户名/UID)
然后在虚拟机配置文件里修改下面的部分 <sound model='ich9'> <codec type='micro'/> <alias name='sound0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </sound> <audio id='1' type='pulseaudio' timerPeriod='4000' serverName='/run/user/1000/pulse/native'> <input mixingEngine='no'/> <output mixingEngine='yes' fixedSettings='yes' voices='2' bufferLength='20000'> <settings frequency='48000' channels='2' format='s16'/> </output> </audio>
其它问题:- 此方案对性能有要求,开启多个虚拟机占用所有核心后,核显直通WIN10虚拟机卡死崩溃(QEMU资源占用过多)
- 由于此方案需要去掉虚拟机显卡,会导致SPICE的重定向USB设备功能无法使用,例如AX200(NGW,应该是硬件版本低的问题)仅能通过SPIEC方式直通蓝牙给虚拟机使用
- USB设备(声卡)疑似无法热插拔,需要重启生效
- 与scream同步启停可参考的另外一种脚本写法:
#!/bin/bash virsh start Windows_10_VM # Optional line, this will simply start the VM if it isn't running. You can delete this if you wish. Make sure to change the name to your VM name. /path/to/looking-glass-client >/dev/null 2>&1 & # Starts Looking Glass, and ignores all output (We aren't watching anyways) /path/to/scream-ivshmem-pulse /dev/shm/scream-ivshmem & # Starts Scream wait -n # We wait for any of these processes to exit. (Like closing the Looking Glass window, in our case) pkill -P $$ # We kill the remaining processes (In our case, scream)
- 配置QEMU直通音频给主机音频管理服务时,出现了输出声音有噼啪声/音频失真/音频加速,输入音频有明显卡顿延迟
- 在虚拟机中设置输出设备的采样频率和位深度,降低到最低之后发现音频不再卡顿,但是音质严重损失,而拉到最大之后问题变得更严重,由此判断可能是archwiki中提到的buffer-length与timer-period参数问题。输入问题无解。
- 如果不想占用/暴露系统网络接口,可以将spice服务器配置为socket模式,即修改virt-manager中显示协议 Spice项,监听类型改成socket,系统启动时会自动生成socket文件,然后执行looking-glass-client -c /var/lib/libvirt/qemu/domain-1-windows/spice.sock -p 0,或写入looking-glass用户配置文件。
- 自动生成的socket文件路径中 domain-1-windows 段不是固定值,重启虚机/启动顺序不同就会发生变化,可以通过编辑XML指定路径(image和gl配置可以不写,用不到这些功能): xml <graphics type="spice"> <listen type="socket" socket="/自定义路径/spice.sock"/> <image compression="off"/> <gl enable="no"/> </graphics>
- SPICE客户端剪切板功能在粘贴宿主机部分程序的内容至虚拟机时,会出现粘贴内容错误/缺失(edge浏览器)、复制中文字符至虚机,粘贴变成Unicode值(gedit文本编辑器)等问题。此BUG与虚拟机spice服务器模式、主板模式、启动的AGENT服务等配置无关,怀疑是none显卡配置的原因。
- EVDEV键鼠配置参考GPU直通示例或libvirt手册输入设备。
- 查看 /proc/bus/input/devices 可获取宿主机内输入设备信息,游戏键鼠由于有宏等功能,一个物理设备可能对应多个系统内的设备,这种可自定义功能的设备更推荐USB直通配置。
- 配置evdev键盘后,虚拟机启动时会自动捕获键盘导致宿主机键盘不可用,用配置的脱离组合键即可恢复。
cat /proc/bus/input/devices...I: Bus=0003 Vendor=046d Product=404d Version=0111N: Name="Logitech K400 Plus"P: Phys=usb-0000:00:14.0-10/input2:1S: Sysfs=/devices/pci0000:00/0000:00:14.0/usb1/1-10/1-10:1.2/0003:046D:C52B.0003/0003:046D:404D.0006/input/input38U: Uniq=404d-93-eb-16-0dH: Handlers=sysrq kbd leds event12 mouse0 B: PROP=0B: EV=12001fB: KEY=3f000303ff 0 0 483ffff17aff32d bfd4444600000000 ffff0001 130ff38b17c007 ffff7bfad941dfff ffbeffdfffefffff fffffffffffffffeB: REL=1943B: ABS=100000000B: MSC=10B: LED=1f...I: Bus=0003 Vendor=046d Product=c084 Version=0111N: Name="Logitech G102 Prodigy Gaming Mouse"P: Phys=usb-0000:00:14.0-11/input0S: Sysfs=/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0/0003:046D:C084.0007/input/input41U: Uniq=1673384A3935H: Handlers=event15 mouse1 B: PROP=0B: EV=17B: KEY=ffff0000 0 0 0 0B: REL=1943B: MSC=10I: Bus=0003 Vendor=046d Product=c084 Version=0111N: Name="Logitech G102 Prodigy Gaming Mouse Keyboard"P: Phys=usb-0000:00:14.0-11/input1S: Sysfs=/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.1/0003:046D:C084.0008/input/input42U: Uniq=1673384A3935H: Handlers=sysrq kbd event16 B: PROP=0B: EV=100013B: KEY=1000000000007 ff800000000007ff febeffdfffefffff fffffffffffffffeB: MSC=10I: Bus=0003 Vendor=046d Product=c084 Version=0111N: Name="Logitech G102 Prodigy Gaming Mouse Consumer Control"P: Phys=usb-0000:00:14.0-11/input1S: Sysfs=/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.1/0003:046D:C084.0008/input/input43U: Uniq=1673384A3935H: Handlers=kbd event17 B: PROP=0B: EV=1fB: KEY=302ff 0 0 483ffff17aff32d bfd4444600000000 1 130ff38b17c000 677bfad9415fed 9ed68000004400 10000002B: REL=1040B: ABS=100000000B: MSC=10I: Bus=0003 Vendor=046d Product=c084 Version=0111N: Name="Logitech G102 Prodigy Gaming Mouse System Control"P: Phys=usb-0000:00:14.0-11/input1S: Sysfs=/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.1/0003:046D:C084.0008/input/input44U: Uniq=1673384A3935H: Handlers=kbd event18 B: PROP=0B: EV=13B: KEY=c000 10000000000000 0B: MSC=10
查看设备的绝对路径 ll /dev/input/by-id 总用量 0drwxr-xr-x 2 root root 160 11月 2 10:32 .drwxr-xr-x 4 root root 520 11月 2 10:32 ..lrwxrwxrwx 1 root root 10 11月 2 09:51 usb-Logitech_G102_Prodigy_Gaming_Mouse_1673384A3935-event-if01 -> ../event18lrwxrwxrwx 1 root root 10 11月 2 09:51 usb-Logitech_G102_Prodigy_Gaming_Mouse_1673384A3935-event-mouse -> ../event15lrwxrwxrwx 1 root root 10 11月 2 09:51 usb-Logitech_G102_Prodigy_Gaming_Mouse_1673384A3935-if01-event-kbd -> ../event16lrwxrwxrwx 1 root root 9 11月 2 09:51 usb-Logitech_G102_Prodigy_Gaming_Mouse_1673384A3935-mouse -> ../mouse1lrwxrwxrwx 1 root root 10 11月 2 09:06 usb-Logitech_USB_Receiver-if02-event-mouse -> ../event12lrwxrwxrwx 1 root root 9 11月 2 09:06 usb-Logitech_USB_Receiver-if02-mouse -> ../mouse0
这里选择带有event的设备路径(链接对应的是event,即evdev设备)写入配置文件 配置示例: <devices> <input type='passthrough' bus='virtio'> <source evdev='/dev/input/by-id/usb-Logitech_G102_Prodigy_Gaming_Mouse_1673384A3935-event-mouse'/> </input> <input type='evdev'> <source dev='/dev/input/by-id/usb-Logitech_USB_Receiver-if02-event-mouse' grab='all' repeat='on' grabToggle='ctrl-ctrl'/> </input></devices>
passthrough就是直通了宿主机输入设备无法脱离,这里不使用此配置
对于passthrough和evdev类型,强制性的子元素source必须有一个evdev(对于passthrough)或dev(对于evdev)属性,包含传递给客人的事件设备的绝对路径。
对于evdev类型,source有三个可选的属性:
1. grab,其值为'all',当启用时,会抓取所有的输入设备,而不是只有一个;
2. repeat,其值为'on'/'off',用于启用/禁用自动重复事件;
3. grabToggle,其值为ctrl-ctrl, alt-alt, shift-shift, meta-meta, scrolllock 或 ctrl-scrolllock,用于改变抓取键组合。注意这里组合键是只键盘上左右的按键一起按,而不是按两下(例如左右ctrl一起按),且仅支持上面列出的6种组合。 - 使用快捷键组合功能
- Looking Glass 默认使用 Scroll Lock 组合键,长按可以呼出帮助菜单。组合键可以在启动命令行里用 -m 指定,或者在配置文件中指定。下面是帮助菜单的翻译:
组合键 | 描述 | ScrLk | 短按开关键鼠捕获,一般是非全屏模式使用 | ScrLk + Q | 退出软件 | ScrLk + R | 屏幕顺时针旋转90度 | ScrLk + I | 开关SPICE键鼠输入 | ScrLk + S | 切换虚拟机与物理屏幕分辨率不同时的图像缩放(插值)算法 | ScrLk + D | 切换显示FPS信息 | ScrLk + F | 切换全屏 | ScrLk + V | 开关屏幕 | ScrLk + N | 开关夜间模式 | ScrLk + F1-F12 | 发送 Ctrl + Alt + F1-F12 至虚机 | ScrLk + Insert | 提高捕获的鼠标灵敏度 | ScrLk + Del | 降低捕获的鼠标灵敏度 | ScrLk + 左/右Win | 发送左/右WIN键至虚机 |
GNOME默认禁止快捷键覆盖,所以发送按键等功能会失效。建议配置单独工作区全屏并配置虚拟机分辨率与物理屏幕相同以避免缩放。使用evdev键盘输入配置可规避快捷键冲突等问题。
图标文件:
 知乎不支持SVG格式图标文件,可以去GITHUB软件源码里翻
|