11
20
2020
20

让 QEMU 使用 SPICE 协议

本文来自依云's Blog,转载请注明。

缘起

我就是买了个4K显示器,咋这么多事呢……(有两篇文章还在路上)

第一个问题是,我的显卡 vGPU 最高只支持 1920x1200 的分辨率。行吧,我缩放成了吧?嘿嘿,-display gtk 的缩放不会保持比例,我只好算了算最大保持比例的大小,然后窗口切成浮动,再调用命令调整到指定的大小:

sleep 1 && xdotool getactivewindow windowsize 3280 2122

然后还要居中放置一下。多麻烦!

第二个问题是,我想在虚拟机里试试 i3,但是我的按键总是会被外边捕获。Super 键基本上是 Awesome 在用,而 Alt 键会撞上这个 GTK 窗口菜单栏的快捷键。

配置

经过多番尝试和摸索之后,确定了如下的参数:

  -display egl-headless,gl=on,rendernode=/dev/dri/renderD128
  -spice unix,addr=/run/user/1000/qemu/ArchKDE/spice.sock,disable-ticketing
  -device virtio-serial-pci
  -device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0
  -chardev spicevmc,id=spicechannel0,name=vdagent

当然要gl=on啦,不然我怎么玩特效,我还不如回到 vbox 去呢(啊不,我的 vbox 不喜欢 btrfs,经常出错然后只读挂载,所以已经被删掉了)。要指定rendernode,不然它会 fallback 到 llvmpipe,然后还段错误崩掉……这也是我不-display spice-app的原因。

后边三行是从这个 QEMU + Spice with Copy & Paste 抄来的。搜索问题时不小心遇见,然后解决了这个我一直没有处理的问题。SPICE 不但能共享剪贴板,而且还支持 PRIMARY 选择区呢~虚拟机里要安装 spice-vdagent 并启动相应的服务。

然后是客户端的选择。一个很神奇的地方是,virt-viewer 看上去轻量,实际上只是选项少而已。它不光拖进来个 gtk-vnc 依赖,还把 libvirt 都给我带上了……然后 GNOME 的 vinagre,我不知道为啥,它就是连不上我的 spice+unix 地址。哦对了,virt-viewer 直接敲命令调用也是连不上,只能用 xdg-open 才能正常打开。

virt-viewer 有个依赖叫 spice-gtk。我试着 pacman -Ql 了一下,还真找到个 spicy 工具。比 virt-viewer 轻量多了,选项也更为丰富,比如可以选择不 grab 键盘。

一点额外的东西

在群里听说了 virtio-fs 共享方案,听说比 virtio + 9p 更高效。然后我用它成功取代了之前用的 NFS 方案(反正我的 vbox 虚拟机已经被删掉啦)。NFS 的服务也可以卸载啦(开放一堆端口到公网,看着有点怕怕的,虽然是 IPv6 地址不太会被扫到,但知道我的地址的咋办呢)。

virtio-fs 相比 virtio + 9p 的另一个优点是,和 NFS 一样,virtiofsd 是以 root 权限运行的,所以可以写入我的 pacman 缓存。qemu 那个 9p 似乎没有办法。至于启动嘛,用 systemd abstract socket 触发一下就好了。

另外,我使用 GVT-g 和 virtio 输出视频信号时,均遇到了声音在视频画面变化时声音卡顿的情况。一个绕过的办法是,通过设置 PULSE_SERVER 环境变量以及加载 module-native-protocol-tcp 模块,将音频信号直接通过网络发送到宿主机上,一点也不卡!

Category: Linux | Tags: spice qemu kvm 虚拟机 linux | Read Count: 101749
c 说:
Nov 28, 2020 01:10:26 PM

依云换 btrfs 啦?记得之前好像是用的 xfs?
能讲下现在都在用什么文件系统吗?还有备份是怎么做的?直接用 btrfs 的那个 send吗?:-)

Avatar_small
依云 说:
Nov 28, 2020 02:07:01 PM

我去年就换 btrfs 啦: https://blog.lilydjwg.me/2019/3/31/move-system-to-ssd.214336.html

备份还是旧方案,使用 rsync。btrfs send / recv 一是会包含我不想备份的文件,二是两边的快照需要对应得上(不然不能增量)。

Avatar_small
依云 说:
Nov 28, 2020 02:10:11 PM

