在Linux中更改VNC会话的分辨率

Changing the resolution of a VNC session in linux

我在工作中使用VNC连接到Linux工作站。在工作中,我有一台20英寸的显示器,其分辨率为1600x1200,而在家里,我使用的笔记本电脑的分辨率为1440x900。
如果将vncserver设置为以1440x900运行,我会在显示器上浪费很多空间,而如果将其设置为以1600x1200运行,它将无法在笔记本电脑的屏幕上显示,因此我必须一直滚动。

有什么好的方法可以即时调整VNC会话的大小?

我的VNC服务器是SuSE64上运行的RealVNC E4.x(我不记得确切的版本)。


Real VNC服务器4.4包含对Xrandr的支持,该支持允许调整VNC的大小。使用以下命令启动服务器:

1
vncserver -geometry 1600x1200 -randr 1600x1200,1440x900,1024x768

然后使用以下内容调整大小:

1
2
3
xrandr -s 1600x1200
xrandr -s 1440x900
xrandr -s 1024x768

发现Ubuntu(10.04)附带的vnc4server(4.1.1)已打补丁,还支持通过xrandr快速更改分辨率。不幸的是,由于未记录该功能,因此很难找到。所以这里是...

使用多个"几何"实例启动服务器,例如:

1
vnc4server -geometry 1280x1024 -geometry 800x600

在vncviewer的终端中(启用:"允许动态桌面调整大小"),使用xrandr查看可用模式:

1
xrandr

更改重新洗脱,例如使用:

1
xrandr -s 800x600

就这样。


我正在Linux服务器上运行TigerVNC,该服务器具有基本的randr支持。
我只是在没有任何-randr或多个-geometry选项的情况下启动vncserver。

当我在终端中运行xrandr时,它将显示所有可用的屏幕分辨率:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bash> xrandr
 SZ:    Pixels          Physical       Refresh
 0   1920 x 1200   ( 271mm x 203mm )   60
 1   1920 x 1080   ( 271mm x 203mm )   60
 2   1600 x 1200   ( 271mm x 203mm )   60
 3   1680 x 1050   ( 271mm x 203mm )   60
 4   1400 x 1050   ( 271mm x 203mm )   60
 5   1360 x 768    ( 271mm x 203mm )   60
 6   1280 x 1024   ( 271mm x 203mm )   60
 7   1280 x 960    ( 271mm x 203mm )   60
 8   1280 x 800    ( 271mm x 203mm )   60
 9   1280 x 720    ( 271mm x 203mm )   60
*10  1024 x 768    ( 271mm x 203mm )  *60
 11   800 x 600    ( 271mm x 203mm )   60
 12   640 x 480    ( 271mm x 203mm )   60
Current rotation - normal
Current reflection - none
Rotations possible - normal
Reflections possible - none

然后我可以轻松切换到其他分辨率(例如,切换到1360x768):

1
bash> xrandr -s 5

我正在使用TightVnc查看器作为客户端,它会自动适应新的分辨率。


我认为最好的办法是在不同的端口上以不同的几何体运行VNC服务器。我会根据手册页尝试

1
2
$vncserver :0 -geometry 1600x1200
$vncserver :1 -geometry 1440x900

然后,您可以从公司连接到一个端口,也可以从家连接到另一个端口。

编辑:然后使用xmove在两个x服务器之间移动窗口。


当这个问题首先出现在Google上时,我想我应该使用TigerVNC共享一个解决方案,这是目前的默认设置。

xrandr允许选择显示模式(也称为分辨率)
由于模式线很难
编码的
任何其他Modeline(例如" 2560x1600"或" 1600x900")都需要
被添加到
码。一世
认为编写代码的开发人员更聪明,更努力
编码列表只是值的样本。得出的结论是
必须有一种添加自定义模式行的方法,并且man xrandr确认
它。

