没有使用 SPICE 和 virt-manager 自动调整大小

how*_*ven 14 qemu linux-kvm libvirt virt-manager

我已经设置了一个很好用的虚拟机,除了似乎不一致的自动调整大小功能。我让它随机工作了几次,但它也随机停止工作。它目前无法正常工作,我不确定我需要做什么才能让它可靠地工作(例如 VirtualBox 自动调整大小)。请参阅下面的我的配置。

设置

Host: Ubuntu 16.10
Guest: Ubuntu 16.04.2, et. al (I've tried with other Linux distros with similar results)
Guest: created using virt-manager
Guest: installed spice-vdagent
Guest: virt-manager > View > Scale Display > Auto resize VM with window (checked)
Run Code Online (Sandbox Code Playgroud)

香料

user@ubuntu:~$ ps aux | grep spice
root       805  0.0  0.0  30568   260 ?        Ss   08:59   0:00 /usr/sbin/spice-vdagentd
user      1365  0.0  0.0  35124  2360 ?        Ss   08:59   0:00 /usr/bin/spice-vdagent
user      1933  0.0  0.0  21292  1020 pts/17   S+   09:00   0:00 grep --color=auto spice
Run Code Online (Sandbox Code Playgroud)

qxl

user@ubuntu:~$ sudo lshw -c Video
  *-display               
       description: VGA compatible controller
       product: QXL paravirtual graphic card
       vendor: Red Hat, Inc.
       physical id: 2
       bus info: pci@0000:00:02.0
       version: 04
       width: 32 bits
       clock: 33MHz
       capabilities: vga_controller rom
       configuration: driver=qxl latency=0
       resources: irq:10 memory:f4000000-f7ffffff memory:f8000000-fbffffff memory:fc058000-fc059fff ioport:c040(size=32) memory:c0000-dffff
Run Code Online (Sandbox Code Playgroud)

使用 qemu/kvm 正确启用自动调整大小我缺少什么?

gsk*_*ker 11

gnome 桌面,mutter,有一些处理调整大小的热插拔代码。

如果您有任何其他桌面,例如 xfce4 或 KDE,或者像我一样运行 compiz 的裸 .xinitrc 文件,您会很困惑,但我想我终于找到了一个优雅而简单的解决方案。

xrandr --output Virtual-0 --auto 将获取大小并从 vdagent 应用它。所需要的只是一个触发器。

这是触发器以及如何处理它。

udev将调整大小事件公开为如下所示的drm设备change
UDEV [10758.537471] change /devices/pci0000:00/0000:00:02.0 `drm/card0 (drm)

要让您的桌面对它做出反应udev,请创建一个规则并参考一个脚本来调整大小:
Rule in /etc/udev/rules.d/50-x-resize.rules

ACTION=="change",KERNEL=="card0", SUBSYSTEM=="drm", RUN+="/usr/local/bin/x-resize" 
Run Code Online (Sandbox Code Playgroud)

/usr/local/bin/x-resize 中的脚本:

#! /bin/sh
PATH=/usr/bin
export DISPLAY=:0.0
xrandr --output "$(xrandr | awk '/ connected/{print $1; exit; }')" --auto
Run Code Online (Sandbox Code Playgroud)

您可能需要根据您的情况自定义该 shell 脚本。

我发现在 debian 10 和 Ubuntu 20.04 上我什至不需要重新启动任何东西;它立即捡起来。

更新:2021-03-17

我最近发现我必须获得允许该脚本工作的权限。我把它改成这样:

#! /bin/sh 
PATH=/usr/bin
desktopuser=$(/bin/ps -ef  | /bin/grep -oP '^\w+ (?=.*vdagent( |$))') || exit 0
export DISPLAY=:0
export XAUTHORITY=$(eval echo "~$desktopuser")/.Xauthority
xrandr --output $(xrandr | awk '/ connected/{print $1; exit; }') --auto
Run Code Online (Sandbox Code Playgroud)


小智 5

我使用 Debian 10 和 icewm 作为来宾 VM。当 spice-vdagent 运行时,我可以手动调整屏幕大小xrandr --output Virtual-1 --auto

使用 xev 也可以观察到显示尺寸的变化:

joe@l1:~$ xev -root -event randr 

RRScreenChangeNotify event, serial 18, synthetic NO, window 0x3af,
    root 0x3af, timestamp 39153, config_timestamp 82137
    size_index 65535, subpixel_order SubPixelUnknown
    rotation RR_Rotate_0
    width 1320, height 949, mwidth 348, mheight 250

RRNotify event, serial 18, synthetic NO, window 0x3af,
    subtype XRROutputChangeNotifyEvent
    output Virtual-1, crtc 63, mode 1320x949 (1320x949)
    rotation RR_Rotate_0
    connection RR_Connected, subpixel_order SubPixelUnknown
Run Code Online (Sandbox Code Playgroud)

使用它作为触发器似乎比使用 udev 更不具有侵入性,尤其是在同一 VM 中使用不同的桌面环境或窗口管理器时。

joe@l1:~$ cat /home/joe/.xsession
#!/bin/sh

if [ -x /usr/bin/spice-vdagent ] ; then
    /usr/bin/spice-vdagent
    /home/joe/.icewm/xrandr-loop &
fi
exec /usr/bin/icewm-session

joe@l1:~$ cat /home/joe/.icewm/xrandr-loop
#!/bin/sh

sleep 2

xrandr --output "$(xrandr | awk '/ connected/{print $1; exit; }')" --auto

xev -root -event randr | \
grep --line-buffered 'subtype XRROutputChangeNotifyEvent' | \
while read foo ; do \
    xrandr --output "$(xrandr | awk '/ connected/{print $1; exit; }')" --auto
done

joe@l1:~$ 
Run Code Online (Sandbox Code Playgroud)