啊对了,那个 vbox 是里边是 btrfs,虚拟机磁盘文件是在 xfs 上的。

c 说:
Nov 29, 2020 11:13:00 PM

啊~刚看到,谢谢回复~
多年前用 btrfs 丢过数据一直没敢再用

荒野无灯 说:
Jun 21, 2021 01:36:39 PM

其实我都是省事,直接从 cockpit web ui新建 kvm 虚拟机的。
spice 这些都是自动好。

荒野无灯 说:
Jun 21, 2021 01:38:11 PM

virt-viewer 我从来不用, 用 remmina 连接,
从 linux 拖放文件到 win10 guest 机桌面也是支持挺好的。

Avatar_small
依云 说:
Jun 21, 2021 11:02:09 PM

原来还有这么个软件。我试试看~

Avatar_small
依云 说:
Jun 21, 2021 11:04:58 PM

呃:

free(): invalid pointer
zsh: abort (core dumped) remmina

荒野无灯 说:
Jun 22, 2021 01:44:01 PM

先确认下,我们用的是同一个 remmina 吗? https://remmina.org/

我在 GNOME 下使用很多年了。
没发现你遇到的问题 -_-

Avatar_small
依云 说:
Jun 22, 2021 03:59:17 PM

是啊,不知道为什么它不喜欢我,连的时候直接崩掉了。
我用的是 spice+unix:/// 协议的。

willww64 说:
Jun 29, 2021 04:02:46 PM

在说到 virtiofsd 的时候,文中说:“至于启动嘛,用 systemd abstract socket 触发一下就好了。”。

请问一下怎么用 abstract socket 触发呢?virtiofsd 只支持 --socket-path 或者 --fd 传入已打开 socket 的 fd,那么 systemd 已经打开的 socket fd 怎么传进去呢?我试了 StandardInput=socket 加 --fd=0,虽然可行,但是感觉这样稍有丑陋。我 man 了一下 systemd.socket,如果不用 stdin 的方法,好像需要 service 里的程序支持 systemd 的接口函数 sd_listen_fds。我又 man sd_listen_fds,发现 sd_listen_fds 里有:

#define SD_LISTEN_FDS_START 3

于是 hack 了一下直接传 --fd=3 给 virtiofsd,也行得通。

不过这两种方法都不怎么优雅。想请教一下你是怎么实现的。

另外,我为了学习 qemu,没有用 libvirt,用 bash 简单写了一个类 vagrant 的脚本。想问下你是用什么管理虚拟机的。

Avatar_small
依云 说:
Jun 30, 2021 06:19:23 PM

啊,我是 socat 通过 abstract socket 访问一下,触发一个 .socket 对应的 .service。那个 service 里根本没用到 systemd 传过去的 fd,直接 --socket-path 指定了个路径。

这么绕是因为 virtiofsd 需要 root 权限,而 qemu 不需要,所以我借用 systemd 来启动它了。

Avatar_small
依云 说:
Jun 30, 2021 06:20:08 PM

我管理虚拟机的就是 bash 脚本啦,一个 start-xxx 脚本对应一个虚拟机……

Avatar_small
依云 说:
Jun 30, 2021 06:22:46 PM

脚本长这样: https://gist.github.com/lilydjwg/9554efb9abb6996b0d2fcf3b9c35d6cc

ycp 说:
Oct 07, 2021 09:09:33 AM

virtio-fs有没有比较傻瓜一点的教程资源什么的,我的win-guest和debian-host文件共享一直没有特别简单的方法。

Avatar_small
依云 说:
Oct 07, 2021 12:34:31 PM

啊,不就几行命令的事么?你要不看看我的笔记: https://r.lilydjwg.me/wiki/Qemu#virtio-fs_文件共享

ycp 说:
Oct 08, 2021 11:55:34 AM

我研究一下

平淡 说:
Dec 22, 2021 05:12:37 PM

我使用 GVT-g 和 virtio 输出视频信号

======================================

是直接输出到HDMI/VGA接口吗?怎么设置的

Avatar_small
依云 说:
Dec 23, 2021 11:25:04 AM

输出到 spice 呀。

平淡 说:
Dec 23, 2021 11:26:16 AM

哦哦,我还以为是输出到hdmi/vga上


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

| Theme: Aeros 2.0 by TheBuckmaker.com