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

我使用VNC连接到工作的Linux工作站。 在工作中,我有一个20“的显示器,运行在1600×1200,而在家里,我用我的笔记本电脑,其分辨率为1440×900,如果我把vncserver设置为1440×900,我错过了显示器的很多空间,将其设置为在1600×1200下运行它不适合在笔记本电脑的屏幕上,我必须始终滚动它。

有没有什么好的方法来dynamic调整VNC会话?

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

真正的VNC服务器4.4包括对Xrandr的支持,它允许调整VNC的大小。 启动服务器:

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

然后resize:

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

发现Ubuntu(10.04)附带的vnc4server(4.1.1)已经修补,以支持通过xrandr实时更改分辨率。 不幸的是,该function很难find,因为它是无证的。 所以这里是…

用多个“几何”实例启动服务器,如:

 vnc4server -geometry 1280x1024 -geometry 800x600 

从vncviewer中的terminal(使用:'允许dynamic桌面resize'启用)使用xrandr来查看可用的模式:

 xrandr 

改变分辨率,例如使用:

 xrandr -s 800x600 

而已。

我认为最好的办法是在不同的端口上使用不同的几何体来运行VNC服务器。 我会尝试基于手册页

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

然后你可以连接工作到一个端口,从家到另一个。

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

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

当我在terminal中运行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 

然后,我可以轻松地切换到另一个分辨率(fe切换到1360×768):

 bash> xrandr -s 5 

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

有趣的是没有人回答这个问题。 在TigerVNC中,当你login到会话中。 进入System > Preference > Display从顶部的菜单栏(我使用Cent OS作为我的远程服务器)。 点击分辨率下拉,有各种设置,包括1080p。 select一个你喜欢的。 它将在飞行中改变。

在这里输入图像说明

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

添加到Nathan的(接受的)答案:

我想循环通过决议清单,但没有看到任何东西:

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

它获取当前索引,进入下一个循环,并在错误时循环回0(即结束)

编辑

经过修改以匹配更高版本的xrandr(“*”在行尾并且没有领先的parsing标识符)。

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

由于这个问题首先出现在谷歌我想我会分享一个解决scheme使用TigerVNC这是默认的这些天。

xrandr允许select显示模式(也称为分辨率),但是由于模式线被硬编码,任何附加的模式线(诸如“2560×1600”或“1600×900”)都需要被添加到代码中 。 我认为编写代码的开发人员更聪明,硬编码列表只是一个值的样本。 这导致的结论是,必须有一种方法来添加自定义模式,并且man xrandr确认它。

如果目标是在具有上述分辨率的两台计算机之间共享一个VNC会话,并假定VNC服务器是分辨率为“1600×900”的计算机,则使用该背景:

  1. 使用与物理显示匹配的几何graphics开始VNC会话:

     $ vncserver -geometry 1600x900 :1 
  2. 在“2560×1600”计算机上启动VNC查看器(我更喜欢Remmina)并连接到远程VNC会话:

     host:5901 
  3. 一旦进入VNC会话,启动一个terminal窗口。

  4. 确认新的几何graphics在VNC会话中可用:

     $ 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 

    你会发现屏幕非常小

  5. 列出“2560×1600”分辨率的模式行(参见ArchLinux wiki中的xrandr文章):

     $ 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时间:

     $ 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. 将新的模式行添加到当前的VNC会话中:

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

     VNC-0 connected 1600x900+0+0 0mm x 0mm 
  8. 将新的模式行绑定到当前的VNC虚拟监视器:

     $ xrandr --addmode VNC-0 "2560x1600_60.00" 
  9. 用它:

     $ xrandr -s "2560x1600_60.00" 

我不确定linux,但是在windows下,tightvnc会检测并适应服务器上的分辨率变化。

所以你应该可以把VNC打入工作站,做相当于右击桌面,属性,设置分辨率的任何东西,并让你的客户端vnc窗口相应地调整自己。

另一方面,如果有一种方法可以将现有的窗口从一个X服务器移动到另一个X服务器,那么可以解决这个问题。

我想你可以使用xmove在两个独立的x服务器之间移动窗口。 所以如果这样做的话,至less应该给你一个办法去做你想做的事情,尽pipe不像改变决议那样简单。

@omiday的解决scheme在Xvnc TigerVNC 1.1.0中为我工作,所以我把它压缩成一个bash函数vncsize xy 。 像这样使用它: vncsize 1400 1000 。 它假定xrandr报告VNC输出名称为默认值

 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_]/ } ) xrandr --newmode $newMode xrandr --addmode default "$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 XY pair" return 1 fi } 

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

然而, TightVNC (这是一个VNC客户端和服务器应用程序)可以调整客户端的屏幕大小,即将所有内容缩小一点(类似于graphics程序中的图片大小调整技术)。 这应该工作,如果你不使用太小的字体大小。 VNC理论上应该在不同的VNC应用程序之间兼容。

我有一个简单的想法,像这样:

 #!/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 

那么,我需要一个更好的解决scheme,所有的显示设备在Linux和Similars下

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

我不知道$%#@ TigerVNC客户端告诉远程vncserver或xrandr或Xvnc或gnome或…,但是当我更改TigerVNC客户端窗口时,它会resize。

我的设置:

  • 在CentOS 6上运行的Tiger VNC服务器。托pipeGNOME桌面。 (也适用于RHEL 6.6)
  • Windows与虎VNC客户端的一些版本。

有了这个分辨率的变化,以适应客户端窗口的大小,不pipe它是什么,它不是zooming ,它是实际的分辨率变化(我可以看到新的分辨率在xrandr输出)。

我尽我所能地向xrandr添加新的分辨率,但无济于事,总是以'xrandr: Failed to get size of gamma for output default'错误'xrandr: Failed to get size of gamma for output default'

现在版本与我的工作(虽然我以前没有任何版本的问题,我只是安装最新的使用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. 

伙计们,这真的很简单。

通过ssh到你的pi

执行

 vncserver -geometry 1200x1600 

这将产生一个新的会议:1

通过ipaddress:1连接你的vnc客户端ipaddress:1

而已。

我认为这取决于你的窗口pipe理器。

我是一个Windows用户,所以这可能是一个错误的猜测,但是:是不是有一些在Linux机器上运行的X-Server – 至less在VNC上可能是有趣的目标 – 你可以连接到“ X-客户“?

VNC只是把屏幕上的所有东西都拿出来,然后“通过你的networking传播”。 如果我不完全错误,那么“X”协议应该给你机会使用你的客户端的桌面分辨率。

试一试维基百科上的X-Server ,这可能会给你一个粗略的概述。