本文来自依云's Blog,转载请注明。
缘起
我就是买了个4K显示器,咋这么多事呢……(有两篇文章还在路上)
第一个问题是,我的显卡 vGPU 最高只支持 1920x1200 的分辨率。行吧,我缩放成了吧?嘿嘿,-display gtk
的缩放不会保持比例,我只好算了算最大保持比例的大小,然后窗口切成浮动,再调用命令调整到指定的大小:
1 | sleep 1 && xdotool getactivewindow windowsize 3280 2122 |
然后还要居中放置一下。多麻烦!
第二个问题是,我想在虚拟机里试试 i3,但是我的按键总是会被外边捕获。Super 键基本上是 Awesome 在用,而 Alt 键会撞上这个 GTK 窗口菜单栏的快捷键。
配置
经过多番尝试和摸索之后,确定了如下的参数:
1 2 3 4 5 | -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
模块,将音频信号直接通过网络发送到宿主机上,一点也不卡!
4 年前
依云换 btrfs 啦?记得之前好像是用的 xfs?
能讲下现在都在用什么文件系统吗?还有备份是怎么做的?直接用 btrfs 的那个 send吗?:-)
4 年前
我去年就换 btrfs 啦: https://blog.lilydjwg.me/2019/3/31/move-system-to-ssd.214336.html
备份还是旧方案,使用 rsync。btrfs send / recv 一是会包含我不想备份的文件,二是两边的快照需要对应得上(不然不能增量)。
4 年前
啊~刚看到,谢谢回复~
多年前用 btrfs 丢过数据一直没敢再用
4 年前
啊对了,那个 vbox 是里边是 btrfs,虚拟机磁盘文件是在 xfs 上的。
4 年前
其实我都是省事,直接从 cockpit web ui新建 kvm 虚拟机的。
spice 这些都是自动好。
4 年前
virt-viewer 我从来不用, 用 remmina 连接,
从 linux 拖放文件到 win10 guest 机桌面也是支持挺好的。
4 年前
原来还有这么个软件。我试试看~
4 年前
呃:
free(): invalid pointer
zsh: abort (core dumped) remmina
4 年前
先确认下,我们用的是同一个 remmina 吗? https://remmina.org/
我在 GNOME 下使用很多年了。
没发现你遇到的问题 -_-
4 年前
是啊,不知道为什么它不喜欢我,连的时候直接崩掉了。
我用的是 spice+unix:/// 协议的。
4 年前
在说到 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 的脚本。想问下你是用什么管理虚拟机的。
4 年前
啊,我是 socat 通过 abstract socket 访问一下,触发一个 .socket 对应的 .service。那个 service 里根本没用到 systemd 传过去的 fd,直接 --socket-path 指定了个路径。
这么绕是因为 virtiofsd 需要 root 权限,而 qemu 不需要,所以我借用 systemd 来启动它了。
4 年前
我管理虚拟机的就是 bash 脚本啦,一个 start-xxx 脚本对应一个虚拟机……
4 年前
脚本长这样: https://gist.github.com/lilydjwg/9554efb9abb6996b0d2fcf3b9c35d6cc
3 年前
virtio-fs有没有比较傻瓜一点的教程资源什么的,我的win-guest和debian-host文件共享一直没有特别简单的方法。
3 年前
啊,不就几行命令的事么?你要不看看我的笔记: https://r.lilydjwg.me/wiki/Qemu#virtio-fs_文件共享
3 年前
我研究一下
3 年前
我使用 GVT-g 和 virtio 输出视频信号
======================================
是直接输出到HDMI/VGA接口吗?怎么设置的
3 年前
输出到 spice 呀。
3 年前
哦哦,我还以为是输出到hdmi/vga上