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

175

我使用VNC连接到工作中的Linux工作站。在工作中,我有一台运行在1600x1200分辨率下的20英寸显示器,而在家里,我使用1440x900分辨率的笔记本电脑。 如果我将vnc服务器设置为运行在1440x900分辨率下,我会错过很多显示空间,而如果我将其设置为运行在1600x1200分辨率下,则无法适应笔记本电脑的屏幕,并且我必须一直滚动它。

有没有好的方法可以动态调整VNC会话的大小?

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


我想提一下最近遇到的一件事,但我还没有测试过。有一个名为FreeNX的新程序,旨在取代VNC。这是链接:http://freenx.berlios.de/ - andho
@andho - 那个链接似乎已经失效了。 - ArtOfWarfare
@ArtOfWarfare 希望这可以帮到你 https://help.ubuntu.com/community/FreeNX。现在应该相当稳定了。我认为在时间允许的情况下,我很快就会尝试它。 - andho
15个回答

178

Real VNC服务器4.4包括对Xrandr的支持,可以改变VNC的大小。使用以下命令启动服务器:

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

然后使用以下代码进行调整大小:

xrandr -s 1600x1200
xrandr -s 1440x900
xrandr -s 1024x768

1
谢谢Nathan,即使是realvnc的人似乎也没有强调xrandr功能... 下面还可以看到我的bash函数,用于允许循环遍历randr分辨率。 - nhed
10
你可以方便地将所有这些选项放在.vnc/config文件中。例如,我的配置文件的第一行是:-randr 800x600,1024x768,1280x800,1280x960,1280x1024,1680x1050,1920x1080,3360x1050,1024x700,1200x740,1600x1000,3200x1000 - bfroehle
4
这个在 tightvncserver 上能用吗? - Dimitry K
4
@DimitryK 我原本安装了 tightvncserver,但无法使用,后来我卸载了它并安装了真正的 VNC。我推荐使用它。支持的屏幕分辨率包括:320x240、480x320、482x320、560x360、576x360、640x480、640x482、648x486、720x480、720x486、720x540、720x576、768x576、800x480、800x600、1024x600、1024x768、1280x720、1280x800、1280x1024、1366x768、1400x1050、1440x900、1600x900、1600x1024、1600x1200、1680x1050、1920x1080、1920x1200、2048x1024、2048x1152、2048x1536、2560x1080、2560x1440、2560x1600、2560x2048、3072x1536、3072x1728、3840x2160、4096x2048、4096x2304、7680x4320、8192x4096 和 8192x4608。 - barwnikk
-randr选项似乎无法与tigervnc一起使用,但是您可以使用xrandr --newmode、--addmode等在运行时添加新分辨率到tigervnc中,这将实现类似的效果。 - Cheetah
显示剩余3条评论

70

发现Ubuntu(10.04)附带的vnc4server(4.1.1)已经进行了补丁修复,以支持通过xrandr动态更改分辨率。不幸的是,这个功能很难找到,因为它没有文件记录。所以在这里介绍一下......

使用多个'geometry'实例启动服务器,例如:

vnc4server -geometry 1280x1024 -geometry 800x600

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

xrandr

要改变分辨率,例如使用:

xrandr -s 800x600

就是这样。


我也尝试了你的方法和Nathan建议的方法,但都没有成功。你能发现这里缺少什么吗?(http://superuser.com/q/542906/173338) - Geek
运行完美。谢谢! - Roney Michael

32

我在我的Linux服务器上运行TigerVNC,它具有基本的randr支持。 我只是启动vncserver而没有使用任何-randr或多个-geometry选项。

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

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):

bash> xrandr -s 5

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