在此背景下,如果目标是在两个之间共享VNC会话
具有上述分辨率并假定VNC服务器是
分辨率为" 1600x900"的计算机:

  • 使用与物理显示匹配的几何图形启动VNC会话:

    1
    $ vncserver -geometry 1600x900 :1

  • 在" 2560x1600"计算机上,启动VNC查看器(我更喜欢
    Remmina)并连接到远程VNC
    会话:

    1
    host:5901
  • 一旦在VNC会话中启动了终端窗口。

  • 确认新几何在VNC会话中可用:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    $ xrandr
    Screen 0: minimum 32 x 32, current 1600 x 900, maximum 32768 x 32768
    VNC-0 connected 1600x900+0+0 0mm x 0mm
       1600x900      60.00 +
       1920x1200     60.00  
       1920x1080     60.00  
       1600x1200     60.00  
       1680x1050     60.00  
       1400x1050     60.00  
       1360x768      60.00  
       1280x1024     60.00  
       1280x960      60.00  
       1280x800      60.00  
       1280x720      60.00  
       1024x768      60.00  
       800x600       60.00  
       640x480       60.00

    ,您会发现屏幕很小。

  • 列出以下内容的模型(参见ArchLinux Wiki中的xrandr文章)
    " 2560x1600"分辨率:

    1
    2
    3
    $ cvt 2560 1600
    # 2560x1600 59.99 Hz (CVT 4.10MA) hsync: 99.46 kHz; pclk: 348.50 MHz
    Modeline"2560x1600_60.00"  348.50  2560 2760 3032 3504  1600 1603 1609 1658 -hsync +vsync

    或者如果监视器较旧,则获取GTF计时:

    1
    2
    3
    $ gtf 2560 1600 60
    # 2560x1600 @ 60.00 Hz (GTF) hsync: 99.36 kHz; pclk: 348.16 MHz
    Modeline"2560x1600_60.00"  348.16  2560 2752 3032 3504  1600 1601 1604 1656 -HSync +Vsync
  • 将新的Modeline添加到当前的VNC会话中:

    1
    $ xrandr --newmode"2560x1600_60.00"  348.16  2560 2752 3032 3504  1600 1601 1604 1656 -HSync +Vsync
  • 在上面的xrandr输出中,查找第二个显示名称
    行:

    1
    VNC-0 connected 1600x900+0+0 0mm x 0mm
  • 将新的Modeline绑定到当前的VNC虚拟监视器:

    1
    $ xrandr --addmode VNC-0"2560x1600_60.00"
  • 使用它:

    1
    $ xrandr -s"2560x1600_60.00"

  • 有趣的是,没有人回答。在TigerVNC中,当您登录到会话时。从顶部菜单栏转到System > Preference > Display(我使用Cent OS作为远程服务器)。单击分辨率下拉菜单,有多种可用设置,包括1080p。选择您喜欢的一个。它会随时更改。

    enter

    1
    vncserver -geometry 1200x1600

    这将生成一个新的会话:1

    通过ipaddress:1

    与vnc客户端连接

    就这样。


    添加到弥敦道(已接受)的答案中:

    我想浏览一下决议列表,但没有看到任何内容:

    1
    2
    3
    4
    5
    function vncNextRes()
    {
       xrandr -s $(($(xrandr | grep '^*'|sed 's@^\\*\\([0-9]*\\).*$@\\1@')+1)) > /dev/null 2>&1 || \\
       xrandr -s 0
    }

    它获取当前索引,移至下一个索引,并在发生错误(即结束)时循环回到0

    编辑

    已修改,以匹配更高版本的xrandr(" *"在行尾,并且没有前导分辨率标识符)。

    1
    2
    3
    4
    5
    function vncNextRes()
    {
       xrandr -s $(($(xrandr 2>/dev/null | grep -n '\\* *$'| sed 's@:.*@@')-2))  || \\
       xrandr -s 0
    }

    @omiday的解决方案在Xvnc TigerVNC 1.1.0中为我工作,因此我将其压缩为单个bash函数vncsize x y。像这样使用它:vncsize 14001000。它适用于任何VNC输出名称,"默认"或" VNC-0"。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    function vncsize {
        local x=$1 y=$2
        local mode
        if mode=$(cvt"$x""$y" 2>/dev/null)
        then
            if [[ $mode =~"Modeline (.*)$" ]]
            then
                local newMode=${BASH_REMATCH[1]//"/}
                local modeName=${newMode%% *}
                local newSize=( ${modeName//["x_]/ } )
                local screen=$(xrandr -q|grep connected|cut -d' ' -f1)
                xrandr --newmode $newMode
                xrandr --addmode"$sscreen""$modeName"
                xrandr --size"${newSize[0]}x${newSize[1]}" &&
                    return 0
            else
                echo"Unable to parse modeline for ($x $y) from $mode"
                return 2
            fi
        else
            echo"\\`$x $y' is not a valid X Y pair"
            return 1
        fi
    }

    也许这是我发布的最无知的答案,但是在这里:使用TigerVNC客户端/查看器并在选项的"屏幕"选项卡下选中" 'Resize remote session to local window'"。

    我不知道$%#@ TigerVNC客户端告诉远程vncserver或xrandr或Xvnc或gnome或...的内容,但是当我更改TigerVNC客户端窗口时,它会调整大小。

    我的设置:

    • 在CentOS 6上运行的Tiger VNC服务器。托管GNOME桌面。 (也可以与RHEL 6.6一起使用)
    • Windows带有Tiger VNC Client的某些版本。

    通过此操作,分辨率将更改为适合客户端窗口大小的大小,而不是zooming,这是实际的分辨率更改(我可以在xrandr输出中看到新的分辨率)。

    我尽力为xrandr添加新的分辨率,但无济于事,总是以'xrandr: Failed to get size of gamma for output default'错误结束。

    目前适用于我的版本(尽管过去我没有遇到任何版本问题,但我只是使用yum install gnome-* tigervnc-server安装了最新版本并可以正常工作):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    OS: RHEL 6.6 (Santiago)
    VNC Server:
    Name        : tigervnc-server
    Arch        : x86_64
    Version     : 1.1.0
    Release     : 16.el6

    # May be this is relevant..
    $ xrandr --version
    xrandr program version       1.4.0
    Server reports RandR version 1.4
    $

    # I start the server using vncserver -geometry 800x600
    # Xvnc is started by vncserver with following args:
    /usr/bin/Xvnc :1 -desktop plabb13.sgdcelab.sabre.com:1 (sg219898) -auth /login/sg219898/.Xauthority
    -geometry 800x600 -rfbwait 30000 -rfbauth /login/sg219898/.vnc/passwd -rfbport 5901 -fp catalogue:/e
    tc/X11/fontpath.d -pn


    # I'm running GNOME (installed using sudo yum install gnome-*)
    Name        : gnome-desktop
    Arch        : x86_64
    Version     : 2.28.2
    Release     : 11.el6

    Name        : gnome-session
    Arch        : x86_64
    Version     : 2.28.0
    Release     : 22.el6

    Connect using Tiger 32-bit VNC Client v1.3.1 on Windows 7.

    On the other hand, if there's a way to
    move an existing window from one
    X-server to another, that might solve
    the problem.

    我认为您可以使用xmove在两个单独的x服务器之间移动窗口。因此,如果可行,这至少应该为您提供一种方法来完成您想要的事情,尽管不像更改分辨率那样容易。


    我不确定linux,但是在Windows下,tightvnc将检测并适应服务器上的分辨率更改。

    因此,您应该能够VNC进入工作站,等效于右键单击桌面,属性,将分辨率设置为任意值,并让客户端vnc窗口相应地调整其大小。


    我有一个简单的主意,像这样:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/bin/sh

    echo `xrandr --current | grep current | awk '{print $8}'` >> RES1
    echo `xrandr --current | grep current | awk '{print $10}'` >> RES2
    cat RES2 | sed -i 's/,//g' RES2

    P1RES=$(cat RES1)
    P2RES=$(cat RES2)
    rm RES1 RES2
    echo"$P1RES"'x'"$P2RES">> RES
    RES=$(cat RES)

    # Play The Game

    # Finish The Game with Lower Resolution

    xrandr -s $RES

    好吧,我需要针对Linux和类似的S.O下的所有显示设备的更好的解决方案。


    据我所知,仅使用VNC就无法更改客户端的分辨率,因为它只是一个"监视器镜像"应用程序。

    但是,TightVNC(这是VNC客户端和服务器应用程序)可以在客户端调整屏幕大小,即使所有内容都变小(类似于图形程序中的图像大小调整技术)。如果您不使用太小的字体,那应该可以工作。理论上,VNC应该在不同的VNC应用程序之间兼容。


    我认为这取决于您的窗口管理器。

    我是Windows用户,所以这可能是一个错误的猜测,但是:您是否可以在Linux机器上运行X-Server,至少在可能是VNC感兴趣的机器上运行?到" X-Clients"?

    VNC只是获取屏幕上显示的所有内容,然后"通过您的网络将其隧道化"。如果我不是完全不对,那么" X"协议应该使您有机会使用客户端的桌面分辨率。

    尝试一下Wikipedia上的X-Server,这可能会给您一个大概的概述。


    推荐阅读