更改 linux 中 VNC 会话的分辨率

我使用 VNC 连接到工作中的 Linux 工作站。在工作的时候,我有一个20英寸的显示器,可以运行到1600x1200,而在家里,我使用的是分辨率为1440x900的笔记本电脑。 如果我将 vncserver 设置为1440x900,我会错过显示器上的大量空间,而如果我将其设置为1600x1200,它就不能在笔记本电脑的屏幕上运行,我必须一直滚动它。

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

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

554348 次浏览

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

然而,TightVNC (它是一个 VNC 客户端和服务器应用程序)可以在客户端调整屏幕的大小,即使所有东西都变小一点(类似于图形程序中的图像调整技术)。如果你不使用太小的字体大小,这应该可以工作。从理论上讲,VNC 应该与不同的 VNC 应用程序兼容。

我认为这取决于你的窗口管理员。

我是一个 windows 用户,所以这可能是一个错误的猜测,但是: 有没有一种叫做 X 服务器的东西运行在 linux 机器上——至少在 VNC 可能感兴趣的目标上——你可以连接到“ X-Client”?

VNC 只是获取屏幕上的所有内容并“通过网络传输”。如果我没有完全错误,那么“ X”协议应该给你机会使用你的客户端的桌面分辨率。

在维基百科上尝试一下 X 服务器,可能会给你一个粗略的概述。

我认为最好的办法是在不同的端口上运行具有不同几何结构的 VNC 服务器。我会试试基于 手册

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

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

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

我不确定是否使用 linux,但是在 windows 下,tigtvnc 将检测并适应服务器上的分辨率变化。

因此,你应该能够 VNC 进入工作站,做相当于右键单击桌面,属性,设置分辨率为任何东西,并有您的客户端 VNC 窗口相应调整自己的大小。

另一方面,如果有办法 从一个窗口移动现有的窗口 X 服务器到另一个,这可能解决 问题所在。

我认为您可以使用 Xmove在两个独立的 x 服务器之间移动窗口。因此,如果它工作,这应该至少给你一个方法来做你想要的,虽然不像改变分辨率那么容易。

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

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

然后调整大小:

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

我们发现 Ubuntu (10.04)附带的 vnc4server (4.1.1)打了补丁,也支持通过 xrandr 动态更改分辨率。不幸的是,这个特性很难找到,因为它没有文档记录。就是这样。

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

vnc4server -geometry 1280x1024 -geometry 800x600

从 vncview 中的终端(启用了‘ allow dymanic desk resize’)使用 xrandr 查看可用模式:

xrandr

改变结果,例如使用:

xrandr -s 800x600

就是这样。

对内森(已被接受)的答案补充说明:

我想循环阅读一遍决议清单,但是没有看到任何有关决议的内容:

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
}

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

当我在终端中运行 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 查看器作为客户端,它会自动适应新的分辨率。

我有个简单的想法,大概是这样:

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

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

enter image description here

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

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

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

我的设置:

  • 运行在 CentOS 6上的 Tiger VNC 服务器。托管 GNOME 桌面。(也可用于 RHEL 6.6)
  • Windows 某个版本的 Tiger VNC 客户端。

使用这种方法,分辨率会根据客户机窗口的大小而变化,而且不是 zooming,而是实际的分辨率变化(我可以在 xrandr 输出中看到新的分辨率)。

我尝试了所有我可以添加一个新的分辨率到 xrandr,但无济于事,总是以 '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.

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

但是,xrandr允许选择显示模式(也称为分辨率) 因为模型很难处理 编码 例如“2560x1600”或“1600x900”的任何其他 model 将需要 添加到 代码 . I 认为编写代码的开发人员更聪明、更难 编码列表只是一个值的样本。它导致的结论是 必须有一个方法来添加自定义模型和 man xrandr确认 它。

如果目标是在两个 VNC 之间共享一个 VNC 会话,则使用该背景 使用上述分辨率的计算机,并假设 VNC 服务器是 分辨率为1600x900的电脑:

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

    $ 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
    

    你会发现屏幕很小。

  5. 为下面的代码列出 modeline (参见 ArchLinux wiki 中的 xrandr 文章) “2560x1600”决议:

    $ 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. 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"
    

通过@omiday 实现的解决方案在 Xvnc TigerVNC 1.1.0中对我很有用,所以我将其压缩为一个 bash 函数 大小 x y。像这样使用: 14001000。它适用于任何 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
}

伙计们,这真的很简单。

通过 ssh登录到你的 π

执行

vncserver -geometry 1200x1600

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

ipaddress:1连接您的 vnc 客户端

就是这样。