为了避免大家白费力气,您能否列出TigerVnc的版本以及您的Linux服务器发行版和版本号?谢谢。 - nhed
我可以确认它与TigerVNC 1.1.0(Linux服务器,Linux客户端)非常兼容。 - Benedikt Waldvogel
1
我正在使用vncviewer,每次尝试更改分辨率时窗口都会关闭。 - AWE
1
请问您使用的是哪个版本的 xrandr。我的版本是 xrandr 程序版本 1.3.5,服务器报告 RandR 版本为 1.3。似乎完全不同,例如没有第一列。 - Wakan Tanka
只是补充一下,它也可以作为Real VNC客户端使用。已测试版本为6.0.3。 - Vivek V K
2019 年更新:无需调用 xrandr 更改分辨率。我的远程桌面分辨率将根据客户端 TigerVNC 窗口的大小调整;任何疯狂的即兴分辨率,任何宽高比都可以在 GDM 或 KDE 下工作得很好。开箱即用,无需在客户端或服务器上设置任何内容。我的设置:openSuse 15.1、GDM、KDE Plasma、TigerVNC 客户端 1.9.0。 - Espinosa

29

由于这个问题在谷歌上排名第一,我想分享一个使用 TigerVNC 的解决方案,它是现在的默认选择。

xrandr 允许选择显示模式 (也称为分辨率),但是由于模型线被硬编码, 任何额外的模型线,如 "2560x1600" 或 "1600x900" 都需要添加到代码中。我认为编写代码的开发人员非常聪明,硬编码列表只是值的示例。这导致结论必须有一种方法来添加自定义模型线,man xrandr 证实了这一点。

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

  1. Start a VNC session with a geometry matching the physical display:

    $ vncserver -geometry 1600x900 :1
    
  2. On the "2560x1600" computer start the VNC viewer (I prefer Remmina) and connect to the remote VNC session:

    host:5901
    
  3. Once inside the VNC session start up a terminal window.

  4. Confirm that the new geometry is available in the VNC session:

    $ 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  
    

    and you'll notice the screen being quite small.

  5. List the modeline (see xrandr article in ArchLinux wiki) for the "2560x1600" resolution:

    $ 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
    

    or if the monitor is old get the GTF timings:

    $ 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
    
  6. Add the new modeline to the current VNC session:

    $ xrandr --newmode "2560x1600_60.00"  348.16  2560 2752 3032 3504  1600 1601 1604 1656 -HSync +Vsync
    
  7. In the above xrandr output look for the display name on the second line:

    VNC-0 connected 1600x900+0+0 0mm x 0mm
    
  8. Bind the new modeline to the current VNC virtual monitor:

    $ xrandr --addmode VNC-0 "2560x1600_60.00"
    
  9. Use it:

    $ xrandr -s "2560x1600_60.00"
    

使用tigervnc和mwm创建更大的工作区,可以增加屏幕大小,但工作区仍受vnc初始大小的限制。 - user2019716
一旦mwm重新启动,就会利用完整的空间,这是由于mwm引起的。 - user2019716
这节省了我很多时间,谢谢! - Ben Davis

26

我认为你最好的选择是在不同的端口上以不同的几何形状运行VNC服务器。 我建议你根据手册进行尝试。

$vncserver :0 -geometry 1600x1200
$vncserver :1 -geometry 1440x900
然后您可以从工作地点连接到一个端口,从家里连接到另一个端口。 编辑:然后使用 xmove 在两个 X 服务器之间移动窗口。

3
@Pat,你提出的解决方案的问题在于我无法轻松地将窗口从一个VNC会话移动到另一个会话。如果我在进行调试时不得不离开,我希望能够从上次离开的地方继续(可能由于调整大小而稍微移动了一些窗口)。如果我有两个单独的会话,我就不能像以前那样继续工作,因为我必须关闭一个会话中的窗口并在另一个会话中重新打开它们。另一方面,如果有一种方法可以将现有窗口从一个X服务器移动到另一个服务器,那就可能解决问题。 - Nathan Fellman
1
xmove不在当前的Ubuntu软件库中;而xpra是可以实现同样功能(作为X代理)的。 - Sam Hartsfield

23

有趣的是没有人回答这个问题。在TigerVNC中,当您登录会话时。从顶部菜单栏进入System > Preference > Display(我使用Cent OS作为远程服务器)。单击分辨率下拉菜单,提供了各种设置,包括1080p。选择您喜欢的一个。它将实时更改。

输入图像描述

务必在提示对话框中应用新设置。否则它将像Windows一样恢复到以前的设置


1
这是TigerVNC的设置,还是CentOS的设置,还是窗口管理器的设置呢? - Nathan Fellman
这是CentOS中的一个设置。当您登录时,可以从“TigerVNC Viewer”访问它。 - TheTechGuy
3
这救了我的命。 - Yu Jiaao

