kazeno memo

メモとか

SPICE(virt-viewer)のディスプレイを自動リサイズ

virt-viewerをフルスクリーンにしても、VMの画面サイズはそのままなので、ディスプレイのサイズを手動で変更しなければならない。

VirtualBox Guest Additionsみたいに、spice-vdagentを入れておけばどうにかなる訳でも無く。

一応、解像度の変更はVM側に通知しているようなので、それを読み取って画面サイズを更新すれば良い。

spice display auto resizeとかで調べてみたら、udevを使った解決策があった。

追記

udevルールの作成

# vim /etc/udev/rules.d/50-spice-resize.rules
ACTION=="change",KERNEL=="card0",SUBSYSTEM=="drm",RUN+="/usr/local/bin/spice-resize" 

ディスプレイの変更を検出すると、/usr/local/bin/spice-resizeを実行するudevルール。

画面サイズを変更するスクリプト

/usr/local/bin/spice-resizeファイルを作成し、下記のスクリプトを貼り付ける。

gist.github.com

ログの出力など余計な部分を省いたコード

#!/bin/bash
function x_resize() {
    declare -A disps usrs
    usrs=()
    disps=()

    for i in $(users);do
        [[ $i = root ]] && continue
        usrs[$i]=1
    done

    for u in "${!usrs[@]}"; do
        for i in $(sudo ps e -u "$u" | sed -rn 's/.* DISPLAY=(:[0-9]*).*/\1/p');do
            disps[$i]=$u
        done
    done

    for d in "${!disps[@]}";do
        session_user="${disps[$d]}"
        session_display="$d"
        session_output=$(sudo -u "$session_user" PATH=/usr/bin DISPLAY="$session_display" xrandr | awk '/ connected/{print $1; exit; }')
        sudo -u "$session_user" PATH=/usr/bin DISPLAY="$session_display" xrandr --output "$session_output" --auto
    done
}

x_resize

spice-resizeに実行権限を与える

# chmod +x /usr/local/bin/spice-resize