12

大家这很简单。

通过ssh登录您的树莓派

执行

vncserver -geometry 1200x1600

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

使用您的VNC客户端连接到ipaddress:1

就是这样。


12
那个答案是错误的,因为它不会改变现有会话的分辨率,只会创建一个新的会话。 - Nathan Fellman
尝试这个 - 在TigerVNC上打开现有会话,它会自动调整几何屏幕的大小。现在使用任何其他VNC应用程序打开它,它将被调整大小。 - Sreekant Shenoy

6

在Nathan的(被接受的)答案基础上补充一点:

我想循环遍历分辨率列表,但是没有看到相关内容:

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

它获取当前索引,跳转到下一个索引,如果出错(即结束),则循环回到0。 编辑 修改以匹配xrandr的后续版本(行末带有“*”,没有前导分辨率标识符)。
function vncNextRes()
{
   xrandr -s $(($(xrandr 2>/dev/null | grep -n '\* *$'| sed 's@:.*@@')-2))  || \
   xrandr -s 0
}

5

在Xvnc TigerVNC 1.1.0中,@omiday的解决方案对我有用,因此我将其压缩为一个单独的bash函数vncsize x y。像这样使用它:vncsize 1400 1000。它适用于任何VNC输出名称,“default”或“VNC-0”。

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 "$screen" "$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
}

$sscreen应该是什么?回显为空白。此外,newSize似乎不是一个列表/元组...将最后的xrandr行更改为xrandr --size "${x}x${y}" &&似乎可以解决问题,但然后我会得到Size 1400x1400 not found in available modes - nmz787
@nmz787 抱歉,是 screen,不是 sscreen。那是一个打字错误。 - Nicholas Sushkin
在我的Debian 12.2上,需要修复这个脚本的两个问题:
  • $(cvt "$x" "$y" 2>/dev/null | tail -n1) ... 只取最后一行。
  • if [[ $mode =~ Modeline\ (.*)$ ]] ... 去掉引号以启用正则表达式。
- undefined

3
也许这是我发过的最无知的回答,但还是来试试:使用TigerVNC客户端/查看器,在选项的屏幕选项卡下检查“将远程会话调整为本地窗口大小”。我不知道$%#@ TigerVNC客户端告诉远程vncserver或xrandr或Xvnc或gnome或...但当我更改TigerVNC客户端窗口时,它会调整大小。我的设置:在CentOS 6上运行Tiger VNC服务器。托管GNOME桌面。(也适用于RHEL 6.6)Windows某些版本具有Tiger VNC客户端。使用此设置,分辨率会根据客户端窗口的大小而更改,无论其大小如何,它都不会缩放,而是实际的分辨率更改(我可以在xrandr输出中看到新的分辨率)。我尝试了所有可能将新分辨率添加到xrandr中的方法,但均无果,最终出现“xrandr:无法获取默认输出的伽马大小”错误。目前对我有效的版本(尽管我以前没有遇到任何版本的问题,我只需使用“yum install gnome- * tigervnc-server”安装最新版本即可正常工作)。
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.

你使用的TigerVNC版本是什么,客户端和服务器都是哪个版本?我今天尝试过,但它并没有自动调整大小。我的环境是RHEL 6.2,运行的是Xvnc TigerVNC 1.1.0作为服务器和vncviewer-1.4.3.exe客户端。 - cdwilson
@cdwilson 希望你尝试在全屏模式下使用客户端。已添加版本。祝一切顺利。 - Kashyap
结果发现1.1.0版本与我们工作机器上运行的某些内容不兼容。从我的$HOME目录中运行最新的1.4.3版本可以正常工作。https://github.com/TigerVNC/tigervnc/issues/155 - cdwilson
确认:openSuse 15.1,GDM,KDE Plasma,TigerVNC客户端1.9.0。我的远程桌面分辨率遵循客户端窗口的任何大小、任何疯狂的即兴分辨率和任何宽高比,在GDM或KDE中都能完美运行,开箱即用,无需在客户端或服务器上设置任何内容。 - Espinosa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接